diff --git a/.gitattributes b/.gitattributes
index 0f4eae9ad3..e1ccbf5e26 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -4,4 +4,5 @@ app/src/asset/pdf/** linguist-vendored
*.yml linguist-language=shell
*.bat linguist-language=shell
*.json linguist-language=shell
-*.mdx linguist-language=astro
\ No newline at end of file
+*.mdx linguist-language=astro
+*.md linguist-language=html
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index fd521540b2..ad2d6fd87e 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -16,10 +16,10 @@ Install pnpm: `npm install -g pnpm`
Set the Electron mirror environment variable and install Electron:
-* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@28.2.4 -D`
+* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@28.2.10 -D`
* Windows:
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
- * `pnpm install electron@28.2.4 -D`
+ * `pnpm install electron@28.2.10 -D`
NPM mirror:
@@ -30,7 +30,7 @@ NPM mirror:
On the desktop, go to the app folder to run:
-* `pnpm install electron@28.2.4 -D`
+* `pnpm install electron@28.2.10 -D`
* `pnpm run dev`
* `pnpm run start`
diff --git a/.github/CONTRIBUTING_zh_CN.md b/.github/CONTRIBUTING_zh_CN.md
index ff343fae2b..5b0596ef2d 100644
--- a/.github/CONTRIBUTING_zh_CN.md
+++ b/.github/CONTRIBUTING_zh_CN.md
@@ -18,11 +18,11 @@
* macOS/Linux:
```
- ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@28.2.4 -D
+ ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@28.2.10 -D
```
* Windows:
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
- * `pnpm install electron@28.2.4 -D`
+ * `pnpm install electron@28.2.10 -D`
NPM 镜像:
@@ -32,7 +32,7 @@ NPM 镜像:
桌面端进入 app 文件夹运行:
-* `pnpm install electron@28.2.4 -D`
+* `pnpm install electron@28.2.10 -D`
* `pnpm run dev`
* `pnpm run start`
diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
index ceabe519fb..be0863215b 100644
--- a/.github/workflows/cd.yml
+++ b/.github/workflows/cd.yml
@@ -83,7 +83,7 @@ jobs:
- name: Gather SiYuan Release Information
id: release_info_siyuan
run: |
- changelog=$(python scripts/parse-changelog.py -t v${{ steps.syv.outputs.value }} -b v${{ steps.sypv.outputs.value }} siyuan-note/siyuan)
+ changelog=$(python scripts/parse-changelog.py -t v${{ steps.syv.outputs.value }} -a "${{ steps.sypv.outputs.value }}" siyuan-note/siyuan)
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "release_body_siyuan<<$EOF" >> $GITHUB_ENV
echo "$changelog" >> $GITHUB_ENV
diff --git a/.gitignore b/.gitignore
index 1d16f5a017..5d9206c1d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,12 +39,7 @@ package-lock.json
yarn.lock
# Sillot extend
-/.history
+**/.history
/app/jestCD
/app/out
/app/dist-electron
-# copy to out for sillot-bridge gitmodule
-/app/package/app
-
-# subtree
-/astro
\ No newline at end of file
diff --git a/.vscode/README.MD b/.vscode/README.MD
new file mode 100644
index 0000000000..e2ed1b7e73
--- /dev/null
+++ b/.vscode/README.MD
@@ -0,0 +1,19 @@
+## extensions.json
+
+`extensions.json` 文件用于在工作区级别推荐所需的 VSCode 扩展(插件)。这些推荐扩展会在打开工作区时显示给用户,以便他们轻松地安装和管理项目特定的工具。
+
+## launch.json
+
+`launch.json` 文件是工作区的调试配置文件,它定义了如何启动和调试项目。通过配置不同的启动配置,开发者可以设置程序参数、环境变量、调试器类型等,以适应不同的调试场景和需求。
+
+## settings.json
+
+`settings.json` 文件允许在工作区级别自定义 VSCode 编辑器的行为。这些设置可以覆盖用户级别的默认设置,允许每个项目根据特定的需求和偏好进行配置,例如代码格式化规则、编辑器选项、终端配置等。
+
+## Sillot.code-profile
+
+`Sillot.code-profile` 是一个特定于汐洛的配置文件,它包含了用户的设置、键盘快捷方式、用户任务和 UI 状态等个性化配置。这个文件不应用于管理扩展(插件),而是应该通过工作区中各个虚拟项目下的 `extensions.json` 文件来统一配置扩展建议。
+
+## Sillot.code-workspace
+
+`Sillot.code-workspace` 文件是汐洛工作区的配置文件,它用于定义工作区范围的结构和设置。这包括对工作区内包含的虚拟项目的引用,以及适用于整个工作区的通用设置。通过工作区文件,可以创建一个多项目环境,并在不同项目之间共享一些共同的配置,同时保持项目特定的设置分离。
diff --git a/.vscode/Sillot.code-profile b/.vscode/Sillot.code-profile
new file mode 100644
index 0000000000..dfc9faf03d
--- /dev/null
+++ b/.vscode/Sillot.code-profile
@@ -0,0 +1 @@
+{"name":"Sillot","settings":"{\"settings\":\"{\\r\\n \\\"tabnine.experimentalAutoImports\\\": true,\\r\\n \\\"editor.rulers\\\": [200],\\r\\n \\\"scf.python3.path\\\": \\\"\\\",\\r\\n \\\"scf.python2.path\\\": \\\"\\\",\\r\\n \\\"workbench.iconTheme\\\": \\\"vscode-great-icons\\\",\\r\\n \\\"editor.suggestSelection\\\": \\\"first\\\",\\r\\n \\\"vsintellicode.modify.editor.suggestSelection\\\": \\\"automaticallyOverrodeDefaultValue\\\",\\r\\n \\\"workbench.editorAssociations\\\": {\\r\\n \\\"*.ipynb\\\": \\\"jupyter-notebook\\\"\\r\\n },\\r\\n \\\"security.workspace.trust.untrustedFiles\\\": \\\"open\\\",\\r\\n \\\"files.autoGuessEncoding\\\": true,\\r\\n \\\"python.pythonPath\\\": \\\"C:\\\\\\\\ProgramData\\\\\\\\Miniconda3\\\\\\\\envs\\\\\\\\sc\\\\\\\\python.exe\\\",\\r\\n \\\"editor.renderControlCharacters\\\": true,\\r\\n \\\"activestate.statePath\\\": \\\"/home/sinlaw/.local/bin/state\\\",\\r\\n \\\"ChineseInputAssistant.InputMethod\\\": \\\"Baidu Sugrec\\\",\\r\\n \\\"redhat.telemetry.enabled\\\": true,\\r\\n \\\"code-runner.runInTerminal\\\": false,\\r\\n \\\"terminal.integrated.defaultProfile.windows\\\": \\\"Windows PowerShell\\\",\\r\\n \\\"terminal.integrated.profiles.windows\\\": {\\r\\n \\\"PowerShell\\\": {\\r\\n \\\"source\\\": \\\"PowerShell\\\",\\r\\n \\\"icon\\\": \\\"terminal-powershell\\\"\\r\\n },\\r\\n \\\"Command Prompt\\\": {\\r\\n \\\"path\\\": [\\r\\n \\\"${env:windir}\\\\\\\\Sysnative\\\\\\\\cmd.exe\\\",\\r\\n \\\"${env:windir}\\\\\\\\System32\\\\\\\\cmd.exe\\\"\\r\\n ],\\r\\n \\\"args\\\": [],\\r\\n \\\"icon\\\": \\\"terminal-cmd\\\"\\r\\n },\\r\\n \\\"Git Bash\\\": {\\r\\n \\\"source\\\": \\\"Git Bash\\\"\\r\\n },\\r\\n \\\"Windows PowerShell\\\": {\\r\\n \\\"path\\\": \\\"C:\\\\\\\\WINDOWS\\\\\\\\Sysnative\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\\"\\r\\n }\\r\\n },\\r\\n \\\"editor.accessibilitySupport\\\": \\\"off\\\",\\r\\n \\\"python.analysis.logLevel\\\": \\\"Warning\\\",\\r\\n \\\"jupyter.allowUnauthorizedRemoteConnection\\\": true,\\r\\n \\\"python.diagnostics.sourceMapsEnabled\\\": true,\\r\\n \\\"jupyter.exportWithOutputEnabled\\\": true,\\r\\n \\\"terminal.integrated.cursorStyle\\\": \\\"line\\\",\\r\\n \\\"terminal.integrated.cursorBlinking\\\": true,\\r\\n \\\"terminal.integrated.cwd\\\": \\\"C:\\\\\\\\\\\",\\r\\n \\\"jupyter.jupyterServerType\\\": \\\"local\\\",\\r\\n \\\"notebook.cellToolbarLocation\\\": {\\r\\n \\\"default\\\": \\\"right\\\",\\r\\n \\\"jupyter-notebook\\\": \\\"left\\\"\\r\\n },\\r\\n \\\"notebook.lineNumbers\\\": \\\"on\\\",\\r\\n \\\"jupyter.askForKernelRestart\\\": false,\\r\\n \\\"editor.fontFamily\\\": \\\"'等距更纱黑体 SC'\\\",\\r\\n \\\"editor.renderWhitespace\\\": \\\"all\\\",\\r\\n \\\"editor.wordWrap\\\": \\\"on\\\",\\r\\n \\\"editor.fontLigatures\\\": true,\\r\\n \\\"diffEditor.codeLens\\\": true,\\r\\n \\\"editor.minimap.showSlider\\\": \\\"always\\\",\\r\\n \\\"jupyter.experiments.optInto\\\": [\\r\\n \\\"__NativeNotebookEditor__\\\"\\r\\n ],\\r\\n \\\"notebook.consolidatedRunButton\\\": true,\\r\\n \\\"editor.acceptSuggestionOnEnter\\\": \\\"off\\\",\\r\\n \\\"faker.locale\\\": \\\"zh_CN\\\",\\r\\n \\\"editor.mouseWheelZoom\\\": true,\\r\\n \\\"editor.padding.bottom\\\": 8,\\r\\n \\\"editor.maxTokenizationLineLength\\\": 3000,\\r\\n \\\"editor.padding.top\\\": 8,\\r\\n \\\"editor.parameterHints.cycle\\\": true,\\r\\n \\\"fenix.repos\\\": [\\r\\n \\\"https://raw.githubusercontent.com/FenixTemplates/Default/master/fenix.json\\\"\\r\\n ],\\r\\n \\\"fenix.runCommands\\\": \\\"ask\\\",\\r\\n \\\"leek-fund.statusBarStock\\\": [\\r\\n \\\"sh000688\\\"\\r\\n ],\\r\\n \\\"superencourager.keyword\\\": \\\"\\\",\\r\\n \\\"superencourager.needTip\\\": true,\\r\\n \\\"superencourager.isGif\\\": true,\\r\\n \\\"z-reader.onlineSite\\\": \\\"起点\\\",\\r\\n \\\"z-reader.encoding\\\": \\\"gbk\\\",\\r\\n \\\"terminal.integrated.letterSpacing\\\": 1,\\r\\n \\\"terminal.integrated.scrollback\\\": 1500,\\r\\n \\\"terminal.integrated.minimumContrastRatio\\\": 7,\\r\\n \\\"terminal.integrated.fontFamily\\\": \\\"'等距更纱黑体 SC Light'\\\",\\r\\n \\\"explorer.confirmDelete\\\": false,\\r\\n \\\"python.analysis.typeCheckingMode\\\": \\\"basic\\\",\\r\\n \\\"livecode.pythonPath\\\": \\\"D:\\\\\\\\S\\\\\\\\anaconda3\\\\\\\\python.exe\\\",\\r\\n \\\"livecode.envFile\\\": \\\"\\\",\\r\\n \\\"livecode.shell_plus\\\": true,\\r\\n \\\"editor.bracketPairColorization.enabled\\\": true,\\r\\n \\\"liveshare.sharedTerminalHeight\\\": 150,\\r\\n \\\"cmake.configureOnOpen\\\": false,\\r\\n \\\"[html]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"vscode.html-language-features\\\"\\r\\n },\\r\\n \\\"editor.linkedEditing\\\": true,\\r\\n \\\"vsicons.dontShowNewVersionMessage\\\": true,\\r\\n \\\"commentTranslate.targetLanguage\\\": \\\"zh-CN\\\",\\r\\n \\\"EnglishChineseDictionary.enableHover\\\": true,\\r\\n \\\"vscode-edge-devtools.mirrorEdits\\\": true,\\r\\n \\\"editor.guides.bracketPairs\\\": true,\\r\\n \\\"vscode-edge-devtools.browserFlavor\\\": \\\"Stable\\\",\\r\\n \\\"[javascript]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\r\\n },\\r\\n \\\"eslint.alwaysShowStatus\\\": true,\\r\\n \\\"standard.enableGlobally\\\": true,\\r\\n \\\"vscode-edge-devtools.webhint\\\": false,\\r\\n \\\"workbench.productIconTheme\\\": \\\"material-product-icons\\\",\\r\\n \\\"vscode-edge-devtools.fallbackRevision\\\": \\\"@22972d25db820838a94def61dc345b1a7e9c095a\\\",\\r\\n \\\"editor.guides.indentation\\\": false,\\r\\n \\\"window.commandCenter\\\": true,\\r\\n \\\"vscode-office.openOutline\\\": true,\\r\\n \\\"[css]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"vscode.css-language-features\\\"\\r\\n },\\r\\n \\\"[json]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\r\\n },\\r\\n \\\"editor.tabSize\\\": 2,\\r\\n \\\"[less]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"vscode.css-language-features\\\"\\r\\n },\\r\\n \\\"[typescript]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\r\\n },\\r\\n \\\"[typescriptreact]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\r\\n },\\r\\n \\\"svelte.enable-ts-plugin\\\": true,\\r\\n \\\"[yaml]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\r\\n },\\r\\n \\\"[jsonc]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\r\\n },\\r\\n \\\"rome_lsp.trace.server\\\": \\\"messages\\\",\\r\\n \\\"[python]\\\": {\\r\\n \\\"editor.formatOnType\\\": true\\r\\n },\\r\\n \\\"editor.fontSize\\\": 16,\\r\\n \\\"jupyter.interactiveWindow.textEditor.executeSelection\\\": true,\\r\\n \\\"file-size.position\\\": \\\"left\\\",\\r\\n \\\"git.confirmSync\\\": false,\\r\\n \\\"javascript.updateImportsOnFileMove.enabled\\\": \\\"always\\\",\\r\\n \\\"vue.features.codeActions.enable\\\": false,\\r\\n \\\"accessibility.signals.terminalBell\\\": {\\r\\n \\\"sound\\\": \\\"on\\\"\\r\\n },\\r\\n \\\"terminal.integrated.enableVisualBell\\\": true,\\r\\n \\\"vscode-office.editorTheme\\\": \\\"Github Dark\\\",\\r\\n \\\"terminal.integrated.env.windows\\\": {\\r\\n \\\"PATH\\\": \\\"${env:PATH}\\\"\\r\\n },\\r\\n \\\"[scss]\\\": {\\r\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\r\\n },\\r\\n \\\"deno.codeLens.implementations\\\": true,\\r\\n \\\"deno.codeLens.references\\\": true,\\r\\n \\\"deno.codeLens.referencesAllFunctions\\\": true,\\r\\n \\\"deno.codeLens.test\\\": true,\\r\\n \\\"deno.lint\\\": false,\\r\\n}\"}","keybindings":"{\"keybindings\":\"[]\",\"platform\":3}","tasks":"{\"tasks\":\"{}\"}","globalState":"{\"storage\":{\"workbench.panel.markers.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.markers.view\\\",\\\"isHidden\\\":false}]\",\"workbench.panel.output.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.output\\\",\\\"isHidden\\\":false}]\",\"terminal.hidden\":\"[{\\\"id\\\":\\\"terminal\\\",\\\"isHidden\\\":false}]\",\"workbench.explorer.views.state.hidden\":\"[{\\\"id\\\":\\\"workbench.explorer.fileView\\\",\\\"isHidden\\\":false,\\\"order\\\":1},{\\\"id\\\":\\\"outline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.explorer.openEditorsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.explorer.emptyView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"timeline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"npm\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"huile8-will-mastering-main\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"treeLocalHistoryExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"commitViewProvider\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"compareCommitViewProvider\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"SonarLint.AllRules\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"SonarLint.IssueLocations\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"leetCodeExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqlite.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.session.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"SCFLocalResource\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"SCFRemoteResource\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"targetTree\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"xmlTreeView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"txtsyntaxHighlightExplore\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"filters\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"zipExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"romLocal\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"romRemote\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"go.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vueComponentPreview\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"denoTasks\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"zhihu-feed\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"zhihu-hotStories\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"zhihu-collection\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"i18n-ally-locales-file-explorer\\\",\\\"isHidden\\\":false}]\",\"workbench.scm.views.state.hidden\":\"[{\\\"id\\\":\\\"workbench.scm.repositories\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.commits\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.repositories\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"gitlens.views.branches\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.remotes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.stashes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.tags\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.contributors\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"gitlens.views.searchAndCompare\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.worktrees\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.commitDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.scm.sync\\\",\\\"isHidden\\\":false}]\",\"workbench.view.search.state.hidden\":\"[{\\\"id\\\":\\\"workbench.view.search\\\",\\\"isHidden\\\":false}]\",\"workbench.activity.pinnedViewlets2\":\"[{\\\"id\\\":\\\"workbench.view.explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":0},{\\\"id\\\":\\\"workbench.view.scm\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":2},{\\\"id\\\":\\\"workbench.view.extension.conflictTreeViewPanel\\\",\\\"pinned\\\":true,\\\"order\\\":32},{\\\"id\\\":\\\"workbench.view.search\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":1},{\\\"id\\\":\\\"workbench.view.extension.github-actions\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":15},{\\\"id\\\":\\\"workbench.view.debug\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":3},{\\\"id\\\":\\\"workbench.view.extension.gitlens\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.remote\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":4},{\\\"id\\\":\\\"workbench.view.extensions\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":4},{\\\"id\\\":\\\"workbench.view.extension.test\\\",\\\"pinned\\\":false,\\\"visible\\\":true,\\\"order\\\":6},{\\\"id\\\":\\\"workbench.view.extension.references-view\\\",\\\"pinned\\\":false,\\\"visible\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.view.extension.node-notebook\\\",\\\"pinned\\\":false,\\\"visible\\\":false,\\\"order\\\":11},{\\\"id\\\":\\\"workbench.view.extension.gitlensPatch\\\",\\\"pinned\\\":true,\\\"order\\\":14},{\\\"id\\\":\\\"workbench.view.extension.gitlensInspect\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.gitpod-view\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":18},{\\\"id\\\":\\\"workbench.view.extension.cmake-view\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":27},{\\\"id\\\":\\\"workbench.view.extension.zhihu-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":30},{\\\"id\\\":\\\"workbench.view.extension.leekFundMenu\\\",\\\"pinned\\\":false,\\\"visible\\\":false,\\\"order\\\":14},{\\\"id\\\":\\\"workbench.view.extension.scf-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":22},{\\\"id\\\":\\\"workbench.view.extension.jupyter\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":26},{\\\"id\\\":\\\"workbench.view.extension.huile8-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":23},{\\\"id\\\":\\\"workbench.view.extension.leetcode\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.PowerShellCommandExplorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":18},{\\\"id\\\":\\\"workbench.view.extension.color_manager_webview_container\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":30},{\\\"id\\\":\\\"workbench.view.extension.tabnine\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":33},{\\\"id\\\":\\\"workbench.view.extension.localHistory\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":35},{\\\"id\\\":\\\"workbench.view.extension.wallaby\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":14},{\\\"id\\\":\\\"workbench.view.extension.browser-preview\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.extension.dockerView\\\",\\\"pinned\\\":false,\\\"visible\\\":true,\\\"order\\\":24},{\\\"id\\\":\\\"workbench.view.extension.lsby_gitee_vscode_plugin\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.kubernetesView\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":15},{\\\"id\\\":\\\"workbench.view.extension.mongoDB\\\",\\\"pinned\\\":false,\\\"visible\\\":true,\\\"order\\\":22},{\\\"id\\\":\\\"workbench.view.extension.treeView\\\",\\\"pinned\\\":false,\\\"visible\\\":true,\\\"order\\\":9},{\\\"id\\\":\\\"workbench.view.extension.weixin-read\\\",\\\"pinned\\\":false,\\\"visible\\\":true,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.lp-shortcut-panel\\\",\\\"pinned\\\":false,\\\"visible\\\":true,\\\"order\\\":21},{\\\"id\\\":\\\"workbench.view.extension.liveshare\\\",\\\"pinned\\\":false,\\\"visible\\\":true,\\\"order\\\":29},{\\\"id\\\":\\\"workbench.view.extension.fenixView\\\",\\\"pinned\\\":false,\\\"visible\\\":true,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.cmake__viewContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":24},{\\\"id\\\":\\\"workbench.view.extension.anes\\\",\\\"pinned\\\":false,\\\"visible\\\":false,\\\"order\\\":14},{\\\"id\\\":\\\"workbench.view.extension.iceworksTimeMaster\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":20},{\\\"id\\\":\\\"workbench.view.extension.pip-manager-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":31},{\\\"id\\\":\\\"workbench.view.extension.tabnine-access\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":32},{\\\"id\\\":\\\"workbench.view.extension.tcb\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":34},{\\\"id\\\":\\\"workbench.view.extension.vscode-edge-devtools-view\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":25},{\\\"id\\\":\\\"workbench.view.extension.package-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.extension.github-pull-requests\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":16},{\\\"id\\\":\\\"workbench.view.extension.github-pull-request\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":17},{\\\"id\\\":\\\"workbench.view.extension.hexExplorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":28},{\\\"id\\\":\\\"workbench.view.extension.chatgpt-vscode-plugin\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":31},{\\\"id\\\":\\\"workbench.view.extension.i18n-ally\\\",\\\"pinned\\\":true,\\\"order\\\":21},{\\\"id\\\":\\\"workbench.view.extension.json-views\\\",\\\"pinned\\\":true,\\\"order\\\":36},{\\\"id\\\":\\\"workbench.panel.chatSidebar\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":100},{\\\"id\\\":\\\"workbench.view.sync\\\",\\\"pinned\\\":true,\\\"visible\\\":false},{\\\"id\\\":\\\"workbench.view.editSessions\\\",\\\"pinned\\\":true,\\\"visible\\\":false},{\\\"id\\\":\\\"userDataProfiles\\\",\\\"pinned\\\":true,\\\"visible\\\":false}]\",\"nps/lastSessionDate\":\"Fri Jun 18 2021\",\"nps/sessionCount\":\"2\",\"workbench.view.debug.state.hidden\":\"[{\\\"id\\\":\\\"workbench.debug.welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.variablesView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.watchExpressionsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.callStackView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.loadedScriptsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.breakPointsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jsBrowserBreakpoints\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jsExcludedCallers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"CppSshTargetsView\\\",\\\"isHidden\\\":false}]\",\"workbench.telemetryOptOutShown\":\"true\",\"workbench.statusbar.hidden\":\"[\\\"status.workspaceTrust.1623352538957\\\",\\\"status.workspaceTrust.1623454594519\\\",\\\"status.workspaceTrust.1623479630015\\\",\\\"status.workspaceTrust.1623483618875\\\",\\\"status.workspaceTrust.1623902080237\\\",\\\"status.workspaceTrust.dc5232201ac5aa5c2f9e79b5cb449c24\\\",\\\"status.workspaceTrust.1624353986409\\\",\\\"status.workspaceTrust.633b3a958139e6bb50ff57be09ed2bde\\\",\\\"status.workspaceTrust.939d16eca3a7f37f99a3f3673a1390e6\\\",\\\"status.workspaceTrust.1624885836723\\\",\\\"status.workspaceTrust.1624996227847\\\",\\\"status.workspaceTrust.1625236573141\\\",\\\"status.workspaceTrust.1625256582321\\\",\\\"status.workspaceTrust.1625480660231\\\",\\\"status.workspaceTrust.1625524133404\\\",\\\"status.workspaceTrust.1625528002281\\\",\\\"status.workspaceTrust.adcc22f61ac240d0199afe46b7b024a4\\\",\\\"status.workspaceTrust.1626185771300\\\",\\\"status.workspaceTrust.1626200588452\\\",\\\"status.workspaceTrust.505b690d0967d77fb4c689a20841e28f\\\",\\\"status.workspaceTrust.38ced751903dfcbe166ec63703145e72\\\",\\\"status.workspaceTrust.1626207626953\\\",\\\"status.workspaceTrust.1626211905202\\\",\\\"status.workspaceTrust.1626307646938\\\",\\\"status.workspaceTrust.1626661449095\\\",\\\"status.workspaceTrust.3cc27ab035d7f82d6d4c1da3523c209c\\\",\\\"status.workspaceTrust.1626678445490\\\",\\\"status.workspaceTrust.1626679020742\\\",\\\"status.workspaceTrust.5a0cf19449e86c81b8018a2d412f7446\\\",\\\"giscafer.leek-fund\\\",\\\"status.feedback\\\",\\\"status.workspaceTrust.1627021566433\\\",\\\"aooiu.z-reader\\\",\\\"status.workspaceTrust.60239e37959e5c6f86ee449c6c572ae5\\\",\\\"status.workspaceTrust.1627179407133\\\",\\\"status.workspaceTrust.5645bf3302891f64cd43ab53335a4123\\\",\\\"RUNNERUP.super-encourager\\\",\\\"status.workspaceTrust.1628408410059\\\",\\\"status.workspaceTrust.71e22898383b43d1640e4f2c481d1647\\\",\\\"status.workspaceTrust.48cf787a75f0c7b18eb3d1cf1081ad65\\\",\\\"status.workspaceTrust.58ed488de7027c6728528455a6a3884d\\\",\\\"status.workspaceTrust.ce24c10a9bfe30a7cfaabd3b343e2954\\\",\\\"status.workspaceTrust.1628852497973\\\",\\\"status.workspaceTrust.1628852571990\\\",\\\"status.workspaceTrust.1629942173651\\\",\\\"status.workspaceTrust.1630332995559\\\",\\\"status.workspaceTrust.1630333080665\\\",\\\"status.workspaceTrust.1630333907268\\\",\\\"status.workspaceTrust.1630333965926\\\",\\\"status.workspaceTrust.63f1c8905e56b27f499b4526cdad6f08\\\",\\\"status.workspaceTrust.1630334571189\\\",\\\"status.workspaceTrust.1630334909370\\\",\\\"status.workspaceTrust.1630338959865\\\",\\\"status.workspaceTrust.1630674146251\\\",\\\"status.workspaceTrust.1630756740479\\\",\\\"status.workspaceTrust.1630757910151\\\",\\\"status.workspaceTrust.1630764561399\\\",\\\"status.workspaceTrust.0d9cf2620b18e3205c626e3f39593e81\\\",\\\"status.workspaceTrust.1630835097939\\\",\\\"status.workspaceTrust.1630841780765\\\",\\\"status.workspaceTrust.1630867013078\\\",\\\"status.workspaceTrust.1632197431368\\\",\\\"status.workspaceTrust.1635156133256\\\",\\\"status.workspaceTrust.1635929364220\\\",\\\"status.workspaceTrust.2dcfa7907f668a5546e2c79456241630\\\",\\\"status.workspaceTrust.1636222228378\\\",\\\"status.workspaceTrust.1637828029111\\\",\\\"status.workspaceTrust.1637906339475\\\",\\\"status.workspaceTrust.889b75fa9869034beb2468fd880b9539\\\",\\\"status.workspaceTrust.1637940030941\\\",\\\"status.workspaceTrust.1638000964016\\\",\\\"status.workspaceTrust.094471e519ddbc1bceb44520504a481c\\\",\\\"status.workspaceTrust.7a4e5d763046ada5ec661fb777f7cf4b\\\",\\\"status.workspaceTrust.1638015552579\\\",\\\"status.workspaceTrust.1638020234922\\\",\\\"status.workspaceTrust.1638097654774\\\",\\\"status.workspaceTrust.1638978466814\\\",\\\"status.workspaceTrust.1639017168847\\\",\\\"status.workspaceTrust.1639048642578\\\",\\\"status.workspaceTrust.608b2f0352d2c4fa783121584dae377f\\\",\\\"status.workspaceTrust.33439b7f55c877b3309758df49c58586\\\",\\\"status.workspaceTrust.c98b6bcbc8226f8d2ec9a93cdec74647\\\",\\\"status.workspaceTrust.7320a14487195d5cda4313faea12568e\\\",\\\"status.workspaceTrust.027d3b2b06f5de02900121ec21af3f3a\\\",\\\"status.workspaceTrust.1639562751010\\\",\\\"status.workspaceTrust.1639563483036\\\",\\\"status.workspaceTrust.62fbce400be5b74378cf88c8797990de\\\",\\\"status.workspaceTrust.1640089492692\\\",\\\"status.workspaceTrust.0c39db304202307a378e67d8c81aa060\\\",\\\"status.workspaceTrust.1640509017957\\\",\\\"status.workspaceTrust.1640511230466\\\",\\\"status.workspaceTrust.1640511340020\\\",\\\"status.workspaceTrust.1640512464257\\\",\\\"status.workspaceTrust.1640513178977\\\",\\\"status.workspaceTrust.1640513687067\\\",\\\"status.workspaceTrust.1640526190856\\\",\\\"status.workspaceTrust.1640529579068\\\",\\\"status.workspaceTrust.1640541599377\\\",\\\"status.workspaceTrust.1640575396276\\\",\\\"status.workspaceTrust.1640598974223\\\",\\\"status.workspaceTrust.1640599010520\\\",\\\"status.workspaceTrust.1648101991410\\\",\\\"status.workspaceTrust.817be0fabc9989efda2813a666229bee\\\",\\\"status.workspaceTrust.d09e61cf45a91ec133d06faaaa188360\\\",\\\"status.workspaceTrust.1655877027072\\\",\\\"status.workspaceTrust.c43058ef042a50bf125cf86fd1485c5e\\\",\\\"status.workspaceTrust.14aa91680f2b5b2732907a21511d8aab\\\",\\\"status.workspaceTrust.1661979043358\\\",\\\"status.workspaceTrust.1662868123520\\\",\\\"status.workspaceTrust.b23783ab02df8435726acac46dae8628\\\",\\\"status.workspaceTrust.e0e83d7d22649506f6b82808da7eb6ea\\\",\\\"status.workspaceTrust.1671036074203\\\",\\\"status.workspaceTrust.1671074572853\\\",\\\"status.workspaceTrust.1672443015954\\\",\\\"status.workspaceTrust.1672628445238\\\",\\\"status.workspaceTrust.1673162901543\\\",\\\"status.workspaceTrust.1673164463055\\\",\\\"status.workspaceTrust.4bd5d3e1c19b5abfcfb6feb653cfaa5e\\\",\\\"status.workspaceTrust.1673450205317\\\",\\\"status.workspaceTrust.1673451101949\\\",\\\"status.workspaceTrust.267bc9d946eb074c703378c664eddbac\\\",\\\"status.workspaceTrust.1673756155788\\\",\\\"status.workspaceTrust.1673920784101\\\",\\\"status.workspaceTrust.1673970959728\\\",\\\"status.workspaceTrust.1674078645571\\\",\\\"status.workspaceTrust.1674082872037\\\",\\\"status.workspaceTrust.1674109705936\\\",\\\"status.workspaceTrust.1674607949632\\\",\\\"status.workspaceTrust.1674614778568\\\",\\\"status.workspaceTrust.1674615324342\\\",\\\"status.workspaceTrust.1674615349945\\\",\\\"status.workspaceTrust.1674615365512\\\",\\\"status.workspaceTrust.1674700380428\\\",\\\"status.workspaceTrust.4cd9861c982c17aa129dd648839011a5\\\",\\\"status.workspaceTrust.afc6dcee1f8308bdc438b19721fa1162\\\",\\\"status.workspaceTrust.c46b1b15a9f8381753fdcfae18c35bf7\\\",\\\"status.workspaceTrust.1674822490115\\\",\\\"status.workspaceTrust.1674979758073\\\",\\\"status.workspaceTrust.1675014377996\\\",\\\"status.workspaceTrust.1675015265546\\\",\\\"tencentcloud.cloudbase-toolkit\\\",\\\"TabNine.tabnine-vscode\\\",\\\"adobe.xd\\\",\\\"golang.go.Go\\\",\\\"status.workspaceTrust.8cb7a39938794507ef3d3ae2ad88a89f\\\",\\\"status.workspaceTrust.2b888e9a2e9010fbbb6eea619e97bbf4\\\",\\\"status.workspaceTrust.7bf3e7201180e835fa56b4a7eb6e25a0\\\",\\\"status.workspaceTrust.1675766842992\\\",\\\"status.workspaceTrust.be7c4458132c2b19175d81115c6b0ce5\\\",\\\"status.workspaceTrust.1675948947477\\\",\\\"status.workspaceTrust.94c5296b2cb9e23b68ce27918d24811d\\\",\\\"status.workspaceTrust.1675987450919\\\",\\\"status.workspaceTrust.5d455cd977e317aaef8146de01b0aaaa\\\",\\\"status.workspaceTrust.d1f577a9426faf8d1ad8118e12e6ecd2\\\",\\\"status.workspaceTrust.cfb66e96d622151714399f053282b774\\\",\\\"status.workspaceTrust.b38f0ca1b4e97c531842b3089e43c230\\\",\\\"status.workspaceTrust.1676529816689\\\",\\\"status.workspaceTrust.9bc2c4d87cf788b88d1dcf4a72e5bea0\\\",\\\"status.workspaceTrust.4cfcdc1ba4f64b2c32a52a5458faad1c\\\",\\\"status.workspaceTrust.881f7c8fd2a375a15822bbf4f9b08971\\\",\\\"status.workspaceTrust.1677116289701\\\",\\\"status.workspaceTrust.62bd5b078dfe27ae570d603f2257d698\\\",\\\"status.workspaceTrust.a23579360849201ed10c87392e9d4faf\\\",\\\"status.workspaceTrust.1677465768773\\\",\\\"status.workspaceTrust.1677465791730\\\",\\\"status.workspaceTrust.1677473099182\\\",\\\"status.workspaceTrust.1677557213629\\\",\\\"status.workspaceTrust.5f7180a213b4a87b4d5e6e422c6d4ccf\\\",\\\"status.workspaceTrust.bd6c2b10de52a7cd52eb87aa25a8d28c\\\",\\\"status.workspaceTrust.09828e4a24d9f51262492e50161ffd2d\\\",\\\"status.workspaceTrust.bd790b8a75f31bac8571e7272868250b\\\",\\\"status.workspaceTrust.b104b451ea49008c1f2823beaefcc0c7\\\",\\\"status.workspaceTrust.bab404ca1574ae1bc31ba062b742e0bc\\\",\\\"status.workspaceTrust.2ec801f91ed43edeb2e153ed0a5267a3\\\",\\\"status.workspaceTrust.1677667133007\\\",\\\"status.workspaceTrust.1677667369157\\\",\\\"status.workspaceTrust.1677741270322\\\",\\\"status.workspaceTrust.e0f7080e7055d70d981a1f87b0e7db5a\\\",\\\"status.workspaceTrust.6d1d017ddbae50084603a0043ff10cce\\\",\\\"status.workspaceTrust.b00c48b4abc822afa693622e7f9c35b9\\\",\\\"status.workspaceTrust.d3cd049c8a66e2848f81a3d729ee18f0\\\",\\\"status.workspaceTrust.a4ab42a0fc56fe6b29fd5038ff0df038\\\",\\\"status.workspaceTrust.bd4bc754b42e56fd15722dd382c85383\\\",\\\"status.workspaceTrust.c8faf3e9da367fcaff936628807a462f\\\",\\\"status.workspaceTrust.f9de262d1ef9552f27f7798ac600f247\\\",\\\"status.workspaceTrust.dc5dc6b76b1aeb85c409eb8dd0593e0c\\\",\\\"status.workspaceTrust.e5e676c0f7b1753e0ab67cfc0140c5fe\\\",\\\"status.workspaceTrust.9c038ce5e53f3e15c4f80c9355c2457b\\\",\\\"status.workspaceTrust.93f1d5a6d6253a5d8de4fe957a2a89f4\\\",\\\"status.workspaceTrust.95a4da0e638926e3513a96e86fb68791\\\",\\\"status.workspaceTrust.6261bbea03a931e1555b84773caace64\\\",\\\"status.workspaceTrust.aaaeccb6d8ef67b4d90afd162bf449cc\\\",\\\"status.workspaceTrust.15a8268d6e8002fecf9fee255855e460\\\",\\\"status.workspaceTrust.4f034db688778d8ddf17dd644cc2294c\\\",\\\"status.workspaceTrust.9c0d68f71260426e0056d63be7175c75\\\",\\\"status.workspaceTrust.09b699c28daaa353f4a24ef35f0c4c11\\\",\\\"status.workspaceTrust.53bec369636f7b03caed1f538bb70009\\\",\\\"status.workspaceTrust.8126fdadef32eaee2a7ac57fbd59b829\\\",\\\"status.workspaceTrust.bb33856d12fb6b9f9912c808ddfb6211\\\",\\\"status.workspaceTrust.8e2ca22afeda3659220a9b0f9f9af35f\\\",\\\"status.workspaceTrust.1683100816117\\\",\\\"status.workspaceTrust.1683102837301\\\",\\\"status.workspaceTrust.1683102918209\\\",\\\"status.workspaceTrust.1683103044295\\\",\\\"status.workspaceTrust.1683103154355\\\",\\\"status.workspaceTrust.1683986396805\\\",\\\"status.workspaceTrust.1684050670826\\\",\\\"status.workspaceTrust.1684196754870\\\",\\\"status.workspaceTrust.1684658328423\\\",\\\"status.workspaceTrust.1685812369906\\\",\\\"status.workspaceTrust.1685859042767\\\",\\\"status.workspaceTrust.1685859083749\\\",\\\"status.workspaceTrust.1686470489957\\\",\\\"status.workspaceTrust.1686570288583\\\",\\\"status.workspaceTrust.1686862804387\\\",\\\"status.workspaceTrust.1687167342485\\\",\\\"status.workspaceTrust.8a93e05ccd25f9c30e20cd6eb4dabbe9\\\",\\\"status.workspaceTrust.d492d2ad04522890af89954ddf8dcc6b\\\",\\\"status.workspaceTrust.aa7e5ec643da2337e803fec8134cd8de\\\",\\\"status.workspaceTrust.1698839523925\\\",\\\"status.workspaceTrust.29a541a83ee059dadd9732e4e89b1d2f\\\",\\\"status.workspaceTrust.0122759cdfd844de8bf94e803fd91773\\\",\\\"status.workspaceTrust.0d96b2af9d678aad3a41ab24d02dec4f\\\",\\\"status.workspaceTrust.1698949463516\\\",\\\"status.workspaceTrust.1698949495191\\\",\\\"status.workspaceTrust.db4c5ad64feb86290d631ca87f13f5f8\\\",\\\"status.workspaceTrust.ecf832471fd1afb747a754114f8da827\\\",\\\"status.workspaceTrust.670386c93747a43d52bfdb712b542244\\\",\\\"status.workspaceTrust.502929778203fcf60d806d948ab71299\\\",\\\"status.workspaceTrust.1698998627976\\\",\\\"status.workspaceTrust.1699018586452\\\",\\\"status.workspaceTrust.1699057910595\\\",\\\"status.workspaceTrust.1699065009289\\\",\\\"status.workspaceTrust.1699121672161\\\",\\\"status.workspaceTrust.43361da4c937e7610bbc4a617f353722\\\",\\\"status.workspaceTrust.1699152127687\\\",\\\"status.workspaceTrust.1699152585510\\\",\\\"status.workspaceTrust.1699152699108\\\",\\\"status.workspaceTrust.1699154144564\\\",\\\"status.workspaceTrust.1699163097608\\\",\\\"status.workspaceTrust.1699163126918\\\",\\\"status.workspaceTrust.1699163545073\\\",\\\"status.workspaceTrust.1699163557708\\\",\\\"status.workspaceTrust.1699163575828\\\",\\\"status.workspaceTrust.1699163612037\\\",\\\"status.workspaceTrust.1699163634048\\\",\\\"status.workspaceTrust.1700239357859\\\",\\\"status.workspaceTrust.1700810840955\\\",\\\"status.workspaceTrust.1701942155205\\\",\\\"status.workspaceTrust.f93fd611717414a7b811c837d408b30d\\\",\\\"status.workspaceTrust.74b17b0e540e0dae7acbbe1ac943d445\\\",\\\"status.workspaceTrust.2349c296e6303a700ae812687f8b7a7a\\\",\\\"status.workspaceTrust.1706282372696\\\",\\\"status.workspaceTrust.1706283293474\\\",\\\"status.workspaceTrust.1706283494085\\\",\\\"status.workspaceTrust.1706292144072\\\",\\\"status.workspaceTrust.1706295159759\\\",\\\"status.workspaceTrust.1706295179917\\\",\\\"status.workspaceTrust.1706352405662\\\",\\\"status.workspaceTrust.1706352678487\\\",\\\"status.workspaceTrust.1706353648765\\\",\\\"status.workspaceTrust.b4f6405c1fbd71b3eb24cb9deedf715c\\\"]\",\"workbench.panel.pinnedPanels\":\"[{\\\"id\\\":\\\"workbench.panel.output\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":1},{\\\"id\\\":\\\"workbench.panel.testResults\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":3},{\\\"id\\\":\\\"terminal\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":3},{\\\"id\\\":\\\"~remote.forwardedPortsContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":5},{\\\"id\\\":\\\"workbench.view.extension.gitlensPanel\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":6},{\\\"id\\\":\\\"workbench.view.extension.polyglot-notebook-panel\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.view.extension.jupyter-variables\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.dotnet-interactive-panel\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.panel.comments\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":10},{\\\"id\\\":\\\"refactorPreview\\\",\\\"pinned\\\":true,\\\"visible\\\":false},{\\\"id\\\":\\\"workbench.panel.repl\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":2},{\\\"id\\\":\\\"workbench.panel.markers\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":0}]\",\"cpp.1.lastSessionDate\":\"Fri Jun 18 2021\",\"cpp.1.sessionCount\":\"2\",\"java.2.lastSessionDate\":\"Fri Jun 18 2021\",\"java.2.sessionCount\":\"2\",\"javascript.1.lastSessionDate\":\"Fri Jun 18 2021\",\"javascript.1.sessionCount\":\"2\",\"typescript.1.lastSessionDate\":\"Fri Jun 18 2021\",\"typescript.1.sessionCount\":\"2\",\"colorThemeData\":\"{\\\"id\\\":\\\"vs-dark vscode-theme-defaults-themes-dark_modern-json\\\",\\\"label\\\":\\\"现代深色\\\",\\\"settingsId\\\":\\\"Default Dark Modern\\\",\\\"themeTokenColors\\\":[{\\\"settings\\\":{\\\"foreground\\\":\\\"#D4D4D4\\\"},\\\"scope\\\":[\\\"meta.embedded\\\",\\\"source.groovy.embedded\\\",\\\"string meta.image.inline.markdown\\\",\\\"variable.legacy.builtin.python\\\"]},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"italic\\\"},\\\"scope\\\":\\\"emphasis\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\"},\\\"scope\\\":\\\"strong\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#000080\\\"},\\\"scope\\\":\\\"header\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6A9955\\\"},\\\"scope\\\":\\\"comment\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"constant.language\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":[\\\"constant.numeric\\\",\\\"variable.other.enummember\\\",\\\"keyword.operator.plus.exponent\\\",\\\"keyword.operator.minus.exponent\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#646695\\\"},\\\"scope\\\":\\\"constant.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"entity.name.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":[\\\"entity.name.tag.css\\\",\\\"entity.name.tag.less\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"entity.other.attribute-name\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":[\\\"entity.other.attribute-name.class.css\\\",\\\"source.css entity.other.attribute-name.class\\\",\\\"entity.other.attribute-name.id.css\\\",\\\"entity.other.attribute-name.parent-selector.css\\\",\\\"entity.other.attribute-name.parent.less\\\",\\\"source.css entity.other.attribute-name.pseudo-class\\\",\\\"entity.other.attribute-name.pseudo-element.css\\\",\\\"source.css.less entity.other.attribute-name.id\\\",\\\"entity.other.attribute-name.scss\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#f44747\\\"},\\\"scope\\\":\\\"invalid\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"underline\\\"},\\\"scope\\\":\\\"markup.underline\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\",\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.bold\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\",\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.heading\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"italic\\\"},\\\"scope\\\":\\\"markup.italic\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"strikethrough\\\"},\\\"scope\\\":\\\"markup.strikethrough\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"markup.inserted\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"markup.deleted\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.changed\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6A9955\\\"},\\\"scope\\\":\\\"punctuation.definition.quote.begin.markdown\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6796e6\\\"},\\\"scope\\\":\\\"punctuation.definition.list.begin.markdown\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"markup.inline.raw\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#808080\\\"},\\\"scope\\\":\\\"punctuation.definition.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"meta.preprocessor\\\",\\\"entity.name.function.preprocessor\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"meta.preprocessor.string\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"meta.preprocessor.numeric\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"meta.structure.dictionary.key.python\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"meta.diff.header\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"storage\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"storage.type\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"storage.modifier\\\",\\\"keyword.operator.noexcept\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":[\\\"string\\\",\\\"meta.embedded.assembly\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"string.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"string.value\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d16969\\\"},\\\"scope\\\":\\\"string.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"punctuation.definition.template-expression.begin\\\",\\\"punctuation.definition.template-expression.end\\\",\\\"punctuation.section.embedded\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":[\\\"meta.template.expression\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":[\\\"support.type.vendored.property-name\\\",\\\"support.type.property-name\\\",\\\"source.css variable\\\",\\\"source.coffee.embedded\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"keyword\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"keyword.control\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":\\\"keyword.operator\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"keyword.operator.new\\\",\\\"keyword.operator.expression\\\",\\\"keyword.operator.cast\\\",\\\"keyword.operator.sizeof\\\",\\\"keyword.operator.alignof\\\",\\\"keyword.operator.typeid\\\",\\\"keyword.operator.alignas\\\",\\\"keyword.operator.instanceof\\\",\\\"keyword.operator.logical.python\\\",\\\"keyword.operator.wordlike\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"keyword.other.unit\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"punctuation.section.embedded.begin.php\\\",\\\"punctuation.section.embedded.end.php\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"support.function.git-rebase\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"constant.sha.git-rebase\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":[\\\"storage.modifier.import.java\\\",\\\"variable.language.wildcard.java\\\",\\\"storage.modifier.package.java\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"variable.language\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#DCDCAA\\\"},\\\"scope\\\":[\\\"entity.name.function\\\",\\\"support.function\\\",\\\"support.constant.handlebars\\\",\\\"source.powershell variable.other.member\\\",\\\"entity.name.operator.custom-literal\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4EC9B0\\\"},\\\"scope\\\":[\\\"support.class\\\",\\\"support.type\\\",\\\"entity.name.type\\\",\\\"entity.name.namespace\\\",\\\"entity.other.attribute\\\",\\\"entity.name.scope-resolution\\\",\\\"entity.name.class\\\",\\\"storage.type.numeric.go\\\",\\\"storage.type.byte.go\\\",\\\"storage.type.boolean.go\\\",\\\"storage.type.string.go\\\",\\\"storage.type.uintptr.go\\\",\\\"storage.type.error.go\\\",\\\"storage.type.rune.go\\\",\\\"storage.type.cs\\\",\\\"storage.type.generic.cs\\\",\\\"storage.type.modifier.cs\\\",\\\"storage.type.variable.cs\\\",\\\"storage.type.annotation.java\\\",\\\"storage.type.generic.java\\\",\\\"storage.type.java\\\",\\\"storage.type.object.array.java\\\",\\\"storage.type.primitive.array.java\\\",\\\"storage.type.primitive.java\\\",\\\"storage.type.token.java\\\",\\\"storage.type.groovy\\\",\\\"storage.type.annotation.groovy\\\",\\\"storage.type.parameters.groovy\\\",\\\"storage.type.generic.groovy\\\",\\\"storage.type.object.array.groovy\\\",\\\"storage.type.primitive.array.groovy\\\",\\\"storage.type.primitive.groovy\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4EC9B0\\\"},\\\"scope\\\":[\\\"meta.type.cast.expr\\\",\\\"meta.type.new.expr\\\",\\\"support.constant.math\\\",\\\"support.constant.dom\\\",\\\"support.constant.json\\\",\\\"entity.other.inherited-class\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#C586C0\\\"},\\\"scope\\\":[\\\"keyword.control\\\",\\\"source.cpp keyword.operator.new\\\",\\\"keyword.operator.delete\\\",\\\"keyword.other.using\\\",\\\"keyword.other.directive.using\\\",\\\"keyword.other.operator\\\",\\\"entity.name.operator\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9CDCFE\\\"},\\\"scope\\\":[\\\"variable\\\",\\\"meta.definition.variable.name\\\",\\\"support.variable\\\",\\\"entity.name.variable\\\",\\\"constant.other.placeholder\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4FC1FF\\\"},\\\"scope\\\":[\\\"variable.other.constant\\\",\\\"variable.other.enummember\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9CDCFE\\\"},\\\"scope\\\":[\\\"meta.object-literal.key\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#CE9178\\\"},\\\"scope\\\":[\\\"support.constant.property-value\\\",\\\"support.constant.font-name\\\",\\\"support.constant.media-type\\\",\\\"support.constant.media\\\",\\\"constant.other.color.rgb-value\\\",\\\"constant.other.rgb-value\\\",\\\"support.constant.color\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#CE9178\\\"},\\\"scope\\\":[\\\"punctuation.definition.group.regexp\\\",\\\"punctuation.definition.group.assertion.regexp\\\",\\\"punctuation.definition.character-class.regexp\\\",\\\"punctuation.character.set.begin.regexp\\\",\\\"punctuation.character.set.end.regexp\\\",\\\"keyword.operator.negation.regexp\\\",\\\"support.other.parenthesis.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d16969\\\"},\\\"scope\\\":[\\\"constant.character.character-class.regexp\\\",\\\"constant.other.character-class.set.regexp\\\",\\\"constant.other.character-class.regexp\\\",\\\"constant.character.set.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#DCDCAA\\\"},\\\"scope\\\":[\\\"keyword.operator.or.regexp\\\",\\\"keyword.control.anchor.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":\\\"keyword.operator.quantifier.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"constant.character\\\",\\\"constant.other.option\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":\\\"constant.character.escape\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#C8C8C8\\\"},\\\"scope\\\":\\\"entity.name.label\\\"}],\\\"semanticTokenRules\\\":[{\\\"_selector\\\":\\\"newOperator\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#d4d4d4\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"stringLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#ce9178\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"customLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#d4d4d4\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"numberLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#b5cea8\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"newOperator\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#c586c0\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"stringLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#ce9178\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"customLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#dcdcaa\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"numberLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#b5cea8\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}}],\\\"extensionData\\\":{\\\"_extensionId\\\":\\\"vscode.theme-defaults\\\",\\\"_extensionIsBuiltin\\\":true,\\\"_extensionName\\\":\\\"theme-defaults\\\",\\\"_extensionPublisher\\\":\\\"vscode\\\"},\\\"themeSemanticHighlighting\\\":true,\\\"colorMap\\\":{\\\"checkbox.border\\\":\\\"#3c3c3c\\\",\\\"editor.background\\\":\\\"#1f1f1f\\\",\\\"editor.foreground\\\":\\\"#cccccc\\\",\\\"editor.inactiveSelectionBackground\\\":\\\"#3a3d41\\\",\\\"editorIndentGuide.background1\\\":\\\"#404040\\\",\\\"editorIndentGuide.activeBackground1\\\":\\\"#707070\\\",\\\"editor.selectionHighlightBackground\\\":\\\"#add6ff26\\\",\\\"list.dropBackground\\\":\\\"#383b3d\\\",\\\"activityBarBadge.background\\\":\\\"#0078d4\\\",\\\"sideBarTitle.foreground\\\":\\\"#cccccc\\\",\\\"input.placeholderForeground\\\":\\\"#989898\\\",\\\"menu.background\\\":\\\"#1f1f1f\\\",\\\"menu.foreground\\\":\\\"#cccccc\\\",\\\"menu.separatorBackground\\\":\\\"#454545\\\",\\\"menu.border\\\":\\\"#454545\\\",\\\"statusBarItem.remoteForeground\\\":\\\"#ffffff\\\",\\\"statusBarItem.remoteBackground\\\":\\\"#0078d4\\\",\\\"ports.iconRunningProcessForeground\\\":\\\"#369432\\\",\\\"sideBarSectionHeader.background\\\":\\\"#181818\\\",\\\"sideBarSectionHeader.border\\\":\\\"#2b2b2b\\\",\\\"tab.lastPinnedBorder\\\":\\\"#cccccc33\\\",\\\"list.activeSelectionIconForeground\\\":\\\"#ffffff\\\",\\\"terminal.inactiveSelectionBackground\\\":\\\"#3a3d41\\\",\\\"widget.border\\\":\\\"#313131\\\",\\\"actionBar.toggledBackground\\\":\\\"#383a49\\\",\\\"activityBar.activeBorder\\\":\\\"#0078d4\\\",\\\"activityBar.background\\\":\\\"#181818\\\",\\\"activityBar.border\\\":\\\"#2b2b2b\\\",\\\"activityBar.foreground\\\":\\\"#d7d7d7\\\",\\\"activityBar.inactiveForeground\\\":\\\"#868686\\\",\\\"activityBarBadge.foreground\\\":\\\"#ffffff\\\",\\\"badge.background\\\":\\\"#616161\\\",\\\"badge.foreground\\\":\\\"#f8f8f8\\\",\\\"button.background\\\":\\\"#0078d4\\\",\\\"button.border\\\":\\\"#ffffff12\\\",\\\"button.foreground\\\":\\\"#ffffff\\\",\\\"button.hoverBackground\\\":\\\"#026ec1\\\",\\\"button.secondaryBackground\\\":\\\"#313131\\\",\\\"button.secondaryForeground\\\":\\\"#cccccc\\\",\\\"button.secondaryHoverBackground\\\":\\\"#3c3c3c\\\",\\\"chat.slashCommandBackground\\\":\\\"#34414b\\\",\\\"chat.slashCommandForeground\\\":\\\"#40a6ff\\\",\\\"checkbox.background\\\":\\\"#313131\\\",\\\"debugToolBar.background\\\":\\\"#181818\\\",\\\"descriptionForeground\\\":\\\"#9d9d9d\\\",\\\"dropdown.background\\\":\\\"#313131\\\",\\\"dropdown.border\\\":\\\"#3c3c3c\\\",\\\"dropdown.foreground\\\":\\\"#cccccc\\\",\\\"dropdown.listBackground\\\":\\\"#1f1f1f\\\",\\\"editor.findMatchBackground\\\":\\\"#9e6a03\\\",\\\"editorGroup.border\\\":\\\"#ffffff17\\\",\\\"editorGroupHeader.tabsBackground\\\":\\\"#181818\\\",\\\"editorGroupHeader.tabsBorder\\\":\\\"#2b2b2b\\\",\\\"editorGutter.addedBackground\\\":\\\"#2ea043\\\",\\\"editorGutter.deletedBackground\\\":\\\"#f85149\\\",\\\"editorGutter.modifiedBackground\\\":\\\"#0078d4\\\",\\\"editorLineNumber.activeForeground\\\":\\\"#cccccc\\\",\\\"editorLineNumber.foreground\\\":\\\"#6e7681\\\",\\\"editorOverviewRuler.border\\\":\\\"#010409\\\",\\\"editorWidget.background\\\":\\\"#202020\\\",\\\"errorForeground\\\":\\\"#f85149\\\",\\\"focusBorder\\\":\\\"#0078d4\\\",\\\"foreground\\\":\\\"#cccccc\\\",\\\"icon.foreground\\\":\\\"#cccccc\\\",\\\"input.background\\\":\\\"#313131\\\",\\\"input.border\\\":\\\"#3c3c3c\\\",\\\"input.foreground\\\":\\\"#cccccc\\\",\\\"inputOption.activeBackground\\\":\\\"#2489db82\\\",\\\"inputOption.activeBorder\\\":\\\"#2488db\\\",\\\"keybindingLabel.foreground\\\":\\\"#cccccc\\\",\\\"notificationCenterHeader.background\\\":\\\"#1f1f1f\\\",\\\"notificationCenterHeader.foreground\\\":\\\"#cccccc\\\",\\\"notifications.background\\\":\\\"#1f1f1f\\\",\\\"notifications.border\\\":\\\"#2b2b2b\\\",\\\"notifications.foreground\\\":\\\"#cccccc\\\",\\\"panel.background\\\":\\\"#181818\\\",\\\"panel.border\\\":\\\"#2b2b2b\\\",\\\"panelInput.border\\\":\\\"#2b2b2b\\\",\\\"panelTitle.activeBorder\\\":\\\"#0078d4\\\",\\\"panelTitle.activeForeground\\\":\\\"#cccccc\\\",\\\"panelTitle.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"peekViewEditor.background\\\":\\\"#1f1f1f\\\",\\\"peekViewEditor.matchHighlightBackground\\\":\\\"#bb800966\\\",\\\"peekViewResult.background\\\":\\\"#1f1f1f\\\",\\\"peekViewResult.matchHighlightBackground\\\":\\\"#bb800966\\\",\\\"pickerGroup.border\\\":\\\"#3c3c3c\\\",\\\"progressBar.background\\\":\\\"#0078d4\\\",\\\"quickInput.background\\\":\\\"#222222\\\",\\\"quickInput.foreground\\\":\\\"#cccccc\\\",\\\"settings.dropdownBackground\\\":\\\"#313131\\\",\\\"settings.dropdownBorder\\\":\\\"#3c3c3c\\\",\\\"settings.headerForeground\\\":\\\"#ffffff\\\",\\\"settings.modifiedItemIndicator\\\":\\\"#bb800966\\\",\\\"sideBar.background\\\":\\\"#181818\\\",\\\"sideBar.border\\\":\\\"#2b2b2b\\\",\\\"sideBar.foreground\\\":\\\"#cccccc\\\",\\\"sideBarSectionHeader.foreground\\\":\\\"#cccccc\\\",\\\"statusBar.background\\\":\\\"#181818\\\",\\\"statusBar.border\\\":\\\"#2b2b2b\\\",\\\"statusBar.debuggingBackground\\\":\\\"#0078d4\\\",\\\"statusBar.debuggingForeground\\\":\\\"#ffffff\\\",\\\"statusBar.focusBorder\\\":\\\"#0078d4\\\",\\\"statusBar.foreground\\\":\\\"#cccccc\\\",\\\"statusBar.noFolderBackground\\\":\\\"#1f1f1f\\\",\\\"statusBarItem.focusBorder\\\":\\\"#0078d4\\\",\\\"statusBarItem.prominentBackground\\\":\\\"#6e768166\\\",\\\"tab.activeBackground\\\":\\\"#1f1f1f\\\",\\\"tab.activeBorder\\\":\\\"#1f1f1f\\\",\\\"tab.activeBorderTop\\\":\\\"#0078d4\\\",\\\"tab.activeForeground\\\":\\\"#ffffff\\\",\\\"tab.border\\\":\\\"#2b2b2b\\\",\\\"tab.hoverBackground\\\":\\\"#1f1f1f\\\",\\\"tab.inactiveBackground\\\":\\\"#181818\\\",\\\"tab.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"tab.unfocusedActiveBorder\\\":\\\"#1f1f1f\\\",\\\"tab.unfocusedActiveBorderTop\\\":\\\"#2b2b2b\\\",\\\"tab.unfocusedHoverBackground\\\":\\\"#1f1f1f\\\",\\\"terminal.foreground\\\":\\\"#cccccc\\\",\\\"terminal.tab.activeBorder\\\":\\\"#0078d4\\\",\\\"textBlockQuote.background\\\":\\\"#2b2b2b\\\",\\\"textBlockQuote.border\\\":\\\"#616161\\\",\\\"textCodeBlock.background\\\":\\\"#2b2b2b\\\",\\\"textLink.activeForeground\\\":\\\"#4daafc\\\",\\\"textLink.foreground\\\":\\\"#4daafc\\\",\\\"textPreformat.foreground\\\":\\\"#d0d0d0\\\",\\\"textPreformat.background\\\":\\\"#3c3c3c\\\",\\\"textSeparator.foreground\\\":\\\"#21262d\\\",\\\"titleBar.activeBackground\\\":\\\"#181818\\\",\\\"titleBar.activeForeground\\\":\\\"#cccccc\\\",\\\"titleBar.border\\\":\\\"#2b2b2b\\\",\\\"titleBar.inactiveBackground\\\":\\\"#1f1f1f\\\",\\\"titleBar.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"welcomePage.tileBackground\\\":\\\"#2b2b2b\\\",\\\"welcomePage.progress.foreground\\\":\\\"#0078d4\\\"},\\\"watch\\\":false}\",\"workbench.panel.repl.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.repl.view\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extensions.state.hidden\":\"[{\\\"id\\\":\\\"extensions.popularExtensionsList\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extensions.enabledExtensionList\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extensions.disabledExtensionList\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extensions.recommendedList\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extensions.listView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.installed.empty\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.installed\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.workspaceRecommendations\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.popular\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.otherRecommendations\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.enabled\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"workbench.views.extensions.disabled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.marketplace\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchInstalled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchEnabled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchDisabled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchOutdated\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchBuiltin\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinFeatureExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinThemeExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinProgrammingLanguageExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchTrustRequired\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.trustRequiredOnStartExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.trustRequiredOnDemandExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchWorkspaceUnsupported\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.untrustedUnsupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.untrustedPartiallySupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.virtualUnsupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.virtualPartiallySupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.deprecatedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchRecentlyUpdated\\\",\\\"isHidden\\\":false}]\",\"terminal.integrated.showTerminalConfigPrompt\":\"false\",\"memento/gettingStartedService\":\"{\\\"pickColorTheme\\\":{\\\"done\\\":true},\\\"pickColorThemeWeb\\\":{\\\"done\\\":true},\\\"settingsSync\\\":{\\\"done\\\":true},\\\"settingsSyncWeb\\\":{\\\"done\\\":true},\\\"ms-vscode.cpptools#cppWelcome#install.cmake.tools\\\":{\\\"done\\\":true},\\\"installGit\\\":{\\\"done\\\":true},\\\"ms-vscode-remote.remote-wsl#wslWelcome#create.project\\\":{\\\"done\\\":true},\\\"scmClone\\\":{\\\"done\\\":true},\\\"settings\\\":{\\\"done\\\":true},\\\"ms-vscode-remote.remote-wsl#wslWelcome#install.tools\\\":{\\\"done\\\":true},\\\"ms-python.python#pythonWelcome#python.createPythonFile\\\":{\\\"done\\\":true},\\\"ms-python.python#pythonDataScienceWelcome#python.openInteractiveWindow\\\":{\\\"done\\\":true},\\\"ms-toolsai.jupyter#jupyterWelcome#ipynb.newUntitledIpynb\\\":{\\\"done\\\":true},\\\"ms-python.python#pythonWelcome#python.selectInterpreter\\\":{\\\"done\\\":true},\\\"ms-vscode-remote.remote-wsl#wslWalkthrough#create.project\\\":{\\\"done\\\":true},\\\"pickAFolderTask-Other\\\":{\\\"done\\\":true},\\\"ms-python.python#pythonWelcome2#python.createPythonFolder\\\":{\\\"done\\\":true},\\\"ms-python.python#pythonDataScienceWelcome#python.createNewNotebook\\\":{\\\"done\\\":true},\\\"ms-azuretools.vscode-docker#dockerStart#openFolder\\\":{\\\"done\\\":true},\\\"scm\\\":{\\\"done\\\":true},\\\"eamodio.gitlens#gitlens.welcome#gitlens.welcome.sidebars\\\":{\\\"done\\\":true}}\",\"workbench.view.sync.state.hidden\":\"[{\\\"id\\\":\\\"workbench.views.sync.merges\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.sync.remoteActivity\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.sync.machines\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.sync.localActivity\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.huile8-explorer.state.hidden\":\"[{\\\"id\\\":\\\"huile8-will-mastering\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"huile8-mastered\\\",\\\"isHidden\\\":false}]\",\"fileBasedRecommendations/promptedFileExtensions\":\"[\\\"htaccess\\\",\\\"sqlite3\\\",\\\"in\\\",\\\"spec\\\",\\\"pub\\\",\\\"tpl\\\",\\\"nsh\\\"]\",\"workbench.view.extension.leetcode.state.hidden\":\"[{\\\"id\\\":\\\"leetCodeExplorer\\\",\\\"isHidden\\\":false}]\",\"fileBasedRecommendations/promptedRecommendations\":\"{\\\"powershell\\\":[\\\"ms-vscode.powershell\\\"],\\\"django-txt\\\":[\\\"ms-vscode.cmake-tools\\\"],\\\"c\\\":[\\\"ms-vscode.cpptools-extension-pack\\\"],\\\"go\\\":[\\\"golang.go\\\"],\\\"vue\\\":[\\\"vue.volar\\\"],\\\"plaintext\\\":[\\\"svelte.svelte-vscode\\\"],\\\"yaml\\\":[\\\"github.vscode-github-actions\\\"]}\",\"workbench.view.extension.PowerShellCommandExplorer.state.hidden\":\"[{\\\"id\\\":\\\"PowerShellCommands\\\",\\\"isHidden\\\":false}]\",\"commandPalette.mru.cache\":\"{\\\"usesLRU\\\":true,\\\"entries\\\":[{\\\"key\\\":\\\"git.init\\\",\\\"value\\\":1},{\\\"key\\\":\\\"wwm.aligncode\\\",\\\"value\\\":3},{\\\"key\\\":\\\"workbench.action.openWorkspaceSettingsFile\\\",\\\"value\\\":4},{\\\"key\\\":\\\"rainbow-fart.enable\\\",\\\"value\\\":5},{\\\"key\\\":\\\"C_Cpp.ConfigurationEditUI\\\",\\\"value\\\":6},{\\\"key\\\":\\\"C_Cpp.GenerateEditorConfig\\\",\\\"value\\\":7},{\\\"key\\\":\\\"easycpp.createClass\\\",\\\"value\\\":8},{\\\"key\\\":\\\"easycpp.createProject\\\",\\\"value\\\":10},{\\\"key\\\":\\\"dotnet-interactive.newNotebook\\\",\\\"value\\\":30},{\\\"key\\\":\\\"goNotebookKernel.kernel.restart\\\",\\\"value\\\":34},{\\\"key\\\":\\\"typescript-notebook.install\\\",\\\"value\\\":35},{\\\"key\\\":\\\"extension.insert-numerical-series\\\",\\\"value\\\":41},{\\\"key\\\":\\\"random-something.name\\\",\\\"value\\\":42},{\\\"key\\\":\\\"faker.random\\\",\\\"value\\\":51},{\\\"key\\\":\\\"extension.insertRandomHashLarge\\\",\\\"value\\\":52},{\\\"key\\\":\\\"extension.insertRandomNumber\\\",\\\"value\\\":53},{\\\"key\\\":\\\"workbench.action.configureLocale\\\",\\\"value\\\":74},{\\\"key\\\":\\\"jupyter.createnewnotebook\\\",\\\"value\\\":97},{\\\"key\\\":\\\"jupyter.createnewinteractive\\\",\\\"value\\\":190},{\\\"key\\\":\\\"ipynb.newUntitledIpynb\\\",\\\"value\\\":192},{\\\"key\\\":\\\"extension.addJSDoc\\\",\\\"value\\\":329},{\\\"key\\\":\\\"go.tools.install\\\",\\\"value\\\":349},{\\\"key\\\":\\\"i18n-ally.open-editor\\\",\\\"value\\\":468},{\\\"key\\\":\\\"i18n-ally.refresh-usage\\\",\\\"value\\\":469},{\\\"key\\\":\\\"starlight-i18n.start\\\",\\\"value\\\":470},{\\\"key\\\":\\\"JsonLint.launchFromClipBoard\\\",\\\"value\\\":473},{\\\"key\\\":\\\"workbench.action.reloadWindow\\\",\\\"value\\\":510},{\\\"key\\\":\\\"terminalHere.create\\\",\\\"value\\\":512},{\\\"key\\\":\\\"extension-manager.extension.create\\\",\\\"value\\\":513},{\\\"key\\\":\\\"extension-manager.extension.view\\\",\\\"value\\\":515}]}\",\"commandPalette.mru.counter\":\"516\",\"workbench.view.extension.browser-preview.state.hidden\":\"[{\\\"id\\\":\\\"targetTree\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.gitlens.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.updates\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.home\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.contributors\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.workspaces\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.account\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.drafts\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.dockerView.state.hidden\":\"[{\\\"id\\\":\\\"dockerContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerImages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerRegistries\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerNetworks\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerVolumes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.dockerContexts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.help\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.lsby_gitee_vscode_plugin.state.hidden\":\"[{\\\"id\\\":\\\"my_repo\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"my_info\\\",\\\"isHidden\\\":false}]\",\"extensionTips/promptedExecutableTips\":\"{\\\"wsl\\\":[\\\"ms-vscode-remote.remote-wsl\\\"]}\",\"workbench.view.remote.state.hidden\":\"[{\\\"id\\\":\\\"targetsWsl\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"~remote.helpPanel\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"targetsContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"detailsContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"devVolumes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sshHosts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"remoteTargets\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"remoteHub.views.workspaceRepositories\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"github.codespaces.explorer\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"github.codespaces.warnExplorer\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"github.codespaces.performanceExplorer\\\",\\\"isHidden\\\":true}]\",\"remote.explorerType\":\"wsl\",\"workbench.view.extension.kubernetesView.state.hidden\":\"[{\\\"id\\\":\\\"extension.vsKubernetesExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.vsKubernetesHelmRepoExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"kubernetes.cloudExplorer\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.mongoDB.state.hidden\":\"[{\\\"id\\\":\\\"mongoDBConnectionExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"mongoDBPlaygroundsExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"mongoDBHelpExplorer\\\",\\\"isHidden\\\":false}]\",\"workbench.welcomePage.hiddenCategories\":\"[\\\"Setup\\\"]\",\"workbench.view.extension.treeView.state.hidden\":\"[{\\\"id\\\":\\\"local\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"z-reader-menu\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.weixin-read.state.hidden\":\"[{\\\"id\\\":\\\"targetTrees\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.lp-shortcut-panel.state.hidden\":\"[{\\\"id\\\":\\\"lp-shortcut-panel-common-commands\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"lp-shortcut-panel-custom-commands\\\",\\\"isHidden\\\":false}]\",\"ces/skipSurvey\":\"1.57.1\",\"workbench.view.extension.scf-explorer.state.hidden\":\"[{\\\"id\\\":\\\"SCFLocalResource\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"SCFRemoteResource\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.test.state.hidden\":\"[{\\\"id\\\":\\\"workbench.view.testing\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"python_tests\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"test-explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"go.test.profile\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.view.testCoverage\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pw.extension.settingsView\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.liveshare.state.hidden\":\"[{\\\"id\\\":\\\"liveshare.session\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.contacts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.plannedSessions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.help\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.devtools\\\",\\\"isHidden\\\":false}]\",\"microsoft-liaoshanyi@qq.com\":\"[{\\\"id\\\":\\\"ms-vsliveshare.vsliveshare\\\",\\\"name\\\":\\\"Live Share\\\",\\\"allowed\\\":true}]\",\"Comments.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.comments\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.fenixView.state.hidden\":\"[{\\\"id\\\":\\\"fenixQuickCreate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"fenixRepositories\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"fenixEnvironment\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"fenixRecommended\\\",\\\"isHidden\\\":false}]\",\"workbench.welcomePage.walkthroughMetadata\":\"[[\\\"ms-vscode.cpptools#cppWelcome\\\",{\\\"firstSeen\\\":1626320299650,\\\"stepIDs\\\":[\\\"verify.compiler.mac\\\",\\\"verify.compiler.linux\\\",\\\"verify.compiler.windows\\\",\\\"open.project\\\",\\\"setup.intellisense\\\",\\\"run.project.mac\\\",\\\"run.project.linux\\\",\\\"run.project.windows\\\",\\\"install.cmake.tools\\\",\\\"watch.tutorials\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-python.python#pythonWelcome\\\",{\\\"firstSeen\\\":1628408781667,\\\"stepIDs\\\":[\\\"python.installPythonWin\\\",\\\"python.installPythonMac\\\",\\\"python.installPythonLinux\\\",\\\"python.selectInterpreter\\\",\\\"python.runAndDebug\\\",\\\"python.runAndDebugMacOS\\\",\\\"python.learnMore\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-python.python#pythonDataScienceWelcome\\\",{\\\"firstSeen\\\":1628408781667,\\\"stepIDs\\\":[\\\"python.installPython\\\",\\\"python.openFolderMac\\\",\\\"python.openFolder\\\",\\\"python.createNewNotebook\\\",\\\"python.openInteractiveWindow\\\",\\\"python.dataScienceLearnMore\\\"],\\\"manaullyOpened\\\":false}],[\\\"donjayamanne.typescript-notebook#nodeNotebookWalkthrough\\\",{\\\"firstSeen\\\":1630834781184,\\\"stepIDs\\\":[\\\"nodeNotebookRichOutput\\\",\\\"nodeNotebookDebug\\\",\\\"tensorflowVis\\\",\\\"tensorflowBoards\\\",\\\"plotlyGenerate\\\",\\\"danfojsHtmlOutput\\\",\\\"danfojsPlots\\\",\\\"samples\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-azuretools.vscode-docker#dockerStart\\\",{\\\"firstSeen\\\":1636087839384,\\\"stepIDs\\\":[\\\"scaffold\\\",\\\"buildImage\\\",\\\"runContainer\\\",\\\"dockerExplorer\\\",\\\"pushImage\\\",\\\"azDeploy\\\",\\\"learn\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-vscode-remote.remote-wsl#wslWelcome\\\",{\\\"firstSeen\\\":1639140666692,\\\"stepIDs\\\":[\\\"explore.commands\\\",\\\"open.wslwindow\\\",\\\"create.project\\\",\\\"open.project\\\",\\\"linux.environment\\\",\\\"install.tools\\\",\\\"run.debug\\\",\\\"come.back\\\"],\\\"manaullyOpened\\\":false}],[\\\"eamodio.gitlens#gitlens.welcome\\\",{\\\"firstSeen\\\":1655672705795,\\\"stepIDs\\\":[\\\"gitlens.welcome.tutorial\\\",\\\"gitlens.welcome.experience\\\",\\\"gitlens.welcome.settings\\\",\\\"gitlens.welcome.currentLineBlame\\\",\\\"gitlens.welcome.gitCodeLens\\\",\\\"gitlens.welcome.revisionHistory\\\",\\\"gitlens.welcome.fileAnnotations\\\",\\\"gitlens.welcome.gitSideBarViews\\\",\\\"gitlens.welcome.hostingServiceIntegrations\\\",\\\"gitlens.welcome.gitCommandPalette\\\",\\\"gitlens.welcome.interactiveRebaseEditor\\\",\\\"gitlens.welcome.terminal\\\",\\\"gitlens.welcome.plus\\\"],\\\"manaullyOpened\\\":false}],[\\\"eamodio.gitlens#gitlens.plus\\\",{\\\"firstSeen\\\":1655672705796,\\\"stepIDs\\\":[\\\"gitlens.plus.intro.tryNow\\\",\\\"gitlens.plus.intro.signIn\\\",\\\"gitlens.plus.intro\\\",\\\"gitlens.plus.visualFileHistory\\\",\\\"gitlens.plus.worktrees\\\",\\\"gitlens.plus.richIntegrations\\\",\\\"gitlens.plus.comingSoon\\\",\\\"gitlens.plus.tryNow\\\",\\\"gitlens.plus.signIn\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-toolsai.jupyter#jupyterWelcome\\\",{\\\"firstSeen\\\":1655672705796,\\\"stepIDs\\\":[\\\"ipynb.newUntitledIpynb\\\",\\\"jupyter.selectKernel\\\",\\\"jupyter.exploreAndDebug\\\",\\\"jupyter.dataScienceLearnMore\\\"],\\\"manaullyOpened\\\":false}],[\\\"msjsdiag.vscode-react-native#RNTGetStarted\\\",{\\\"firstSeen\\\":1655672705796,\\\"stepIDs\\\":[\\\"settingUpCommonEnvironment\\\",\\\"settingUpExpoEnvironment\\\",\\\"settingUpWindowsEnvironment\\\",\\\"settingUpMacOsEnvironment\\\",\\\"hermesEngine\\\",\\\"runAndDebugReactNativeApp\\\",\\\"exploreExtensionFeatures\\\"],\\\"manaullyOpened\\\":false}],[\\\"vscode.typescript-language-features#nodejsWelcome\\\",{\\\"firstSeen\\\":1671016594858,\\\"stepIDs\\\":[\\\"walkthroughs.nodejsWelcome.downloadNode.forMacOrWindows\\\",\\\"walkthroughs.nodejsWelcome.downloadNode.forLinux\\\",\\\"walkthroughs.nodejsWelcome.makeJsFile\\\",\\\"walkthroughs.nodejsWelcome.debugJsFile\\\",\\\"walkthroughs.nodejsWelcome.learnMoreAboutJs\\\"],\\\"manaullyOpened\\\":false}],[\\\"vscode.typescript-language-features#tempNodejsWelcome\\\",{\\\"firstSeen\\\":1686570289974,\\\"stepIDs\\\":[],\\\"manaullyOpened\\\":false}],[\\\"ms-vscode-remote.remote-wsl#wslWalkthrough\\\",{\\\"firstSeen\\\":1686570289975,\\\"stepIDs\\\":[\\\"explore.commands\\\",\\\"open.wslwindow\\\",\\\"create.project\\\",\\\"open.project\\\",\\\"linux.environment\\\",\\\"install.tools\\\",\\\"run.debug\\\",\\\"come.back\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-python.python#pythonWelcome2\\\",{\\\"firstSeen\\\":1696531075441,\\\"stepIDs\\\":[\\\"python.createPythonFolder\\\",\\\"python.createPythonFile\\\",\\\"python.installPythonWin8\\\",\\\"python.installPythonMac\\\",\\\"python.installPythonLinux\\\",\\\"python.createEnvironment2\\\",\\\"python.runAndDebug\\\",\\\"python.learnMoreWithDS2\\\"],\\\"manaullyOpened\\\":false}]]\",\"memento/workbench.editor.keybindings\":\"{\\\"searchHistory\\\":[\\\"@command:jupyter.createnewnotebook\\\"]}\",\"workbench.view.extension.jupyter-variables.state.hidden\":\"[{\\\"id\\\":\\\"jupyterViewVariables\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cell-tag\\\",\\\"isHidden\\\":false}]\",\"memento/notebookGettingStarted2\":\"{\\\"hasOpenedNotebook\\\":true}\",\"notebook.controller2TypeBindings\":\"[[\\\"jupyter-notebook\\\",\\\"ms-toolsai.jupyter/.jvsc74a57bd0ccffda3f3968bc5a7a991d5345bc9d2f406665d12c91d061d1797c12c43b9a60.D:\\\\\\\\S\\\\\\\\anaconda3\\\\\\\\envs\\\\\\\\sc\\\\\\\\python.exe.D:\\\\\\\\S\\\\\\\\anaconda3\\\\\\\\envs\\\\\\\\sc\\\\\\\\python.exe\\\"]]\",\"workbench.view.extension.references-view.state.hidden\":\"[{\\\"id\\\":\\\"references-view.tree\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"CppReferencesView\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.zhihu-explorer.state.hidden\":\"[{\\\"id\\\":\\\"zhihu-feed\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"zhihu-hotStories\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"zhihu-collection\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.leekFundMenu.state.hidden\":\"[{\\\"id\\\":\\\"leekFundView.fund\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"leekFundView.stock\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"leekFundView.news\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"leekFundView.binance\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"leekFundView.settings\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.anes.state.hidden\":\"[{\\\"id\\\":\\\"romLocal\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"romRemote\\\",\\\"isHidden\\\":false}]\",\"workbench.activity.showAccounts\":\"true\",\"workbench.view.extension.iceworksTimeMaster.state.hidden\":\"[{\\\"id\\\":\\\"timeMaster\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.cmake__viewContainer.state.hidden\":\"[{\\\"id\\\":\\\"cmake.outline\\\",\\\"isHidden\\\":false}]\",\"tabs-list-width-horizontal\":\"338\",\"workbench.view.extension.pip-manager-explorer.state.hidden\":\"[{\\\"id\\\":\\\"pip-manager-installed\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.node-notebook.state.hidden\":\"[{\\\"id\\\":\\\"tfjs-vis\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.tcb.state.hidden\":\"[{\\\"id\\\":\\\"tcb.views.scf\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tcb.views.help\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.tabnine-access.state.hidden\":\"[{\\\"id\\\":\\\"tabnine-home\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine-today\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine-notifications\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.vscode-edge-devtools-view.state.hidden\":\"[{\\\"id\\\":\\\"vscode-edge-devtools-view.targets\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-edge-devtools-view.mirror-editing\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-edge-devtools-view.help-links\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.package-explorer.state.hidden\":\"[{\\\"id\\\":\\\"pythonEnvironments\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workspaceEnvironments\\\",\\\"isHidden\\\":false}]\",\"workbench.panel.alignment\":\"center\",\"workbench.view.extension.gitlensPanel.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.timeline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.graph\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.graphDetails\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.dotnet-interactive-panel.state.hidden\":\"[{\\\"id\\\":\\\"dotnet-interactive-panel-values\\\",\\\"isHidden\\\":false}]\",\"recently.opened\":\"{\\\"entries\\\":[]}\",\"workbench.view.extension.jupyter.state.hidden\":\"[{\\\"id\\\":\\\"cell-tag\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.color_manager_webview_container.state.hidden\":\"[{\\\"id\\\":\\\"cm_view\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.polyglot-notebook-panel.state.hidden\":\"[{\\\"id\\\":\\\"polyglot-notebook-panel-values\\\",\\\"isHidden\\\":false}]\",\"snippets.usageTimestamps\":\"[[\\\"random/0.8081711004739913\\\",1670167782836],[\\\"random/0.5930910631921698\\\",1670167788273],[\\\"snippets/snippets.json/classConstructor\\\",1670408486944],[\\\"snippets/typescript.code-snippets/For-Each Loop using =>\\\",1674208830909],[\\\"random/0.2030832450697151\\\",1676462151523],[\\\"random/0.3804045603045132\\\",1676462163154],[\\\"snippets/typescript.code-snippets/Log error to console\\\",1678105930783],[\\\"random/0.9946580119637969\\\",1680240803812],[\\\"snippets/snippets.code-snippets/Open devtools\\\",1681479658129],[\\\"snippets/html.json/html5-boilerplate\\\",1706368699044],[\\\"random/0.5460384062758072\\\",1711310206021]]\",\"expandSuggestionDocs\":\"true\",\"workbench.view.extension.github-pull-requests.state.hidden\":\"[{\\\"id\\\":\\\"github:login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pr:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"issues:github\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-pull-request.state.hidden\":\"[{\\\"id\\\":\\\"github:createPullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChanges\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"prStatus:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest:welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:createPullRequestWebview\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesFiles\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesCommits\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.chatgpt-vscode-plugin.state.hidden\":\"[{\\\"id\\\":\\\"chatgpt-china.chatView\\\",\\\"isHidden\\\":false}]\",\"refactorPreview.hidden\":\"[{\\\"id\\\":\\\"refactorPreview\\\",\\\"isHidden\\\":false}]\",\"github-Soltus\":\"[{\\\"id\\\":\\\"github.copilot\\\",\\\"name\\\":\\\"GitHub Copilot\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"eamodio.gitlens\\\",\\\"name\\\":\\\"GitLens — Git supercharged\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"github.vscode-github-actions\\\",\\\"name\\\":\\\"GitHub Actions\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"vscode.github\\\",\\\"name\\\":\\\"GitHub\\\",\\\"allowed\\\":true}]\",\"editor.contrib.largeFileOptimizationsWarner\":\"true\",\"themeUpdatedNotificationShown\":\"true\",\"extensionsAssistant/deprecated\":\"[\\\"abusaidm.html-snippets\\\",\\\"slevesque.vscode-hexdump\\\",\\\"bungcip.better-toml\\\"]\",\"workbench.view.extension.github-actions.state.hidden\":\"[{\\\"id\\\":\\\"github-actions.current-branch\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.workflows\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.settings\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.empty-view\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.gitlensInspect.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.commitDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.timeline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.searchAndCompare\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.gitpod-view.state.hidden\":\"[{\\\"id\\\":\\\"gitpod-login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitpod-workspaces\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitpod-workspace\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.tabnine.state.hidden\":\"[{\\\"id\\\":\\\"tabnine.chat\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.authenticate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.loading\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.authenticate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.not_part_of_a_team\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.preview_ended\\\",\\\"isHidden\\\":false}]\",\"~remote.forwardedPortsContainer.hidden\":\"[{\\\"id\\\":\\\"~remote.forwardedPorts\\\",\\\"isHidden\\\":false}]\",\"views.customizations\":\"{\\\"viewContainerLocations\\\":{},\\\"viewLocations\\\":{\\\"zhihu-feed\\\":\\\"workbench.view.explorer\\\",\\\"zhihu-hotStories\\\":\\\"workbench.view.explorer\\\",\\\"zhihu-collection\\\":\\\"workbench.view.explorer\\\"},\\\"viewContainerBadgeEnablementStates\\\":{}}\",\"workbench.view.extension.conflictTreeViewPanel.state.hidden\":\"[{\\\"id\\\":\\\"suggestedConflictTreeView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"allConflictTreeView\\\",\\\"isHidden\\\":false}]\",\"workbench.activityBar.location\":\"default\",\"workbench.view.extension.json-views.state.hidden\":\"[{\\\"id\\\":\\\"jsonOutline\\\",\\\"isHidden\\\":false}]\",\"extensionsAssistant/ignored_recommendations\":\"[]\",\"userDataProfiles.state.hidden\":\"[{\\\"id\\\":\\\"workbench.views.profiles.export.preview\\\",\\\"isHidden\\\":false}]\"}}"}
\ No newline at end of file
diff --git a/.vscode/Sillot.code-workspace b/.vscode/Sillot.code-workspace
new file mode 100644
index 0000000000..095efd68d7
--- /dev/null
+++ b/.vscode/Sillot.code-workspace
@@ -0,0 +1,37 @@
+{
+ "folders": [
+ {
+ "path": "..",
+ "name": "汐洛🤍/ 🗂️"
+ },
+ {
+ "path": "../kernel", // 列出子文件夹,在父文件夹的 setting.json 添加隐藏(排除)
+ "name": "思源内核🤍/kernel 🗂️"
+ },
+ {
+ "path": "../app/appearance", // 列出子文件夹,在父文件夹的 setting.json 添加隐藏(排除)
+ "name": "思源美化🤍/app/appearance 🗂️"
+ },
+ {
+ "path": "../_sili", // 列出子文件夹,在父文件夹的 setting.json 添加隐藏(排除)
+ "name": "司丽🤍/_sili 🗂️"
+ },
+ {
+ "path": "../docs", // 列出子文件夹,在父文件夹的 setting.json 添加隐藏(排除)
+ "name": "汐洛宝典🤍/docs 🗂️"
+ },
+ {
+ "path": "../../Sillot-android", // 开发在 Android Studio 完成,这里列出只是方便 Git 管理
+ "name": "汐洛安卓🤍../Sillot-android 🗂️"
+ },
+ ],
+ "settings": {
+ "files.associations": {
+ "*.sy": "json"
+ },
+ "workbench.editor.wrapTabs": true,
+ "search.exclude": {
+ "**/.history": true
+ }
+ }
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index b042177268..1cc238ddf7 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,32 +1,49 @@
{
- "recommendations": [
- "editorconfig.editorconfig",
- "mqycn.huile8",
- "codeinchinese.chineseinputassistant",
- "russell.any-rule",
- "mrcrowl.easy-less",
- "igorsbitnev.error-gutters",
- "usernamehw.errorlens",
- "mkxml.vscode-filesize",
- "mhutchie.git-graph",
- "donjayamanne.githistory",
- "michelemelluso.gitignore",
- "eamodio.gitlens",
- "ldez.ignore-files",
- "wix.vscode-import-cost",
- "josee9988.minifyall",
- "christian-kohler.npm-intellisense",
- "leizongmin.node-module-intellisense",
- "christian-kohler.path-intellisense",
- "rome.rome",
- "tyriar.vscode-terminal-here",
- "symbolk.somanyconflicts",
- "shardulm94.trailing-spaces",
- "xboxyan.tree-generator",
- "unifiedjs.vscode-mdx",
- "astro-build.astro-vscode",
- "golang.go",
- "github.vscode-github-actions"
- ],
- "unwantedRecommendations": []
+ "recommendations": [
+ "editorconfig.editorconfig",
+ "mqycn.huile8",
+ "codeinchinese.chineseinputassistant",
+ "russell.any-rule",
+ "mrcrowl.easy-less",
+ "igorsbitnev.error-gutters",
+ "usernamehw.errorlens",
+ "mkxml.vscode-filesize",
+ "mhutchie.git-graph",
+ "donjayamanne.githistory",
+ "michelemelluso.gitignore",
+ "eamodio.gitlens",
+ "ldez.ignore-files",
+ "wix.vscode-import-cost",
+ "josee9988.minifyall",
+ "christian-kohler.npm-intellisense",
+ "leizongmin.node-module-intellisense",
+ "christian-kohler.path-intellisense",
+ "rome.rome",
+ "tyriar.vscode-terminal-here",
+ "symbolk.somanyconflicts",
+ "shardulm94.trailing-spaces",
+ "xboxyan.tree-generator",
+ "unifiedjs.vscode-mdx",
+ "astro-build.astro-vscode",
+ "golang.go",
+ "github.vscode-github-actions",
+ "maixiaojie.git-emoji-zh",
+ "doggy8088.pangu2",
+ "ms-ceintl.vscode-language-pack-zh-hans",
+ "cweijan.vscode-office",
+ ],
+ "unwantedRecommendations": [
+ "hayden.extension-pack-manager",
+ "vscjava.vscode-java-pack",
+ "vscjava.vscode-gradle",
+ "googlecloudtools.cloudcode",
+ "github.copilot",
+ "ms-kubernetes-tools.vscode-kubernetes-tools",
+ "firefox-devtools.vscode-firefox-debug",
+ "felipecaputo.git-project-manager",
+ "dbaeumer.vscode-eslint",
+ "oderwat.indent-rainbow",
+ "esbenp.prettier-vscode",
+ "rvest.vs-code-prettier-eslint"
+ ],
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 074f98b42a..bd8d0488f3 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,7 +1,11 @@
{
"vue.features.codeActions.enable": false,
- "files.associations": {
- "*.sy": "json"
+ "deno.enable": false,
+ "files.exclude": {
+ "_sili": true,
+ "docs": true,
+ "kernel": true,
+ "app/appearance": true
},
- "workbench.editor.wrapTabs": true
+ "editor.formatOnSave": false,
}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000..65496e4f79
--- /dev/null
+++ b/README.md
@@ -0,0 +1,319 @@
+
+
+
+Refactor your thinking
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+中文
+
+
+## 💡 Introduction
+
+SiYuan is a privacy-first personal knowledge management system, support fine-grained block-level reference and Markdown
+WYSIWYG.
+
+Welcome to [SiYuan English Discussion Forum](https://liuyun.io) to learn more.
+
+![feature0.png](https://b3logfile.com/file/2024/01/feature0-1orBRlI.png)
+
+![feature51.png](https://b3logfile.com/file/2024/02/feature5-1-uYYjAqy.png)
+
+## 🔮 Features
+
+Most features are free, even for commercial use.
+
+* Content block
+ * Block-level reference and two-way links
+ * Custom attributes
+ * SQL query embed
+ * Protocol `siyuan://`
+* Editor
+ * Block-style
+ * Markdown WYSIWYG
+ * List outline
+ * Block zoom-in
+ * Million-word large document editing
+ * Mathematical formulas, charts, flowcharts, Gantt charts, timing charts, staffs, etc.
+ * Web clipping
+ * PDF Annotation link
+* Export
+ * Block ref and embed
+ * Standard Markdown with assets
+ * PDF, Word and HTML
+ * Copy to WeChat MP, Zhihu and Yuque
+* Database
+ * Table view
+* Flashcard spaced repetition
+* AI writing and Q/A chat via OpenAI API
+* Tesseract OCR
+* Multi-tab, drag and drop to split screen
+* Template snippet
+* JavaScript/CSS snippet
+* Android/iOS App
+* Docker deployment
+* [API](https://github.com/siyuan-note/siyuan/blob/master/API.md)
+* Community marketplace
+
+Some features are only available to paid members, for more details please refer to [Pricing](https://b3log.org/siyuan/en/pricing.html).
+
+## 🏗️ Architecture design and open source ecosystem
+
+![SiYuan Arch](https://b3logfile.com/file/2023/05/SiYuan_Arch-Sgu8vXT.png "SiYuan Arch")
+
+| Project | Description | Forks | Stars |
+|----------------------------------------------------------|-----------------------|---------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
+| [lute](https://github.com/88250/lute) | Editor engine | ![GitHub forks](https://img.shields.io/github/forks/88250/lute) | ![GitHub Repo stars](https://img.shields.io/github/stars/88250/lute) |
+| [chrome](https://github.com/siyuan-note/siyuan-chrome) | Chrome/Edge extension | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-chrome) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-chrome) |
+| [bazaar](https://github.com/siyuan-note/bazaar) | Community marketplace | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/bazaar) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/bazaar) |
+| [dejavu](https://github.com/siyuan-note/dejavu) | Data repo | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/dejavu) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/dejavu) |
+| [petal](https://github.com/siyuan-note/petal) | Plugin API | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/petal) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/petal) |
+| [android](https://github.com/siyuan-note/siyuan-android) | Android App | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
+| [ios](https://github.com/siyuan-note/siyuan-ios) | iOS App | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios) |
+| [riff](https://github.com/siyuan-note/riff) | Spaced repetition | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/riff) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/riff) |
+
+## 🌟 Star History
+
+[![Star History Chart](https://api.star-history.com/svg?repos=siyuan-note/siyuan&type=Date)](https://star-history.com/#siyuan-note/siyuan&Date)
+
+## 🗺️ Roadmap
+
+* [SiYuan development plan and progress](https://github.com/orgs/siyuan-note/projects/1)
+* [SiYuan changelog](CHANGELOG.md)
+
+## 🚀 Download Setup
+
+It is recommended to give priority to installing through the application market on the desktop and mobile, so that you can upgrade the version with one click in the future.
+
+### App Market
+
+Mobile:
+
+* [App Store](https://apps.apple.com/us/app/siyuan/id1583226508)
+* [Google Play](https://play.google.com/store/apps/details?id=org.b3log.siyuan)
+* [F-Droid](https://f-droid.org/packages/org.b3log.siyuan)
+
+Desktop:
+
+* [Microsoft Store](https://www.microsoft.com/store/apps/9P7HPMXP73K4)
+
+### Docker Hosting
+
+
+Docker Deployment
+
+#### Overview
+
+The easiest way to serve SiYuan on a server is to deploy it through Docker.
+
+* Image name `b3log/siyuan`
+* [Image URL](https://hub.docker.com/r/b3log/siyuan)
+
+#### File structure
+
+The overall program is located under `/opt/siyuan/`, which is basically the structure under the resources folder of the Electron installation package:
+
+* appearance: icon, theme, languages
+* guide: user guide document
+* stage: interface and static resources
+* kernel: kernel program
+
+#### Entrypoint
+
+The entry point is set when building the Docker image: `ENTRYPOINT ["/opt/siyuan/kernel" ]`, use `docker run b3log/siyuan` with parameters to start:
+
+* `--workspace`: Specifies the workspace folder path, mounted to the container via `-v` on the host
+* `--accessAuthCode`: Specifies the access authorization code
+
+More parameters can refer to `--help`. The following is an example of a startup command:
+
+```
+docker run -d -v workspace_dir_host:workspace_dir_container -p 6806:6806 b3log/siyuan --workspace=workspace_dir_container --accessAuthCode=xxx
+```
+
+* `workspace_dir_host`: The workspace folder path on the host
+* `workspace_dir_container`: The path of the workspace folder in the container, which is the same as specified in `--workspace`
+* `accessAuthCode`: Access authorization code, please **be sure to modify**, otherwise anyone can read and write your data
+
+To simplify, it is recommended to configure the workspace folder path to be consistent on the host and container, such as: `workspace_dir_host` and `workspace_dir_container` are configured as `/siyuan/workspace`, the corresponding startup commands is:
+
+```
+docker run -d -v /siyuan/workspace:/siyuan/workspace -p 6806:6806 -u 1000:1000 b3log/siyuan --workspace=/siyuan/workspace/ --accessAuthCode=xxx
+```
+
+Alternatively, see below for an example Docker Compose file:
+
+```
+version: "3.9"
+services:
+ main:
+ image: b3log/siyuan
+ command: ['--workspace=/siyuan/workspace/', '--accessAuthCode=${AuthCode}']
+ user: '1000:1000'
+ ports:
+ - 6806:6806
+ volumes:
+ - /siyuan/workspace:/siyuan/workspace
+ restart: unless-stopped
+ environment:
+ # A list of time zone identifiers can be found at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+ - TZ=${TimeZone}
+```
+
+#### User permissions
+
+In the image, the normal user `siyuan` (uid 1000/gid 1000) created by default is used to start the kernel process. Therefore, when the host creates a workspace folder, please pay attention to setting the user group of the folder: `chown -R 1000:1000 /siyuan/workspace`. The parameter `-u 1000:1000` is required when starting the container.
+
+#### Hidden port
+
+Use NGINX reverse proxy to hide port 6806, please note:
+
+* Configure WebSocket reverse proxy `/ws`
+
+#### Note
+
+* Be sure to confirm the correctness of the mounted volume, otherwise the data will be lost after the container is deleted
+* Do not use URL rewriting for redirection, otherwise there may be problems with authentication, it is recommended to configure a reverse proxy
+
+#### Limitations
+
+* Does not support desktop and mobile application connections, only supports use on browsers
+* Export to PDF, HTML and Word formats is not supported
+* Import Markdown file is not supported
+
+
+
+### Installation Package
+
+* [B3log](https://b3log.org/siyuan/en/download.html)
+* [GitHub](https://github.com/siyuan-note/siyuan/releases)
+
+### Insider Preview
+
+We release insider preview before major updates, please visit [https://github.com/siyuan-note/insider](https://github.com/siyuan-note/insider).
+
+## 🏘️ Community
+
+* [English Discussion Forum](https://liuyun.io)
+* [User community summary](https://liuyun.io/article/1687779743723)
+* [Awesome SiYuan](https://github.com/siyuan-note/awesome)
+
+## 🛠️ Development Guide
+
+See [Development Guide](https://github.com/siyuan-note/siyuan/blob/master/.github/CONTRIBUTING.md).
+
+## ❓ FAQ
+
+### How does SiYuan store data?
+
+The data is saved in the workspace folder, in the workspace data folder:
+
+* `assets` is used to save all inserted assets
+* `emojis` is used to save emoji images
+* `snippets` is used to save code snippets
+* `storage` is used to save query conditions, layouts and flashcards, etc.
+* `templates` is used to save template snippets
+* `widgets` is used to save widgets
+* `plugins` is used to save plugins
+* `public` is used to save public data
+* The rest of the folders are the notebook folders created by the user, files with the suffix of `.sy` in the notebook folder are used to save the document data, and the data format is JSON
+
+### Does it support data synchronization through a third-party sync disk?
+
+Data synchronization through third-party synchronization disks is not supported, otherwise data may be corrupted.
+
+Although it does not support third-party sync disks, it supports connect with third-party cloud storage (Member's privileges).
+
+In addition, you can also consider manually exporting and importing data to achieve data synchronization:
+
+* Desktop: Settings - Export - Export Data / Import Data
+* Mobile: Right column - About - Export Data / Import Data
+
+### Is SiYuan open source?
+
+SiYuan is completely open source, and contributions are welcome:
+
+* [User Interface and Kernel](https://github.com/siyuan-note/siyuan)
+* [Android](https://github.com/siyuan-note/siyuan-android)
+* [iOS](https://github.com/siyuan-note/siyuan-ios)
+* [Chrome Clipping Extension](https://github.com/siyuan-note/siyuan-chrome)
+
+For more details, please refer to [Development Guide](https://github.com/siyuan-note/siyuan/blob/master/.github/CONTRIBUTING.md).
+
+### How to upgrade to a new version?
+
+* If installed via app store, please update via app store
+* If it is installed through the installation package on the desktop, you can open the option of Settings - About - Automatically download update installation package, so that SiYuan will automatically download The latest version of the installation package and prompts to install
+* If it is installed by manual installation package, please download the installation package again to install
+
+You can Check update in Settings - About - Current Version, or pay attention to [Official Download](https://b3log.org/siyuan/en/download.html) or [GitHub Releases](https://github.com/siyuan-note/siyuan/releases) to get the new version.
+
+### Is there any note for deleting docs?
+
+After deletion, the doc will not appear in the operating system's recycle bin, but will be deleted directly. When deleted, SiYuan will generate data history.
+
+### How can I just wrap and not start a new paragraph?
+
+Please use Shift+Enter.
+
+### What if some blocks (such as paragraph blocks in list items) cannot find the block icon?
+
+The first sub-block under the list item is the block icon omitted. You can move the cursor into this block and trigger its block menu with Ctrl+/ .
+
+### How to share notes?
+
+* Share document to Liandi
+* Export and import `.sy.zip` package
+* Via network hosting
+* Export and import Markdown
+* Export Preview to copy to third-party online services
+
+### What should I do if the data repo key is lost?
+
+* If the data repo key is correctly initialized on multiple devices before, the key is the same on all devices and can be set in Settings - About - Data repo key - Copy key string retrieve
+* If it has not been configured correctly before (for example, the keys on multiple devices are inconsistent) or all devices are unavailable and the key string cannot be obtained, you can reset the key by following the steps below:
+
+ 1. Manually back up the data, you can use Export Data or directly copy the workspace/data/ folder on the file system
+ 2. Settings - About - Data rep key - Reset data repo
+ 3. Reinitialize the data repo key. After initializing the key on one device, other devices import the key
+ 4. The cloud uses the new synchronization directory, the old synchronization directory is no longer available and can be deleted
+ 5. The existing cloud snapshots are no longer available and can be deleted
+
+### Do I need to pay for it?
+
+Most features are free, even for commercial use.
+
+Member's privileges can only be used after payment, please refer to [Pricing](https://b3log.org/siyuan/en/pricing.html).
+
+## 🙏 Acknowledgement
+
+The birth of SiYuan is inseparable from many open source projects and contributors, please refer to the project source code kernel/go.mod, app/package.json and project homepage.
+
+The growth of SiYuan is inseparable from user feedback and promotion, thank you for everyone's help to SiYuan ❤️
+
+### Contributors
+
+Welcome to join us and contribute code to SiYuan together.
+
+
+
+
diff --git a/README_zh_CN.md b/README_zh_CN.md
index 1dba5723dc..0df72aacb5 100644
--- a/README_zh_CN.md
+++ b/README_zh_CN.md
@@ -53,7 +53,6 @@
* Markdown 所见即所得
* 列表大纲
* 块缩放聚焦
- * 块横向排版
* 百万字大文档编辑
* 数学公式、图表、流程图、甘特图、时序图、五线谱等
* 网页剪藏
@@ -65,10 +64,12 @@
* 复制到微信公众号、知乎和语雀
* 数据库
* 表格视图
-* 间隔重复
+* 闪卡间隔重复
+* 接入 OpenAI 接口支持人工智能写作和问答聊天
+* Tesseract OCR
* 模板片段
* JavaScript/CSS 代码片段
-* Android/iOS APP
+* Android/iOS App
* Docker 部署
* [API](API_zh_CN.md)
* 社区集市
@@ -86,8 +87,8 @@
| [bazaar](https://github.com/siyuan-note/bazaar) | 社区集市 | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/bazaar) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/bazaar) |
| [dejavu](https://github.com/siyuan-note/dejavu) | 数据仓库 | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/dejavu) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/dejavu) |
| [petal](https://github.com/siyuan-note/petal) | 插件 API | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/petal) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/petal) |
-| [android](https://github.com/siyuan-note/siyuan-android) | Android APP | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
-| [ios](https://github.com/siyuan-note/siyuan-ios) | iOS APP | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios) |
+| [android](https://github.com/siyuan-note/siyuan-android) | Android App | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
+| [ios](https://github.com/siyuan-note/siyuan-ios) | iOS App | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios) |
| [riff](https://github.com/siyuan-note/riff) | 间隔重复 | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/riff) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/riff) |
## 🌟 Star History
diff --git a/_sili/.gitignore b/_sili/.gitignore
new file mode 100644
index 0000000000..77e20f95e0
--- /dev/null
+++ b/_sili/.gitignore
@@ -0,0 +1 @@
+**/realm-node
diff --git a/_sili/.vscode/settings.json b/_sili/.vscode/settings.json
new file mode 100644
index 0000000000..f7f606b339
--- /dev/null
+++ b/_sili/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "deno.enable": true
+}
diff --git a/_sili/app/.gitignore b/_sili/app/.gitignore
new file mode 100644
index 0000000000..55b5a09bb2
--- /dev/null
+++ b/_sili/app/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+.vite
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+vite.config.mts.*.mjs
diff --git a/_sili/app/README.md b/_sili/app/README.md
new file mode 100644
index 0000000000..70bb0bcd73
--- /dev/null
+++ b/_sili/app/README.md
@@ -0,0 +1,30 @@
+# Vite + Deno + React + TypeScript
+
+## Running
+
+You need to have Deno v1.28.0 or later installed to run this repo.
+
+Start a dev server:
+
+```
+$ deno task dev
+```
+
+## Deploy
+
+Build production assets:
+
+```
+$ deno task build
+```
+
+## Notes
+
+- You need to use `.mjs` or `.mts` extension for the `vite.config.[ext]` file.
+
+## Papercuts
+
+Currently there's a "papercut" for Deno users:
+
+- peer dependencies need to be referenced in `vite.config.js` - in this example
+ it is `react` and `react-dom` packages that need to be referenced
diff --git a/_sili/app/api/data.json b/_sili/app/api/data.json
new file mode 100644
index 0000000000..bf12957c8a
--- /dev/null
+++ b/_sili/app/api/data.json
@@ -0,0 +1,3022 @@
+[
+ {
+ "name": "Aardonyx",
+ "description": "An early stage in the evolution of sauropods."
+ },
+ {
+ "name": "Abelisaurus",
+ "description": "\"Abel's lizard\" has been reconstructed from a single skull."
+ },
+ {
+ "name": "Abrictosaurus",
+ "description": "An early relative of Heterodontosaurus."
+ },
+ {
+ "name": "Abrosaurus",
+ "description": "A close Asian relative of Camarasaurus."
+ },
+ {
+ "name": "Abydosaurus",
+ "description": "This sauropod's intact skull was discovered in 2010."
+ },
+ {
+ "name": "Acanthopholis",
+ "description": "No, it's not a city in Greece."
+ },
+ {
+ "name": "Achelousaurus",
+ "description": "Might this have been a growth stage of Pachyrhinosaurus?"
+ },
+ {
+ "name": "Achillobator",
+ "description": "This fierce raptor was discovered in modern-day Mongolia."
+ },
+ {
+ "name": "Acristavus",
+ "description": "This early hadrosaur lacked any ornamentation on its skull."
+ },
+ {
+ "name": "Acrocanthosaurus",
+ "description": "The largest meat-eating dinosaur of the early Cretaceous period."
+ },
+ {
+ "name": "Acrotholus",
+ "description": "North America's earliest bone-headed dinosaur."
+ },
+ {
+ "name": "Adamantisaurus",
+ "description": "This titanosaur was named 50 years after its discovery."
+ },
+ {
+ "name": "Adasaurus",
+ "description": "This raptor's hind claws were unusually small."
+ },
+ {
+ "name": "Adeopapposaurus",
+ "description": "A close relative of Massospondylus."
+ },
+ {
+ "name": "Aegyptosaurus",
+ "description": "Try and guess which country this dinosaur was found in."
+ },
+ {
+ "name": "Aeolosaurus",
+ "description": "Could this titanosaur have reared up on its hind legs?"
+ },
+ {
+ "name": "Aerosteon",
+ "description": "This air-boned dinosaur may have breathed like a bird."
+ },
+ {
+ "name": "Afrovenator",
+ "description": "One of the few carnivores ever to be dug up in northern Africa."
+ },
+ {
+ "name": "Agathaumas",
+ "description": "The first ceratopsian dinosaur ever discovered."
+ },
+ {
+ "name": "Agilisaurus",
+ "description": "This \"agile lizard\" was one of the earliest ornithopods."
+ },
+ {
+ "name": "Agujaceratops",
+ "description": "It was once classified as a species of Chasmosaurus."
+ },
+ {
+ "name": "Agustinia",
+ "description": "A large, spiny-backed sauropod."
+ },
+ {
+ "name": "Ajkaceratops",
+ "description": "The first ceratopsian ever to be discovered in Europe."
+ },
+ {
+ "name": "Alamosaurus",
+ "description": "No, it wasn't named after the Alamo, but it should have been."
+ },
+ {
+ "name": "Alaskacephale",
+ "description": "Can you guess which state this pachycephalosaur was found in?"
+ },
+ {
+ "name": "Albalophosaurus",
+ "description": "One of the few dinosaurs ever to be discovered in Japan."
+ },
+ {
+ "name": "Albertaceratops",
+ "description": "The most basal \"centrosaurine\" yet identified."
+ },
+ {
+ "name": "Albertadromeus",
+ "description": "This petite ornithopod was recently discovered in Canada."
+ },
+ {
+ "name": "Albertonykus",
+ "description": "A tiny, birdlike, North American dinosaur."
+ },
+ {
+ "name": "Albertosaurus",
+ "description": "This carnivorous dinosaur was a close relative of T. Rex."
+ },
+ {
+ "name": "Alectrosaurus",
+ "description": "Few specimens of this \"unmarried lizard\" have been found."
+ },
+ {
+ "name": "Aletopelta",
+ "description": "The first ankylosaur known to have lived in Mexico."
+ },
+ {
+ "name": "Alioramus",
+ "description": "Everything we know about this tyrannosaur is based on a single skull."
+ },
+ {
+ "name": "Allosaurus",
+ "description": "The apex predator of late Jurassic North America."
+ },
+ {
+ "name": "Altirhinus",
+ "description": "This \"high-nosed\" plant eater resembled an early hadrosaur."
+ },
+ {
+ "name": "Alvarezsaurus",
+ "description": "A bird-like dinosaur of the late Cretaceous."
+ },
+ {
+ "name": "Alwalkeria",
+ "description": "This Indian dinosaur was one of the earliest saurischians."
+ },
+ {
+ "name": "Alxasaurus",
+ "description": "An early relative of the bizarre Therizinosaurus."
+ },
+ {
+ "name": "Amargasaurus",
+ "description": "A bizarre, spined sauropod from South America."
+ },
+ {
+ "name": "Amazonsaurus",
+ "description": "One of the few dinosaurs to be found in the Amazon basin."
+ },
+ {
+ "name": "Ammosaurus",
+ "description": "This may (or may not) have been the same dinosaur as Anchisaurus."
+ },
+ {
+ "name": "Ampelosaurus",
+ "description": "One of the best-known of the armored titanosaurs."
+ },
+ {
+ "name": "Amphicoelias",
+ "description": "Could it have been the biggest dinosaur that ever lived?"
+ },
+ {
+ "name": "Amurosaurus",
+ "description": "The most complete hadrosaur to be discovered in Russia."
+ },
+ {
+ "name": "Anabisetia",
+ "description": "The best-attested South American ornithopod."
+ },
+ {
+ "name": "Anatosaurus",
+ "description": "This dinosaur is now known as either Anatotitan or Edmontosaurus."
+ },
+ {
+ "name": "Anatotitan",
+ "description": "This hadrosaur's name means \"giant duck\"."
+ },
+ {
+ "name": "Anchiceratops",
+ "description": "This dinosaur had a distinctively shaped frill."
+ },
+ {
+ "name": "Anchiornis",
+ "description": "A four-winged dino-bird that resembled Microraptor."
+ },
+ {
+ "name": "Anchisaurus",
+ "description": "One of the first dinosaurs ever to be dug up in the U.S."
+ },
+ {
+ "name": "Andesaurus",
+ "description": "This titanosaur rivaled Argentinosaurus in size."
+ },
+ {
+ "name": "Angaturama",
+ "description": "A Brazilian relative of Spinosaurus."
+ },
+ {
+ "name": "Angolatitan",
+ "description": "The first dinosaur ever to be discovered in Angola."
+ },
+ {
+ "name": "Angulomastacator",
+ "description": "This dinosaur had a strangely shaped upper jaw."
+ },
+ {
+ "name": "Animantarx",
+ "description": "This \"living fortress\" was discovered in an unusual way."
+ },
+ {
+ "name": "Ankylosaurus",
+ "description": "This dinosaur was the Cretaceous equivalent of a Sherman tank."
+ },
+ {
+ "name": "Anodontosaurus",
+ "description": "This \"toothless lizard\" actually had a full set of choppers."
+ },
+ {
+ "name": "Anserimimus",
+ "description": "This \"goose mimic\" didn’t bear much of a resemblance."
+ },
+ {
+ "name": "Antarctopelta",
+ "description": "The first dinosaur fossil ever discovered in Antarctica."
+ },
+ {
+ "name": "Antarctosaurus",
+ "description": "This titanosaur may or may not have lived in Antarctica."
+ },
+ {
+ "name": "Antetonitrus",
+ "description": "Either a very late prosauropod or a very early sauropod."
+ },
+ {
+ "name": "Anzu",
+ "description": "This Oviraptor relative was recently discovered in North America."
+ },
+ {
+ "name": "Aorun",
+ "description": "A small theropod of late Jurassic Asia."
+ },
+ {
+ "name": "Apatosaurus",
+ "description": "The dinosaur formerly known as Brontosaurus."
+ },
+ {
+ "name": "Appalachiosaurus",
+ "description": "One of the few dinosaurs ever to be found in Alabama."
+ },
+ {
+ "name": "Aquilops",
+ "description": "The earliest ceratopsian ever to be discovered in North America."
+ },
+ {
+ "name": "Aragosaurus",
+ "description": "named after the Aragon region of Spain."
+ },
+ {
+ "name": "Aralosaurus",
+ "description": "Not much is known about this central Asian duck-billed dinosaur."
+ },
+ {
+ "name": "Archaeoceratops",
+ "description": "Possibly the smallest ceratopsian that ever lived."
+ },
+ {
+ "name": "Archaeopteryx",
+ "description": "This ancient dino-bird was about the size of a modern pigeon."
+ },
+ {
+ "name": "Archaeornithomimus",
+ "description": "A likely ancestor of Ornithomimus."
+ },
+ {
+ "name": "Arcovenator",
+ "description": "This fierce abelisaur was recently discovered in France."
+ },
+ {
+ "name": "Arcusaurus",
+ "description": "This prosauropod was recently discovered in South Africa."
+ },
+ {
+ "name": "Argentinosaurus",
+ "description": "Possibly the largest dinosaur that ever lived."
+ },
+ {
+ "name": "Argyrosaurus",
+ "description": "A plus-sized titanosaur from South America."
+ },
+ {
+ "name": "Aristosuchus",
+ "description": "This \"noble crocodile\" was actually a dinosaur."
+ },
+ {
+ "name": "Arrhinoceratops",
+ "description": "This ceratopsian was named for its \"missing\" nose horn."
+ },
+ {
+ "name": "Astrodon",
+ "description": "The official state dinosaur of Maryland."
+ },
+ {
+ "name": "Asylosaurus",
+ "description": "This \"unharmed lizard\" escaped destruction in World War II."
+ },
+ {
+ "name": "Atlasaurus",
+ "description": "This sauropod had unusually long legs."
+ },
+ {
+ "name": "Atlascopcosaurus",
+ "description": "named after a manufacturer of digging equipment."
+ },
+ {
+ "name": "Atrociraptor",
+ "description": "This \"cruel thief\" wasn't as atrocious as its name implies."
+ },
+ {
+ "name": "Aublysodon",
+ "description": "This tyrannosaur was named after a single tooth."
+ },
+ {
+ "name": "Aucasaurus",
+ "description": "This predator was a close relative of Carnotaurus."
+ },
+ {
+ "name": "Auroraceratops",
+ "description": "A close relative of Archaeoceratops."
+ },
+ {
+ "name": "Australodocus",
+ "description": "This sauropod was found in modern-day Tanzania."
+ },
+ {
+ "name": "Australovenator",
+ "description": "A recently discovered carnivore from Australia."
+ },
+ {
+ "name": "Austroraptor",
+ "description": "The largest raptor from South America."
+ },
+ {
+ "name": "Austrosaurus",
+ "description": "This titanosaur was discovered near a train station."
+ },
+ {
+ "name": "Avaceratops",
+ "description": "This ceratopsian is represented by a single juvenile."
+ },
+ {
+ "name": "Aviatyrannis",
+ "description": "This \"grandmother tyrant\" was one of the first tyrannosaurs."
+ },
+ {
+ "name": "Avimimus",
+ "description": "A particularly bird-like cousin of Oviraptor."
+ },
+ {
+ "name": "Bactrosaurus",
+ "description": "One of the earliest of the duck-billed dinosaurs."
+ },
+ {
+ "name": "Bagaceratops",
+ "description": "A small ceratopsian from central Asia."
+ },
+ {
+ "name": "Bagaraatan",
+ "description": "No one is quite sure how to classify this theropod."
+ },
+ {
+ "name": "Bahariasaurus",
+ "description": "This obscure carnivore may have been the size of T. Rex."
+ },
+ {
+ "name": "Balaur",
+ "description": "This \"stocky dragon\" was recently discovered in Romania."
+ },
+ {
+ "name": "Bambiraptor",
+ "description": "Yes, this tiny raptor was named after you-know-who."
+ },
+ {
+ "name": "Barapasaurus",
+ "description": "Probably the first of the giant sauropods."
+ },
+ {
+ "name": "Barilium",
+ "description": "Yet another iguanodontid ornithopod of the British Isles."
+ },
+ {
+ "name": "Barosaurus",
+ "description": "An enormous plant-eater with a tiny head."
+ },
+ {
+ "name": "Barsboldia",
+ "description": "This hadrosaur was named after Rinchen Barsbold."
+ },
+ {
+ "name": "Baryonyx",
+ "description": "You wouldn't want to clip this dinosaur's claws."
+ },
+ {
+ "name": "Batyrosaurus",
+ "description": "One of the most basal hadrosaurs yet identified."
+ },
+ {
+ "name": "Becklespinax",
+ "description": "A strangely named theropod of the early Cretaceous period."
+ },
+ {
+ "name": "Beipiaosaurus",
+ "description": "The only known feathered therizinosaur."
+ },
+ {
+ "name": "Beishanlong",
+ "description": "This bird mimic weighed over half a ton."
+ },
+ {
+ "name": "Bellusaurus",
+ "description": "A herd of this sauropod drowned in a flash flood."
+ },
+ {
+ "name": "Berberosaurus",
+ "description": "This \"Berber lizard\" has proven difficult to classify."
+ },
+ {
+ "name": "Bicentenaria",
+ "description": "This dinosaur was named for Argentina's 200th anniversary."
+ },
+ {
+ "name": "Bistahieversor",
+ "description": "This tyrannosaur had more teeth than T. Rex."
+ },
+ {
+ "name": "Bonapartenykus",
+ "description": "This feathered dinosaur was found in close proximity to its eggs."
+ },
+ {
+ "name": "Bonitasaura",
+ "description": "This titanosaur wasn't as beautiful as its name implies."
+ },
+ {
+ "name": "Borogovia",
+ "description": "This theropod was named after a Lewis Carroll poem."
+ },
+ {
+ "name": "Bothriospondylus",
+ "description": "A case study in dinosaur confusion."
+ },
+ {
+ "name": "Brachiosaurus",
+ "description": "This dinosaur was a giant, gentle, long-necked plant-eater."
+ },
+ {
+ "name": "Brachyceratops",
+ "description": "A little-known ceratopsian from North America."
+ },
+ {
+ "name": "Brachylophosaurus",
+ "description": "This duck-billed dinosaur's beak looked more like a parrot's."
+ },
+ {
+ "name": "Brachytrachelopan",
+ "description": "This sauropod had an unusually short neck."
+ },
+ {
+ "name": "Bravoceratops",
+ "description": "This ceratopsian was recently discovered in Texas."
+ },
+ {
+ "name": "Brontomerus",
+ "description": "Its name is Greek for \"thunder thighs\"."
+ },
+ {
+ "name": "Bruhathkayosaurus",
+ "description": "Was this titanosaur bigger than Argentinosaurus?"
+ },
+ {
+ "name": "Buitreraptor",
+ "description": "The oldest raptor ever discovered in South America."
+ },
+ {
+ "name": "Byronosaurus",
+ "description": "This theropod was a close relative of Troodon."
+ },
+ {
+ "name": "Camarasaurus",
+ "description": "The most common sauropod of Jurassic North America."
+ },
+ {
+ "name": "Camarillasaurus",
+ "description": "A ceratosaur of early Cretaceous western Europe."
+ },
+ {
+ "name": "Camelotia",
+ "description": "An early member of the line that evolved into sauropods."
+ },
+ {
+ "name": "Camptosaurus",
+ "description": "A close relative of Iguanodon."
+ },
+ {
+ "name": "Carcharodontosaurus",
+ "description": "Its name means \"great white shark lizard.\" Impressed yet?"
+ },
+ {
+ "name": "Carnotaurus",
+ "description": "The shortest arms of any meat-eating dinosaur with horns to match."
+ },
+ {
+ "name": "Caudipteryx",
+ "description": "A birdlike dinosaur that changed the views of paleontologists."
+ },
+ {
+ "name": "Centrosaurus",
+ "description": "Like a unicorn, this ceratopsian only had one horn."
+ },
+ {
+ "name": "Cerasinops",
+ "description": "A small ceratopsian of the late Cretaceous."
+ },
+ {
+ "name": "Ceratonykus",
+ "description": "This dino-bird was discovered in Mongolia in 2009."
+ },
+ {
+ "name": "Ceratosaurus",
+ "description": "This primitive carnivore is hard to classify."
+ },
+ {
+ "name": "Cetiosauriscus",
+ "description": "Not to be confused with the more famous Cetiosaurus."
+ },
+ {
+ "name": "Cetiosaurus",
+ "description": "This \"whale lizard\" was once mistaken for the Loch Ness Monster."
+ },
+ {
+ "name": "Changyuraptor",
+ "description": "Was this feathered dinosaur capable of flight?"
+ },
+ {
+ "name": "Chaoyangsaurus",
+ "description": "An early ceratopsian of the late Jurassic period."
+ },
+ {
+ "name": "Charonosaurus",
+ "description": "This duck-billed dinosaur was much bigger than an elephant."
+ },
+ {
+ "name": "Chasmosaurus",
+ "description": "The only dinosaur that came with its own awning."
+ },
+ {
+ "name": "Chialingosaurus",
+ "description": "One of the earliest Asian stegosaurs."
+ },
+ {
+ "name": "Chilantaisaurus",
+ "description": "This large theropod may have been ancestral to Spinosaurus."
+ },
+ {
+ "name": "Chilesaurus",
+ "description": "This plant-eating theropod was recently discovered in Chile."
+ },
+ {
+ "name": "Chindesaurus",
+ "description": "This early dinosaur was a close relative of Herrerasaurus."
+ },
+ {
+ "name": "Chirostenotes",
+ "description": "This birdlike dinosaur has been known by three different names."
+ },
+ {
+ "name": "Chubutisaurus",
+ "description": "This titanosaur was on Tyrannotitan's lunch menu."
+ },
+ {
+ "name": "Chungkingosaurus",
+ "description": "This early stegosaur had some primitive characteristics."
+ },
+ {
+ "name": "Citipati",
+ "description": "This Mongolian theropod was a close relative of Oviraptor."
+ },
+ {
+ "name": "Claosaurus",
+ "description": "This \"broken lizard\" was a primitive hadrosaur."
+ },
+ {
+ "name": "Coahuilaceratops",
+ "description": "It had the longest horns of any known ceratopsian dinosaur."
+ },
+ {
+ "name": "Coelophysis",
+ "description": "One of the most ancient dinosaurs ever to roam the earth."
+ },
+ {
+ "name": "Coelurus",
+ "description": "This tiny dinosaur was a close relative of Compsognathus."
+ },
+ {
+ "name": "Colepiocephale",
+ "description": "This thick-skulled dinosaur's name is Greek for \"knucklehead\"."
+ },
+ {
+ "name": "Compsognathus",
+ "description": "This dinosaur was the size of a chicken, but much meaner."
+ },
+ {
+ "name": "Concavenator",
+ "description": "This large theropod had a bizarre hump on its back."
+ },
+ {
+ "name": "Conchoraptor",
+ "description": "This \"conch thief\" may have lunched on mollusks."
+ },
+ {
+ "name": "Condorraptor",
+ "description": "A small theropod of middle Jurassic South America."
+ },
+ {
+ "name": "Coronosaurus",
+ "description": "This \"crown lizard\" was once classified as a species of Centrosaurus."
+ },
+ {
+ "name": "Corythosaurus",
+ "description": "This \"Corinthian-helmeted\" dino had a distinctive mating call."
+ },
+ {
+ "name": "Crichtonsaurus",
+ "description": "This dinosaur was named after the author of Jurassic Park."
+ },
+ {
+ "name": "Cruxicheiros",
+ "description": "This \"cross-handed\" dinosaur was named in 2010."
+ },
+ {
+ "name": "Cryolophosaurus",
+ "description": "This crested dinosaur was once known as \"Elvisaurus\"."
+ },
+ {
+ "name": "Cryptovolans",
+ "description": "Was this the same dinosaur as Microraptor?"
+ },
+ {
+ "name": "Cumnoria",
+ "description": "It was once mistakenly classified as a species of Iguanodon."
+ },
+ {
+ "name": "Dacentrurus",
+ "description": "The first stegosaur ever to be described."
+ },
+ {
+ "name": "Daemonosauru 0s",
+ "description": "This \"evil lizard\" was a close relative of Coelophysis."
+ },
+ {
+ "name": "Dahalokely",
+ "description": "A rare theropod from the island of Madagascar."
+ },
+ {
+ "name": "Dakotaraptor",
+ "description": "This giant raptor was recently discovered in South Dakota."
+ },
+ {
+ "name": "Daspletosaurus",
+ "description": "This \"frightful lizard\" was a close cousin of T. Rex."
+ },
+ {
+ "name": "Datousaurus",
+ "description": "A medium-sized sauropod from middle Jurassic Asia."
+ },
+ {
+ "name": "Darwinsaurus",
+ "description": "\"Darwin's lizard\" may or may not be a valid dinosaur genus."
+ },
+ {
+ "name": "Deinocheirus",
+ "description": "All we know for sure about this dinosaur is the shape of its arms."
+ },
+ {
+ "name": "Deinodon",
+ "description": "This \"terrible tooth\" is important from a historical perspective."
+ },
+ {
+ "name": "Deinonychus",
+ "description": "One of the most fearsome raptors of the Cretaceous period."
+ },
+ {
+ "name": "Delapparentia",
+ "description": "This ornithopod was initially classified as a species of Iguanodon."
+ },
+ {
+ "name": "Deltadromeus",
+ "description": "An unusually speedy theropod of the middle Cretaceous."
+ },
+ {
+ "name": "Demandasaurus",
+ "description": "A poorly understood sauropod of early Cretaceous Europe."
+ },
+ {
+ "name": "Diabloceratops",
+ "description": "It looked like a cross between a Triceratops and a Centrosaurus."
+ },
+ {
+ "name": "Diamantinasaurus",
+ "description": "This titanosaur was recently discovered in Australia."
+ },
+ {
+ "name": "Diceratops",
+ "description": "Was this two-horned dinosaur really a specimen of Triceratops?"
+ },
+ {
+ "name": "Dicraeosaurus",
+ "description": "A medium-sized, spiny-necked sauropod."
+ },
+ {
+ "name": "Dilong",
+ "description": "This \"emperor dragon\" may have been an ancestor of T. Rex."
+ },
+ {
+ "name": "Dilophosaurus",
+ "description": "This dinosaur was distinguished by the bony crests on its noggin."
+ },
+ {
+ "name": "Dimetrodon",
+ "description": "This ancient synapsid had a huge sail on its back."
+ },
+ {
+ "name": "Diplodocus",
+ "description": "Thin at one end, much thicker in the middle, and thin again at the far end."
+ },
+ {
+ "name": "Dollodon",
+ "description": "named after the Belgian paleontologist Louis Dollo."
+ },
+ {
+ "name": "Draconyx",
+ "description": "This \"dragon claw\" lived in late Jurassic Portugal."
+ },
+ {
+ "name": "Dracopelta",
+ "description": "This early ankylosaur was discovered in Portugal."
+ },
+ {
+ "name": "Dracorex",
+ "description": "The only dinosaur to be named after the \"Harry Potter\" books."
+ },
+ {
+ "name": "Dracovenator",
+ "description": "This \"dragon hunter\" was a close relative of Dilophosaurus."
+ },
+ {
+ "name": "Dravidosaurus",
+ "description": "This \"dinosaur\" may actually have been a marine reptile."
+ },
+ {
+ "name": "Dreadnoughtus",
+ "description": "This huge titanosaur was recently discovered in Argentina."
+ },
+ {
+ "name": "Drinker",
+ "description": "named after the famous paleontologist Edward Drinker Cope."
+ },
+ {
+ "name": "Dromaeosauroides",
+ "description": "The only dinosaur ever to be discovered in Denmark."
+ },
+ {
+ "name": "Dromaeosaurus",
+ "description": "This \"running lizard\" was probably covered with feathers."
+ },
+ {
+ "name": "Dromiceiomimus",
+ "description": "Possibly the fastest dinosaur that ever lived."
+ },
+ {
+ "name": "Dryosaurus",
+ "description": "A typical ornithopod of the late Jurassic."
+ },
+ {
+ "name": "Dryptosaurus",
+ "description": "The first tyrannosaur to be discovered in the U.S."
+ },
+ {
+ "name": "Dubreuillosaurus",
+ "description": "This megalosaur had a long, low snout."
+ },
+ {
+ "name": "Duriavenator",
+ "description": "Yet another theropod that was once assigned to Megalosaurus."
+ },
+ {
+ "name": "Dyoplosaurus",
+ "description": "This ankylosaur was once confused with Euoplocephalus."
+ },
+ {
+ "name": "Dysalotosaurus",
+ "description": "We know a lot about this dinosaur's growth stages."
+ },
+ {
+ "name": "Dyslocosaurus",
+ "description": "Its name means \"hard-to-place lizard\"."
+ },
+ {
+ "name": "Dystrophaeus",
+ "description": "This Diplodocus-like sauropod was named by Edward Cope."
+ },
+ {
+ "name": "Echinodon",
+ "description": "One of the few ornithopods to sport a set of canines."
+ },
+ {
+ "name": "Edmarka",
+ "description": "This may have been a species of Torvosaurus."
+ },
+ {
+ "name": "Edmontonia",
+ "description": "This armored dinosaur never actually lived in Edmonton."
+ },
+ {
+ "name": "Edmontosaurus",
+ "description": "This large, duck-billed herbivore was a contemporary of T. Rex."
+ },
+ {
+ "name": "Efraasia",
+ "description": "This Triassic herbivore may have been ancestral to sauropods."
+ },
+ {
+ "name": "Einiosaurus",
+ "description": "This ceratopsian was a close relative of Centrosaurus."
+ },
+ {
+ "name": "Ekrixinatosaurus",
+ "description": "Its name means \"explosion-born lizard\"."
+ },
+ {
+ "name": "Elaphrosaurus",
+ "description": "A lightweight theropod from the late Jurassic."
+ },
+ {
+ "name": "Elmisaurus",
+ "description": "This \"foot lizard\" was a close relative of Oviraptor."
+ },
+ {
+ "name": "Elopteryx",
+ "description": "This Transylvanian dinosaur is almost as controversial as Dracula."
+ },
+ {
+ "name": "Elrhazosaurus",
+ "description": "Once classified as a species of Valdosaurus."
+ },
+ {
+ "name": "Enigmosaurus",
+ "description": "This \"puzzle lizard\" was closely related to Therizinosaurus."
+ },
+ {
+ "name": "Eoabelisaurus",
+ "description": "The earliest abelisaurid theropod yet identified."
+ },
+ {
+ "name": "Eobrontosaurus",
+ "description": "This \"dawn brontosaurus\" isn't accepted by most experts."
+ },
+ {
+ "name": "Eocarcharia",
+ "description": "This \"dawn shark\" prowled the woodlands of northern Africa."
+ },
+ {
+ "name": "Eocursor",
+ "description": "This late Triassic reptile was one of the earliest true dinosaurs."
+ },
+ {
+ "name": "Eodromaeus",
+ "description": "Yet another ancient theropod from South America."
+ },
+ {
+ "name": "Eolambia",
+ "description": "An early hadrosaur from North America."
+ },
+ {
+ "name": "Eoraptor",
+ "description": "This tiny dinosaur was among the first of its kind."
+ },
+ {
+ "name": "Eosinopteryx",
+ "description": "A tiny feathered dinosaur of the late Jurassic period."
+ },
+ {
+ "name": "Eotriceratops",
+ "description": "This \"dawn Triceratops\" was recently discovered in Canada."
+ },
+ {
+ "name": "Eotyrannus",
+ "description": "This early tyrannosaur looked more like a raptor."
+ },
+ {
+ "name": "Epachthosaurus",
+ "description": "This \"heavy lizard\" was relatively primitive for its time and place."
+ },
+ {
+ "name": "Epidendrosaurus",
+ "description": "Did this tiny dino-bird spend its life up a tree?"
+ },
+ {
+ "name": "Epidexipteryx",
+ "description": "This feathered dinosaur predated Archaeopteryx."
+ },
+ {
+ "name": "Equijubus",
+ "description": "Its name is Greek for \"horse mane\"."
+ },
+ {
+ "name": "Erectopus",
+ "description": "This \"upright-footed\" dinosaur is a 19th-century enigma."
+ },
+ {
+ "name": "Erketu",
+ "description": "This titanosaur had an unusually long neck."
+ },
+ {
+ "name": "Erliansaurus",
+ "description": "A basal therizinosaur from central Asia."
+ },
+ {
+ "name": "Erlikosaurus",
+ "description": "This late therizinosaur roamed the Mongolian forests."
+ },
+ {
+ "name": "Euhelopus",
+ "description": "The first sauropod to be discovered in China."
+ },
+ {
+ "name": "Euoplocephalus",
+ "description": "Even this ankylosaur's eyelids were armored."
+ },
+ {
+ "name": "Europasaurus",
+ "description": "The smallest sauropod ever discovered."
+ },
+ {
+ "name": "Europelta",
+ "description": "This early nodosaur was recently discovered in Spain."
+ },
+ {
+ "name": "Euskelosaurus",
+ "description": "The first dinosaur ever to be discovered in Africa."
+ },
+ {
+ "name": "Eustreptospondylus",
+ "description": "A close cousin of Megalosaurus."
+ },
+ {
+ "name": "Fabrosaurus",
+ "description": "This early ornithopod may have been a species of Lesothosaurus."
+ },
+ {
+ "name": "Falcarius",
+ "description": "A bizarre, feathered theropod from North America."
+ },
+ {
+ "name": "Ferganasaurus",
+ "description": "The first dinosaur ever to be discovered in the USSR."
+ },
+ {
+ "name": "Fruitadens",
+ "description": "One of the tiniest dinosaurs ever to live in North America."
+ },
+ {
+ "name": "Fukuiraptor",
+ "description": "One of the few carnivorous dinosaurs ever to be dug up in Japan."
+ },
+ {
+ "name": "Fukuisaurus",
+ "description": "This ornithopod was discovered in Japan."
+ },
+ {
+ "name": "Fulgurotherium",
+ "description": "Very little is known about this \"lightning beast\"."
+ },
+ {
+ "name": "Futalognkosaurus",
+ "description": "A very big, and very strangely named sauropod."
+ },
+ {
+ "name": "Gallimimus",
+ "description": "This \"chicken mimic\" roamed the plains of the late Cretaceous."
+ },
+ {
+ "name": "Gargoyleosaurus",
+ "description": "This \"gargoyle lizard\" was an ancestor of Ankylosaurus."
+ },
+ {
+ "name": "Garudimimus",
+ "description": "A relative slowpoke compared to other ornithomimids."
+ },
+ {
+ "name": "Gasosaurus",
+ "description": "Yes, that's its real name, and no, it isn't for the reason you think."
+ },
+ {
+ "name": "Gasparinisaura",
+ "description": "One of the few ornithopods known to have lived in South America."
+ },
+ {
+ "name": "Gastonia",
+ "description": "This ankylosaur was probably on Utahraptor's lunch menu."
+ },
+ {
+ "name": "Genyodectes",
+ "description": "This dinosaur is represented by an impressive set of teeth."
+ },
+ {
+ "name": "Gideonmantellia",
+ "description": "Guess what naturalist this dinosaur was named after."
+ },
+ {
+ "name": "Giganotosaurus",
+ "description": "Not quite a \"Gigantosaurus,\" but close enough."
+ },
+ {
+ "name": "Gigantoraptor",
+ "description": "This huge oviraptorosaur weighed over two tons."
+ },
+ {
+ "name": "Gigantspinosaurus",
+ "description": "It may or may not have been a true stegosaur."
+ },
+ {
+ "name": "Gilmoreosaurus",
+ "description": "One of the few dinosaurs known to have suffered from cancer."
+ },
+ {
+ "name": "Giraffatitan",
+ "description": "Might this \"giant giraffe\" have been a species of Brachiosaurus?"
+ },
+ {
+ "name": "Glacialisaurus",
+ "description": "This \"frozen lizard\" was a close relative of Lufengosaurus."
+ },
+ {
+ "name": "Gobiceratops",
+ "description": "This ceratopsian's tiny skull was found in the Gobi Desert."
+ },
+ {
+ "name": "Gobisaurus",
+ "description": "An unusually large ankylosaur of central Asia."
+ },
+ {
+ "name": "Gobivenator",
+ "description": "This feathered dinosaur gave Velociraptor a run for its money."
+ },
+ {
+ "name": "Gojirasaurus",
+ "description": "This early predator was named after Godzilla."
+ },
+ {
+ "name": "Gondwanatitan",
+ "description": "Yet another titanosaur from South America."
+ },
+ {
+ "name": "Gorgosaurus",
+ "description": "Might this tyrannosaur have been a species of Albertosaurus?"
+ },
+ {
+ "name": "Goyocephale",
+ "description": "A primitive bonehead from Asia."
+ },
+ {
+ "name": "Graciliraptor",
+ "description": "This tiny dino-bird was a close relative of Microraptor."
+ },
+ {
+ "name": "Gryphoceratops",
+ "description": "A tiny ceratopsian of Cretaceous North America."
+ },
+ {
+ "name": "Gryponyx",
+ "description": "This \"hooked claw\" was a distant sauropod ancestor."
+ },
+ {
+ "name": "Gryposaurus",
+ "description": "One of the most common of the duck-billed dinosaurs."
+ },
+ {
+ "name": "Guaibasaurus",
+ "description": "Was this early dinosaur a theropod or a prosauropod?"
+ },
+ {
+ "name": "Guanlong",
+ "description": "Probably the first tyrannosaur ever to walk the earth."
+ },
+ {
+ "name": "Hadrosaurus",
+ "description": "The official state dinosaur of New Jersey."
+ },
+ {
+ "name": "Hagryphus",
+ "description": "The largest North American oviraptor yet discovered."
+ },
+ {
+ "name": "Halticosaurus",
+ "description": "A \"nomen dubium\" theropod of the early 20th century."
+ },
+ {
+ "name": "Haplocanthosaurus",
+ "description": "A typical sauropod of the late Jurassic period."
+ },
+ {
+ "name": "Haplocheirus",
+ "description": "This feathered dinosaur predated Archaeopteryx by millions of years."
+ },
+ {
+ "name": "Harpymimus",
+ "description": "named after the winged creature of Greek myth."
+ },
+ {
+ "name": "Haya",
+ "description": "This dinosaur was named after a horse-headed Mongolian god."
+ },
+ {
+ "name": "Herrerasaurus",
+ "description": "This carnivore roamed present-day South America."
+ },
+ {
+ "name": "Hesperonychus",
+ "description": "A tiny North American dinosaur."
+ },
+ {
+ "name": "Hesperosaurus",
+ "description": "The oldest stegosaur discovered in North America."
+ },
+ {
+ "name": "Heterodontosaurus",
+ "description": "This \"different-toothed\" dinosaur was a dentist's nightmare."
+ },
+ {
+ "name": "Hexing",
+ "description": "This early ornithomimid was recently discovered in China."
+ },
+ {
+ "name": "Hexinlusaurus",
+ "description": "named after the Chinese professor He Xin-Lu."
+ },
+ {
+ "name": "Heyuannia",
+ "description": "Yet another close relative of Oviraptor."
+ },
+ {
+ "name": "Hippodraco",
+ "description": "This \"horse dragon\" was recently discovered in Utah."
+ },
+ {
+ "name": "Homalocephale",
+ "description": "This herbivore had a very flat--and very thick--skull."
+ },
+ {
+ "name": "Hongshanosaurus",
+ "description": "This early ceratopsian is known by two skulls."
+ },
+ {
+ "name": "Hoplitosaurus",
+ "description": "named after the heavily armored soldiers of classical Greece."
+ },
+ {
+ "name": "Huabeisaurus",
+ "description": "A titanosaur from northern China."
+ },
+ {
+ "name": "Huanghetitan",
+ "description": "Yet another contender for the biggest dinosaur that ever lived."
+ },
+ {
+ "name": "Huaxiagnathus",
+ "description": "One of the biggest dino-birds of its time."
+ },
+ {
+ "name": "Huaxiaosaurus",
+ "description": "Might it be an unusually large specimen of Shantungosaurus?"
+ },
+ {
+ "name": "Huayangosaurus",
+ "description": "Could this have been the ancestor of all the stegosaurs?"
+ },
+ {
+ "name": "Huehuecanauhtlus",
+ "description": "Its name is Aztec for \"ancient duck\"."
+ },
+ {
+ "name": "Hungarosaurus",
+ "description": "The best-attested ankylosaur ever discovered in Europe."
+ },
+ {
+ "name": "Huxleysaurus",
+ "description": "named after the famous biologist Thomas Henry Huxley."
+ },
+ {
+ "name": "Hylaeosaurus",
+ "description": "One of the first creatures ever to be called a dinosaur."
+ },
+ {
+ "name": "Hypacrosaurus",
+ "description": "We know a lot about this dinosaur's family life."
+ },
+ {
+ "name": "Hypselosaurus",
+ "description": "This titanosaur's eggs were a foot in diameter."
+ },
+ {
+ "name": "Hypselospinus",
+ "description": "It was once classified as a species of Iguanodon."
+ },
+ {
+ "name": "Hypsibema",
+ "description": "The official state dinosaur of Missouri."
+ },
+ {
+ "name": "Hypsilophodon",
+ "description": "This man-sized herbivore liked to eat and run."
+ },
+ {
+ "name": "Ichthyovenator",
+ "description": "This sail-backed dinosaur was recently discovered in Laos."
+ },
+ {
+ "name": "Ignavusaurus",
+ "description": "Its name means \"cowardly lizard\"."
+ },
+ {
+ "name": "Iguanacolossus",
+ "description": "A brand-new ornithopod from North America."
+ },
+ {
+ "name": "Iguanodon",
+ "description": "The second dinosaur in history ever to receive a name."
+ },
+ {
+ "name": "Ilokelesia",
+ "description": "A primitive abelisaur from South America."
+ },
+ {
+ "name": "Incisivosaurus",
+ "description": "This buck-toothed dinosaur was the Cretaceous equivalent of a beaver."
+ },
+ {
+ "name": "Indosuchus",
+ "description": "This \"Indian crocodile\" was actually a dinosaur."
+ },
+ {
+ "name": "Ingenia",
+ "description": "A small, birdlike dinosaur from central Asia."
+ },
+ {
+ "name": "Irritator",
+ "description": "This spinosaur was named by a very frustrated paleontologist."
+ },
+ {
+ "name": "Isanosaurus",
+ "description": "One of the first sauropods ever to walk the earth."
+ },
+ {
+ "name": "Isisaurus",
+ "description": "Otherwise known as the Indian Statistical Institute Lizard."
+ },
+ {
+ "name": "Jainosaurus",
+ "description": "named after the Indian paleontologist Sohan Lal Jain."
+ },
+ {
+ "name": "Janenschia",
+ "description": "The earliest titanosaur in the fossil record."
+ },
+ {
+ "name": "Jaxartosaurus",
+ "description": "A poorly known hadrosaur from central Asia."
+ },
+ {
+ "name": "Jeholosaurus",
+ "description": "This ornithopod may have had an omnivorous diet."
+ },
+ {
+ "name": "Jeyawati",
+ "description": "Its name is Zuni for \"grinding mouth\"."
+ },
+ {
+ "name": "Jianchangosaurus",
+ "description": "One of the earliest therizinosaurs in the fossil record."
+ },
+ {
+ "name": "Jinfengopteryx",
+ "description": "This feathered dinosaur was once thought to be a true bird."
+ },
+ {
+ "name": "Jingshanosaurus",
+ "description": "A close relative of Yunnanosaurus."
+ },
+ {
+ "name": "Jinzhousaurus",
+ "description": "This Asian dinosaur was one of the first hadrosaurs."
+ },
+ {
+ "name": "Jobaria",
+ "description": "A strange, short-tailed African sauropod."
+ },
+ {
+ "name": "Judiceratops",
+ "description": "The earliest Chasmosaurus ancestor yet identified."
+ },
+ {
+ "name": "Juratyrant",
+ "description": "This early tyrannosaur was discovered in England."
+ },
+ {
+ "name": "Juravenator",
+ "description": "Why didn't this presumed \"dino-bird\" have feathers?"
+ },
+ {
+ "name": "Kaatedocus",
+ "description": "This Diplodocus relative had a characteristic grin."
+ },
+ {
+ "name": "Kaijiangosaurus",
+ "description": "This might have been the same dinosaur as Gasosaurus."
+ },
+ {
+ "name": "Kazaklambia",
+ "description": "This duck-billed dinosaur was discovered in Kazakhstan."
+ },
+ {
+ "name": "Kentrosaurus",
+ "description": "A smaller, African cousin of Stegosaurus."
+ },
+ {
+ "name": "Kerberosaurus",
+ "description": "named after the three-headed dog of Greek myth."
+ },
+ {
+ "name": "Khaan",
+ "description": "Few small mammals dared face the wrath of this dinosaur."
+ },
+ {
+ "name": "Kileskus",
+ "description": "Yet another \"basal\" tyrannosaur from central Asia."
+ },
+ {
+ "name": "Kinnareemimus",
+ "description": "This \"bird mimic\" dinosaur was recently discovered in Thailand."
+ },
+ {
+ "name": "Kol",
+ "description": "It's tied with Mei for \"shortest dinosaur name\"."
+ },
+ {
+ "name": "Koreaceratops",
+ "description": "There's evidence that this ceratopsian liked to go swimming."
+ },
+ {
+ "name": "Koreanosaurus",
+ "description": "Guess what country this ornithopod was discovered in."
+ },
+ {
+ "name": "Kosmoceratops",
+ "description": "This ceratopsian had a bizarre, downward-folding frill."
+ },
+ {
+ "name": "Kotasaurus",
+ "description": "One of the few sauropods to be discovered in India."
+ },
+ {
+ "name": "Kritosaurus",
+ "description": "A famous, but poorly understood hadrosaur."
+ },
+ {
+ "name": "Kryptops",
+ "description": "This dinosaur came equipped with its own face mask."
+ },
+ {
+ "name": "Kukufeldia",
+ "description": "Yet another ornithopod that was once lumped in with Iguanodon."
+ },
+ {
+ "name": "Kulindadromeus",
+ "description": "Why did this ornithopod dinosaur have feathers?"
+ },
+ {
+ "name": "Kundurosaurus",
+ "description": "This hadrosaur was discovered in the far east of Russia."
+ },
+ {
+ "name": "Labocania",
+ "description": "It may or may not have been a true tyrannosaur."
+ },
+ {
+ "name": "Lagosuchus",
+ "description": "Could this have been the ancestor of all the dinosaurs?"
+ },
+ {
+ "name": "Lambeosaurus",
+ "description": "This duck-billed dinosaur had a hatchet-shaped crest on its noggin."
+ },
+ {
+ "name": "Lamplughsaura",
+ "description": "This early sauropod was discovered in India."
+ },
+ {
+ "name": "Lanzhousaurus",
+ "description": "This herbivore's teeth were half a foot long."
+ },
+ {
+ "name": "Laosaurus",
+ "description": "This dubious ornithopod was named by Othniel C. Marsh."
+ },
+ {
+ "name": "Lapparentosaurus",
+ "description": "This sauropod was discovered in Madagascar."
+ },
+ {
+ "name": "Laquintasaura",
+ "description": "The first plant-eating dinosaur ever to be discovered in Venezuela."
+ },
+ {
+ "name": "Latirhinus",
+ "description": "This duck-billed dinosaur had an enormous nose."
+ },
+ {
+ "name": "Leaellynasaura",
+ "description": "One of the few dinosaurs to be named after a little girl."
+ },
+ {
+ "name": "Leinkupal",
+ "description": "The latest surviving diplodocid sauropod."
+ },
+ {
+ "name": "Leonerasaurus",
+ "description": "This prosauropod was recently discovered in Argentina."
+ },
+ {
+ "name": "Leptoceratops",
+ "description": "One of the most primitive of all ceratopsians."
+ },
+ {
+ "name": "Leshansaurus",
+ "description": "Did this meat-eater feast on small, armored dinosaurs?"
+ },
+ {
+ "name": "Lesothosaurus",
+ "description": "One of the earliest of all the ornithischian dinosaurs."
+ },
+ {
+ "name": "Lessemsaurus",
+ "description": "named after the popular science writer Don Lessem."
+ },
+ {
+ "name": "Lexovisaurus",
+ "description": "One of the oldest European stegosaurs."
+ },
+ {
+ "name": "Leyesaurus",
+ "description": "A newly discovered prosauropod from South America."
+ },
+ {
+ "name": "Liaoceratops",
+ "description": "A tiny ceratopsian of early Cretaceous Asia."
+ },
+ {
+ "name": "Liaoningosaurus",
+ "description": "One of the smallest ankylosaurs in the fossil record."
+ },
+ {
+ "name": "Liliensternus",
+ "description": "One of the largest carnivores of the Triassic period."
+ },
+ {
+ "name": "Limaysaurus",
+ "description": "It was once classified as a species of Rebbachisaurus."
+ },
+ {
+ "name": "Limusaurus",
+ "description": "Was this toothless theropod a vegetarian?"
+ },
+ {
+ "name": "Linhenykus",
+ "description": "This tiny dinosaur had single-clawed hands."
+ },
+ {
+ "name": "Linheraptor",
+ "description": "This Mongolian raptor was discovered in 2008."
+ },
+ {
+ "name": "Linhevenato",
+ "description": "r This troodont was recently discovered in Mongolia."
+ },
+ {
+ "name": "Lophorhothon",
+ "description": "The first dinosaur ever to be discovered in Alabama."
+ },
+ {
+ "name": "Lophostropheus",
+ "description": "This theropod lived near the Triassic/Jurassic boundary."
+ },
+ {
+ "name": "Loricatosaurus",
+ "description": "This stegosaur was once classified as a species of Lexovisaurus."
+ },
+ {
+ "name": "Lourinhanosaurus",
+ "description": "Not to be confused with Lourinhasaurus, below."
+ },
+ {
+ "name": "Lourinhasaurus",
+ "description": "Not to be confused with Lourinhanosaurus, above."
+ },
+ {
+ "name": "Luanchuanraptor",
+ "description": "A small, poorly understood Asian raptor."
+ },
+ {
+ "name": "Lufengosaurus",
+ "description": "A common sight at Chinese natural history museums."
+ },
+ {
+ "name": "Lurdusaurus",
+ "description": "This ornithopod resembled a giant sloth."
+ },
+ {
+ "name": "Lusotitan",
+ "description": "This sauropod was once classified as a species of Brachiosaurus."
+ },
+ {
+ "name": "Lycorhinus",
+ "description": "This dinosaur was once thought to be a mammal-like reptile."
+ },
+ {
+ "name": "Lythronax",
+ "description": "This tyrannosaur lived on the island of Laramidia."
+ },
+ {
+ "name": "Machairasaurus",
+ "description": "This \"short scimitar lizard\" was a close relative of Oviraptor."
+ },
+ {
+ "name": "Macrogryphosaurus",
+ "description": "Otherwise known as the Big Enigmatic Lizard."
+ },
+ {
+ "name": "Magnapaulia",
+ "description": "The largest lambeosaurine hadrosaur yet identified."
+ },
+ {
+ "name": "Magnirostris",
+ "description": "This ceratopsian had an unusually big beak."
+ },
+ {
+ "name": "Magnosaurus",
+ "description": "Once thought to be a species of Megalosaurus."
+ },
+ {
+ "name": "Magyarosaurus",
+ "description": "This dwarf titanosaur was probably confined to a small island."
+ },
+ {
+ "name": "Mahakala",
+ "description": "This dino-bird was named after a Buddhist deity."
+ },
+ {
+ "name": "Maiasaura",
+ "description": "This \"good mother lizard\" kept close tabs on her young."
+ },
+ {
+ "name": "Majungasaurus",
+ "description": "Fairly--or unfairly--known as the \"cannibal dinosaur\"."
+ },
+ {
+ "name": "Malawisaurus",
+ "description": "The first titanosaur to be found with an intact skull."
+ },
+ {
+ "name": "Mamenchisaurus",
+ "description": "The longest-necked dinosaur that ever lived."
+ },
+ {
+ "name": "Manidens",
+ "description": "A strangely toothed relative of Heterodontosaurus."
+ },
+ {
+ "name": "Mantellisaurus",
+ "description": "named after the famous fossil hunter Gideon Mantell."
+ },
+ {
+ "name": "Mantellodon",
+ "description": "This Iguanodon refugee may or may not deserve its own genus."
+ },
+ {
+ "name": "Mapusaurus",
+ "description": "This huge carnivore was closely related to Giganotosaurus."
+ },
+ {
+ "name": "Marshosaurus",
+ "description": "named after the famous paleontologist Othniel C. Marsh."
+ },
+ {
+ "name": "Martharaptor",
+ "description": "This dinosaur was named after a Utah paleontologist."
+ },
+ {
+ "name": "Masiakasaurus",
+ "description": "A bizarre, buck-toothed predator of the late Cretaceous."
+ },
+ {
+ "name": "Massospondylus",
+ "description": "This small, lithe, bipedal plant-eater roamed the plains of South Africa."
+ },
+ {
+ "name": "Maxakalisaurus",
+ "description": "One of the biggest titanosaurs ever found in Brazil."
+ },
+ {
+ "name": "Medusaceratops",
+ "description": "This frilled dinosaur was a close relative of Centrosaurus."
+ },
+ {
+ "name": "Megalosaurus",
+ "description": "The first dinosaur ever to be discovered and named."
+ },
+ {
+ "name": "Megapnosaurus",
+ "description": "Its name is Greek for \"big dead lizard\"."
+ },
+ {
+ "name": "Megaraptor",
+ "description": "Despite its name, it wasn't really a raptor."
+ },
+ {
+ "name": "Mei",
+ "description": "The current record-holder for \"shortest dinosaur name\"."
+ },
+ {
+ "name": "Melanorosaurus",
+ "description": "Probably the largest prosauropod that ever lived."
+ },
+ {
+ "name": "Mendozasaurus",
+ "description": "This titanosaur was ancestral to Futalognkosaurus."
+ },
+ {
+ "name": "Mercuriceratops",
+ "description": "This ceratopsian was discovered on the U.S./Canada border."
+ },
+ {
+ "name": "Metriacanthosaurus",
+ "description": "Yet another dinosaur that was once mistaken for Megalosaurus."
+ },
+ {
+ "name": "Microceratops",
+ "description": "Probably the smallest ceratopsian that ever lived."
+ },
+ {
+ "name": "Micropachycephalosaurus",
+ "description": "The current record-holder for longest dinosaur name."
+ },
+ {
+ "name": "Microraptor",
+ "description": "This tiny feathered dinosaur had four wings rather than two."
+ },
+ {
+ "name": "Microvenator",
+ "description": "This \"tiny hunter\" actually measured 10 feet from head to tail."
+ },
+ {
+ "name": "Minmi",
+ "description": "An early (and very dumb) ankylosaur from Australia."
+ },
+ {
+ "name": "Minotaurasaurus",
+ "description": "named after the half-man, half-bull of Greek myth."
+ },
+ {
+ "name": "Miragaia",
+ "description": "This stegosaur had an unusually long neck."
+ },
+ {
+ "name": "Mirischia",
+ "description": "Its name means \"wonderful pelvis\"."
+ },
+ {
+ "name": "Mochlodon",
+ "description": "One of the few dinosaurs ever to be discovered in Austria."
+ },
+ {
+ "name": "Mojoceratops",
+ "description": "This ceratopsian had a heart-shaped frill."
+ },
+ {
+ "name": "Monkonosaurus",
+ "description": "The first dinosaur ever to be discovered in modern-day Tibet."
+ },
+ {
+ "name": "Monoclonius",
+ "description": "Might this have been a species of Centrosaurus?"
+ },
+ {
+ "name": "Monolophosaurus",
+ "description": "This Jurassic predator had a single crest on its skull."
+ },
+ {
+ "name": "Mononykus",
+ "description": "This dinosaur may have dug into termite mounds for its lunch."
+ },
+ {
+ "name": "Montanoceratops",
+ "description": "A primitive ceratopsian of the late Cretaceous period."
+ },
+ {
+ "name": "Mussaurus",
+ "description": "This \"mouse lizard\" lived in Triassic South America."
+ },
+ {
+ "name": "Muttaburrasaurus",
+ "description": "The most complete dinosaur fossil ever found in Australia."
+ },
+ {
+ "name": "Mymoorapelta",
+ "description": "named after the Mygand-Moore quarry in Colorado."
+ },
+ {
+ "name": "Nankangia",
+ "description": "A recently discovered oviraptor from China."
+ },
+ {
+ "name": "Nanosaurus",
+ "description": "This \"tiny lizard\" was named by Othniel C. Marsh."
+ },
+ {
+ "name": "Nanotyrannus",
+ "description": "Could this have been a juvenile T. Rex?"
+ },
+ {
+ "name": "Nanshiungosaurus",
+ "description": "A bizarre therizinosaur from Asia."
+ },
+ {
+ "name": "Nanuqsaurus",
+ "description": "This \"polar lizard\" was recently discovered in Alaska."
+ },
+ {
+ "name": "Nanyangosaurus",
+ "description": "An iguanodontid ornithopod of middle Cretaceous Asia."
+ },
+ {
+ "name": "Nasutoceratops",
+ "description": "This dinosaur had horns like a modern steer."
+ },
+ {
+ "name": "Nebulasaurus",
+ "description": "This \"nebula lizard\" was recently discovered in China."
+ },
+ {
+ "name": "Nedcolbertia",
+ "description": "named after the famous paleontologist Edwin Colbert."
+ },
+ {
+ "name": "Neimongosaurus",
+ "description": "A rare therizinosaur from inner Mongolia."
+ },
+ {
+ "name": "Nemegtomaia",
+ "description": "This dinosaur had a bizarrely shaped skull."
+ },
+ {
+ "name": "Nemegtosaurus",
+ "description": "This titanosaur has been recreated from a single, incomplete skull."
+ },
+ {
+ "name": "Neovenator",
+ "description": "One of the largest carnivorous dinosaurs of western Europe."
+ },
+ {
+ "name": "Neuquenraptor",
+ "description": "It may actually be a species (or specimen) of Unenlagia."
+ },
+ {
+ "name": "Neuquensaurus",
+ "description": "Was this titanosaur really a species of Saltasaurus?"
+ },
+ {
+ "name": "Nigersaurus",
+ "description": "This African sauropod had a huge number of teeth."
+ },
+ {
+ "name": "Nipponosaurus",
+ "description": "This hadrosaur was discovered on the island of Sakhalin."
+ },
+ {
+ "name": "Noasaurus",
+ "description": "Were this predator's giant claws on its hands, or on its feet?"
+ },
+ {
+ "name": "Nodocephalosaurus",
+ "description": "This armored dinosaur has been reconstructed from a single skull."
+ },
+ {
+ "name": "Nodosaurus",
+ "description": "One of the first armored dinosaurs ever discovered in North America."
+ },
+ {
+ "name": "Nomingia",
+ "description": "This small dinosaur had a peacock-like tail."
+ },
+ {
+ "name": "Nothronychus",
+ "description": "The first therizonosaur to be found outside Asia."
+ },
+ {
+ "name": "Notohypsilophodon",
+ "description": "A rare South American ornithopod."
+ },
+ {
+ "name": "Nqwebasaurus",
+ "description": "One of the few theropods to be discovered in sub-Saharan Africa."
+ },
+ {
+ "name": "Nuthetes",
+ "description": "This raptor was named after the modern monitor lizard."
+ },
+ {
+ "name": "Nyasasaurus",
+ "description": "Could this be the earliest dinosaur in the fossil record?"
+ },
+ {
+ "name": "Ojoceratops",
+ "description": "A very close relative of Triceratops."
+ },
+ {
+ "name": "Olorotitan",
+ "description": "One of the most complete dinosaur fossils ever found in Russia."
+ },
+ {
+ "name": "Omeisaurus",
+ "description": "One of the most common Chinese sauropods."
+ },
+ {
+ "name": "Oohkotokia",
+ "description": "Its name is Blackfoot for \"large stone\"."
+ },
+ {
+ "name": "Opisthocoelicaudia",
+ "description": "A clumsily named titanosaur of the late Cretaceous period."
+ },
+ {
+ "name": "Orkoraptor",
+ "description": "The southernmost theropod ever to live in South America."
+ },
+ {
+ "name": "Ornithodesmus",
+ "description": "This mysterious raptor was once thought to be a pterosaur."
+ },
+ {
+ "name": "Ornitholestes",
+ "description": "This \"bird robber\" probably preyed on small lizards instead."
+ },
+ {
+ "name": "Ornithomimus",
+ "description": "This \"bird mimic\" resembled a modern ostrich."
+ },
+ {
+ "name": "Ornithopsis",
+ "description": "This \"bird face\" was actually a genus of titanosaur."
+ },
+ {
+ "name": "Orodromeus",
+ "description": "This tiny herbivore was on Troodon's dinner menu."
+ },
+ {
+ "name": "Orthomerus",
+ "description": "One of the few dinosaurs to be discovered in Holland."
+ },
+ {
+ "name": "Oryctodromeus",
+ "description": "The only ornithopod known to have lived in burrows."
+ },
+ {
+ "name": "Ostafrikasaurus",
+ "description": "Could this have been the earliest known spinosaur?"
+ },
+ {
+ "name": "Othnielia",
+ "description": "named after the famous paleontologist Othniel C. Marsh."
+ },
+ {
+ "name": "Othnielosaurus",
+ "description": "Also named after the famous paleontologist Othniel C. Marsh."
+ },
+ {
+ "name": "Ouranosaurus",
+ "description": "Scientists can't decide if this herbivore had a sail or a hump."
+ },
+ {
+ "name": "Overosaurus",
+ "description": "This dwarf titanosaur was announced to the world in 2013."
+ },
+ {
+ "name": "Oviraptor",
+ "description": "Turns out that this \"egg thief\" got a bad rap."
+ },
+ {
+ "name": "Oxalaia",
+ "description": "This spinosaur was recently discovered in Brazil."
+ },
+ {
+ "name": "Ozraptor",
+ "description": "Not much is known about this Australian theropod."
+ },
+ {
+ "name": "Pachycephalosaurus",
+ "description": "This plant-eater gave new meaning to the word \"blockhead\"."
+ },
+ {
+ "name": "Pachyrhinosaurus",
+ "description": "This \"thick-nosed lizard\" roamed the North American forests."
+ },
+ {
+ "name": "Palaeoscincus",
+ "description": "This \"ancient skink\" was actually an armored dinosaur."
+ },
+ {
+ "name": "Paluxysaurus",
+ "description": "The official Texas state dinosaur."
+ },
+ {
+ "name": "Pampadromaeus",
+ "description": "This \"Pampas runner\" was ancestral to sauropods."
+ },
+ {
+ "name": "Pamparaptor",
+ "description": "This raptor was discovered in the Argentinian Pampas."
+ },
+ {
+ "name": "Panamericansaurus",
+ "description": "This titanosaur was named after an energy company."
+ },
+ {
+ "name": "Panoplosaurus",
+ "description": "A squat, stocky nodosaur of the late Cretaceous."
+ },
+ {
+ "name": "Panphagia",
+ "description": "Its name is Greek for \"eats everything\"."
+ },
+ {
+ "name": "Pantydraco",
+ "description": "No, this dinosaur didn't wear you-know-what."
+ },
+ {
+ "name": "Paralititan",
+ "description": "This huge sauropod was discovered recently in Egypt."
+ },
+ {
+ "name": "Paranthodon",
+ "description": "This stegosaur was discovered over 150 years ago."
+ },
+ {
+ "name": "Pararhabdodon",
+ "description": "The western European equivalent of Tsintaosaurus."
+ },
+ {
+ "name": "Parasaurolophus",
+ "description": "Possibly the loudest dinosaur ever to roam the earth."
+ },
+ {
+ "name": "Parksosaurus",
+ "description": "It was once classified as a species of Thescelosaurus."
+ },
+ {
+ "name": "Paronychodon",
+ "description": "This \"tooth taxon\" didn't make it out of the 19th century."
+ },
+ {
+ "name": "Parvicursor",
+ "description": "One of the smallest dinosaurs yet identified."
+ },
+ {
+ "name": "Patagosaurus",
+ "description": "This \"Patagonian lizard\" hailed from South America."
+ },
+ {
+ "name": "Pawpawsaurus",
+ "description": "This ancient nodosaur was discovered in Texas."
+ },
+ {
+ "name": "Pedopenna",
+ "description": "One of the earliest known dino-birds."
+ },
+ {
+ "name": "Pegomastax",
+ "description": "This dinosaur was covered with porcupine-like bristles."
+ },
+ {
+ "name": "Pelecanimimus",
+ "description": "This \"pelican mimic\" sported over 200 teeth."
+ },
+ {
+ "name": "Peloroplites",
+ "description": "This \"monstrous Hoplite\" was recently discovered in Utah."
+ },
+ {
+ "name": "Pelorosaurus",
+ "description": "The first sauropod ever to be discovered."
+ },
+ {
+ "name": "Pentaceratops",
+ "description": "This \"five-horned\" herbivore really had only three."
+ },
+ {
+ "name": "Philovenator",
+ "description": "As its name says this dinosaur \"loved to hunt\"."
+ },
+ {
+ "name": "Phuwiangosaurus",
+ "description": "This titanosaur was discovered in modern-day Thailand."
+ },
+ {
+ "name": "Piatnitzkysaurus",
+ "description": "Its teeth were as sharp as its name is funny."
+ },
+ {
+ "name": "Pinacosaurus",
+ "description": "Did this ankylosaur roam central Asia in herds?"
+ },
+ {
+ "name": "Pisanosaurus",
+ "description": "One of the earliest known ornithischian dinosaurs."
+ },
+ {
+ "name": "Piveteausaurus",
+ "description": "No one is quite sure what to make of this theropod dinosaur."
+ },
+ {
+ "name": "Planicoxa",
+ "description": "A medium-sized iguanodont of early Cretaceous North America."
+ },
+ {
+ "name": "Plateosaurus",
+ "description": "This herd dinosaur blackened the plains of the late Triassic."
+ },
+ {
+ "name": "Pleurocoelus",
+ "description": "It was the official state dinosaur of Texas."
+ },
+ {
+ "name": "Pneumatoraptor",
+ "description": "This \"air thief\" was recently discovered in Hungary."
+ },
+ {
+ "name": "Podokesaurus",
+ "description": "One of the earliest dinosaurs to live in eastern North America."
+ },
+ {
+ "name": "Poekilopleuron",
+ "description": "It may (or may not) have been a species of Megalosaurus."
+ },
+ {
+ "name": "Polacanthus",
+ "description": "An extremely spiky ankylosaur of the middle Cretaceous."
+ },
+ {
+ "name": "Prenocephale",
+ "description": "This \"bonehead\" had a round, thick skull."
+ },
+ {
+ "name": "Prenoceratops",
+ "description": "A close relative of Leptoceratops."
+ },
+ {
+ "name": "Proa",
+ "description": "This ornithopod was named after its prow-shaped jaw."
+ },
+ {
+ "name": "Probactrosaurus",
+ "description": "An early stage in hadrosaur evolution."
+ },
+ {
+ "name": "Proceratosaurus",
+ "description": "Despite its name, not a close relative of Ceratosaurus."
+ },
+ {
+ "name": "Procompsognathus",
+ "description": "Was it an archosaur or an early dinosaur?"
+ },
+ {
+ "name": "Propanoplosaurus",
+ "description": "This baby ankylosaur was recently discovered in Maryland."
+ },
+ {
+ "name": "Prosaurolophus",
+ "description": "The likely ancestor of both Saurolophus and Parasaurolophus."
+ },
+ {
+ "name": "Protarchaeopteryx",
+ "description": "Before Archaeopteryx? It actually lived millions of years later."
+ },
+ {
+ "name": "Protoceratops",
+ "description": "A famous dinosaur with a very funky frill."
+ },
+ {
+ "name": "Protohadros",
+ "description": "Despite its name, it wasn't really the \"first\" hadrosaur."
+ },
+ {
+ "name": "Psittacosaurus",
+ "description": "This dinosaur's noggin wouldn't have looked out of place on a parrot."
+ },
+ {
+ "name": "Puertasaurus",
+ "description": "This titanosaur rivaled Argentinosaurus in size."
+ },
+ {
+ "name": "Pyroraptor",
+ "description": "This \"fire thief\" prowled the plains of prehistoric France."
+ },
+ {
+ "name": "Qantassaurus",
+ "description": "named after the national airline of Australia."
+ },
+ {
+ "name": "Qianzhousaurus",
+ "description": "This long-snouted tyrannosaur has been nicknamed Pinocchio Rex."
+ },
+ {
+ "name": "Qiaowanlong",
+ "description": "An Asian relative of Brachiosaurus."
+ },
+ {
+ "name": "Qiupalong",
+ "description": "This \"bird mimic\" dinosaur was recently discovered in China."
+ },
+ {
+ "name": "Quaesitosaurus",
+ "description": "This titanosaur may have had remarkably sharp hearing."
+ },
+ {
+ "name": "Quilmesaurus",
+ "description": "This dinosaur was named after an indigenous South American tribe."
+ },
+ {
+ "name": "Rahiolisaurus",
+ "description": "This Indian dinosaur is represented by seven tangled individuals."
+ },
+ {
+ "name": "Rahonavis",
+ "description": "Was it a raptor-like bird or a bird-like raptor?"
+ },
+ {
+ "name": "Rajasaurus",
+ "description": "This \"prince lizard\" lived in what is now modern-day India."
+ },
+ {
+ "name": "Rapator",
+ "description": "No, this mysterious Australian theropod wasn't a raptor."
+ },
+ {
+ "name": "Rapetosaurus",
+ "description": "The only sauropod ever to be discovered on modern-day Madagascar."
+ },
+ {
+ "name": "Raptorex",
+ "description": "A pint-sized precursor of T. Rex."
+ },
+ {
+ "name": "Rebbachisaurus",
+ "description": "A poorly understood sauropod from northern Africa."
+ },
+ {
+ "name": "Regaliceratops",
+ "description": "This ceratopsian had a huge, crown-shaped frill."
+ },
+ {
+ "name": "Regnosaurus",
+ "description": "This stegosaur lived in what is now modern-day England."
+ },
+ {
+ "name": "Rhabdodon",
+ "description": "A possible \"missing link\" between Iguanodon and Hypsilophodon."
+ },
+ {
+ "name": "Rhinorex",
+ "description": "This duck-billed dinosaur had an unusually large nose."
+ },
+ {
+ "name": "Rhoetosaurus",
+ "description": "A medium-sized sauropod from Down Under."
+ },
+ {
+ "name": "Richardoestesia",
+ "description": "named after the paleontologist Richard Estes."
+ },
+ {
+ "name": "Rinchenia",
+ "description": "named after the famous paleontologist Rinchen Barsbold."
+ },
+ {
+ "name": "Rinconsaurus",
+ "description": "A modestly sized titanosaur of South America."
+ },
+ {
+ "name": "Riojasaurus",
+ "description": "One of the few prosauropods known to have lived in South America."
+ },
+ {
+ "name": "Rubeosaurus",
+ "description": "A ceratopsian dinosaur from the Two Medicine Formation."
+ },
+ {
+ "name": "Rugops",
+ "description": "This wrinkly-faced carnivore probably fed on abandoned carcasses."
+ },
+ {
+ "name": "Sahaliyania",
+ "description": "This hadrosaur's name is Manchurian for \"black\"."
+ },
+ {
+ "name": "Saichania",
+ "description": "This ankylosaur's name is Chinese for \"beautiful\"."
+ },
+ {
+ "name": "Saltasaurus",
+ "description": "The first armored sauropod ever to be discovered."
+ },
+ {
+ "name": "Saltopus",
+ "description": "Experts aren't sure if this was a dinosaur or an archosaur."
+ },
+ {
+ "name": "Sanjuansaurus",
+ "description": "An early theropod from South America."
+ },
+ {
+ "name": "Santanaraptor",
+ "description": "named after Brazil's Santana formation."
+ },
+ {
+ "name": "Sarahsaurus",
+ "description": "This prosauropod had unusually strong hands."
+ },
+ {
+ "name": "Sarcolestes",
+ "description": "The most likely ancestor of the ankylosaurs."
+ },
+ {
+ "name": "Sarcosaurus",
+ "description": "This \"flesh lizard\" roamed early Jurassic England."
+ },
+ {
+ "name": "Saturnalia",
+ "description": "The earliest dinosaur known to have had a herbivorous diet."
+ },
+ {
+ "name": "Saurolophus",
+ "description": "One of the few hadrosaurs known to have lived on two continents."
+ },
+ {
+ "name": "Sauroniops",
+ "description": "This dinosaur's name means \"Eye of Sauron\"."
+ },
+ {
+ "name": "Sauropelta",
+ "description": "This ankylosaur's armor helped keep raptors at bay."
+ },
+ {
+ "name": "Saurophaganax",
+ "description": "The official state dinosaur of Oklahoma."
+ },
+ {
+ "name": "Sauroposeidon",
+ "description": "One of the tallest dinosaurs ever to walk the earth."
+ },
+ {
+ "name": "Saurornithoides",
+ "description": "A Troodon-like predator from central Asia."
+ },
+ {
+ "name": "Saurornitholestes",
+ "description": "A close cousin of Velociraptor."
+ },
+ {
+ "name": "Savannasaurus",
+ "description": "This titanosaur was recently discovered in Australia."
+ },
+ {
+ "name": "Scansoriopteryx",
+ "description": "This early proto-bird probably lived in trees."
+ },
+ {
+ "name": "Scelidosaurus",
+ "description": "Among the earliest of all the armored dinosaurs."
+ },
+ {
+ "name": "Scipionyx",
+ "description": "One of the most perfectly preserved dinosaur fossils ever found."
+ },
+ {
+ "name": "Sciurumimus",
+ "description": "This \"squirrel mimic\" was one of the earliest feathered dinosaurs."
+ },
+ {
+ "name": "Scolosaurus",
+ "description": "It was once classified as a species of Euoplocephalus."
+ },
+ {
+ "name": "Scutellosaurus",
+ "description": "Probably the smallest of all the armored dinosaurs."
+ },
+ {
+ "name": "Secernosaurus",
+ "description": "The first hadrosaur to be discovered in South America."
+ },
+ {
+ "name": "Seitaad",
+ "description": "This small dinosaur may have been buried in an avalanche."
+ },
+ {
+ "name": "Segisaurus",
+ "description": "An early dinosaur closely related to Coelophysis."
+ },
+ {
+ "name": "Segnosaurus",
+ "description": "One of the most unusual (and poorly understood) Cretaceous dinosaurs."
+ },
+ {
+ "name": "Seismosaurus",
+ "description": "It was huge, to be sure, but might it have been a species of Diplodocus?"
+ },
+ {
+ "name": "Sellosaurus",
+ "description": "Another early prosauropod of the Triassic period."
+ },
+ {
+ "name": "Serendipaceratops",
+ "description": "Was this really an Australian ceratopsian?"
+ },
+ {
+ "name": "Shamosaurus",
+ "description": "This Mongolian ankylosaur was a close relative of Gobisaurus."
+ },
+ {
+ "name": "Shanag",
+ "description": "A basal raptor of early Cretaceous Asia."
+ },
+ {
+ "name": "Shantungosaurus",
+ "description": "The biggest of all the duck-billed dinosaurs."
+ },
+ {
+ "name": "Shaochilong",
+ "description": "Its name is Chinese for \"shark-toothed dragon\"."
+ },
+ {
+ "name": "Shenzhousaurus",
+ "description": "A small, primitive ornithomimid from China."
+ },
+ {
+ "name": "Shunosaurus",
+ "description": "Anatomically speaking, probably the best known of all the sauropods."
+ },
+ {
+ "name": "Shuvosaurus",
+ "description": "Was this meat eater an early dinosaur or a two-legged crocodile?"
+ },
+ {
+ "name": "Shuvuuia",
+ "description": "Scientists can't decide if it was a dinosaur or a bird."
+ },
+ {
+ "name": "Siamodon",
+ "description": "This ornithopod was recently discovered in Thailand."
+ },
+ {
+ "name": "Siamosaurus",
+ "description": "This may (or may not) have been a spinosaur from Thailand."
+ },
+ {
+ "name": "Siamotyrannus",
+ "description": "Despite its name, it wasn't a true tyrannosaur."
+ },
+ {
+ "name": "Siats",
+ "description": "One of the largest theropods ever to live in North America."
+ },
+ {
+ "name": "Sigilmassasaurus",
+ "description": "Was this really a species of Carcharodontosaurus?"
+ },
+ {
+ "name": "Silvisaurus",
+ "description": "This primitive nodosaur was discovered in Kansas."
+ },
+ {
+ "name": "Similicaudipteryx",
+ "description": "The juveniles may have been differently feathered than the adults."
+ },
+ {
+ "name": "Sinocalliopteryx",
+ "description": "The biggest \"dino-bird\" yet discovered."
+ },
+ {
+ "name": "Sinoceratops",
+ "description": "A rare ceratopsian from late Cretaceous China."
+ },
+ {
+ "name": "Sinornithoides",
+ "description": "A small, feathered dinosaur closely related to Troodon."
+ },
+ {
+ "name": "Sinornithomimus",
+ "description": "This ornithomimid is known from over a dozen skeletons."
+ },
+ {
+ "name": "Sinornithosaurus",
+ "description": "A typical dino-bird of the early Cretaceous."
+ },
+ {
+ "name": "Sinosauropteryx",
+ "description": "The first dinosaur proven to have feathers."
+ },
+ {
+ "name": "Sinosaurus",
+ "description": "It was once classified as an Asian species of Dilophosaurus."
+ },
+ {
+ "name": "Sinotyrannus",
+ "description": "This \"Chinese tyrant\" was an ancient ancestor of tyrannosaurs."
+ },
+ {
+ "name": "Sinovenator",
+ "description": "This \"Chinese hunter\" preyed on its fellow dino-birds."
+ },
+ {
+ "name": "Sinraptor",
+ "description": "Despite its name, this allosaur wasn't any better or worse than other dinosaurs."
+ },
+ {
+ "name": "Sinusonasus",
+ "description": "It sounds like a disease, but it was actually a feathered dinosaur."
+ },
+ {
+ "name": "Skorpiovenator",
+ "description": "This \"scorpion hunter\" really ate meat."
+ },
+ {
+ "name": "Sonorasaurus",
+ "description": "The remains of this sauropod were discovered in Arizona."
+ },
+ {
+ "name": "Sphaerotholus",
+ "description": "Yet another dome-headed dino from North America."
+ },
+ {
+ "name": "Spinophorosaurus",
+ "description": "This early sauropod had a \"thagomizer\" on its tail."
+ },
+ {
+ "name": "Spinops",
+ "description": "This ceratopsian was named 100 years after its bones were found."
+ },
+ {
+ "name": "Spinosaurus",
+ "description": "This dinosaur was distinguished by the sail-like structure on its back."
+ },
+ {
+ "name": "Spinostropheus",
+ "description": "This theropod was once thought to be a species of Elaphrosaurus."
+ },
+ {
+ "name": "Staurikosaurus",
+ "description": "Another primitive theropod of the Triassic period."
+ },
+ {
+ "name": "Stegoceras",
+ "description": "This small herbivore was built for high-speed head-butting."
+ },
+ {
+ "name": "Stegosaurus",
+ "description": "The small-brained, spike-tailed, plant-eating dinosaur."
+ },
+ {
+ "name": "Stenopelix",
+ "description": "Experts aren't sure how to classify this dinosaur."
+ },
+ {
+ "name": "Stokesosaurus",
+ "description": "Some experts think this was the earliest tyrannosaur."
+ },
+ {
+ "name": "Struthiomimus",
+ "description": "This \"ostrich mimic\" roamed the plains of North America."
+ },
+ {
+ "name": "Struthiosaurus",
+ "description": "The smallest nodosaur yet discovered."
+ },
+ {
+ "name": "Stygimoloch",
+ "description": "Its name means \"demon from the river of death.\" Got your attention yet?"
+ },
+ {
+ "name": "Styracosaurus",
+ "description": "Winner of the \"most elaborate head display\" competition."
+ },
+ {
+ "name": "Suchomimus",
+ "description": "A fish-eating dinosaur with a distinct crocodilian profile."
+ },
+ {
+ "name": "Sulaimanisaurus",
+ "description": "One of the few dinosaurs ever to be discovered in Pakistan."
+ },
+ {
+ "name": "Supersaurus",
+ "description": "No, it didn't wear a cape, but this giant dino was still impressive."
+ },
+ {
+ "name": "Suuwassea",
+ "description": "Its name is Native American for \"ancient thunder\"."
+ },
+ {
+ "name": "Suzhousaurus",
+ "description": "A large, early Cretaceous therizinosaur."
+ },
+ {
+ "name": "Szechuanosaurus",
+ "description": "This theropod was a close relative of Sinraptor."
+ },
+ {
+ "name": "Tachiraptor",
+ "description": "The first meat-eating dinosaur ever to be discovered in Venezuela."
+ },
+ {
+ "name": "Talarurus",
+ "description": "This ankylosaur was discovered in the Gobi Desert."
+ },
+ {
+ "name": "Talos",
+ "description": "This dinosaur was found with an injured big toe."
+ },
+ {
+ "name": "Tangvayosaurus",
+ "description": "This Laotian titanosaur was closely related to Phuwiangosaurus."
+ },
+ {
+ "name": "Tanius",
+ "description": "Not much is known about this Chinese hadrosaur."
+ },
+ {
+ "name": "Tanycolagreus",
+ "description": "This mysterious theropod was once thought to be a species of Coelurus."
+ },
+ {
+ "name": "Taohelong",
+ "description": "The first \"polacanthine\" ankylosaur ever to be discovered in Asia."
+ },
+ {
+ "name": "Tapuiasaurus",
+ "description": "A recently discovered titanosaur from South America."
+ },
+ {
+ "name": "Tarascosaurus",
+ "description": "The only known abelisaur of the northern hemisphere."
+ },
+ {
+ "name": "Tarbosaurus",
+ "description": "The second-biggest tyrannosaur after T. Rex."
+ },
+ {
+ "name": "Tarchia",
+ "description": "Its name means \"brainy,\" but that may be an exaggeration."
+ },
+ {
+ "name": "Tastavinsaurus",
+ "description": "This titanosaur was discovered in Spain."
+ },
+ {
+ "name": "Tatankacephalus",
+ "description": "A brand-new ankylosaur from North America."
+ },
+ {
+ "name": "Tatankaceratops",
+ "description": "Was this really a juvenile specimen of Triceratops?"
+ },
+ {
+ "name": "Tataouinea",
+ "description": "No, this dinosaur wasn't named after Tatooine in Star Wars."
+ },
+ {
+ "name": "Tawa",
+ "description": "This ancient theropod points to a South American origin for dinosaurs."
+ },
+ {
+ "name": "Tazoudasaurus",
+ "description": "This Vulcanodon relative was one of the earliest sauropods."
+ },
+ {
+ "name": "Technosaurus",
+ "description": "This early herbivore was named after Texas Tech university."
+ },
+ {
+ "name": "Tehuelchesaurus",
+ "description": "This sauropod was named after an indigenous South American people."
+ },
+ {
+ "name": "Telmatosaurus",
+ "description": "This duck-billed dinosaur was discovered in Transylvania."
+ },
+ {
+ "name": "Tendaguria",
+ "description": "This Tanzanian sauropod has proven difficult to classify."
+ },
+ {
+ "name": "Tenontosaurus",
+ "description": "This long-tailed herbivore was hunted by Deinonychus."
+ },
+ {
+ "name": "Teratophoneus",
+ "description": "This \"monstrous murderer\" wasn't all that big."
+ },
+ {
+ "name": "Tethyshadros",
+ "description": "One of the few dinosaurs to be found in modern-day Italy."
+ },
+ {
+ "name": "Texacephale",
+ "description": "This Texan pachycephalosaur was named in 2010."
+ },
+ {
+ "name": "Thecocoelurus",
+ "description": "Is this the earliest ornithomimid in the fossil record?"
+ },
+ {
+ "name": "Thecodontosaurus",
+ "description": "The first prosauropod ever to be discovered."
+ },
+ {
+ "name": "Theiophytalia",
+ "description": "Its name means \"garden of the gods\"."
+ },
+ {
+ "name": "Therizinosaurus",
+ "description": "What did Little Orphan Annie say to this dinosaur? \"Reaping lizards!\""
+ },
+ {
+ "name": "Thescelosaurus",
+ "description": "Did paleontologists find this dinosaur's mummified heart?"
+ },
+ {
+ "name": "Tianchisaurus",
+ "description": "This dinosaur's species name honors \"Jurassic Park\"."
+ },
+ {
+ "name": "Tianyulong",
+ "description": "Why did this ornithopod have feathers?"
+ },
+ {
+ "name": "Tianyuraptor",
+ "description": "A small, long-legged raptor from eastern Asia."
+ },
+ {
+ "name": "Tianzhenosaurus",
+ "description": "This ankylosaur's skull has been spectacularly preserved."
+ },
+ {
+ "name": "Timimus",
+ "description": "The only ornithomimid ever discovered in Australia."
+ },
+ {
+ "name": "Titanoceratops",
+ "description": "The biggest of all the horned, frilled dinosaurs."
+ },
+ {
+ "name": "Titanosaurus",
+ "description": "This sauropod may—or may not—have been a unique member of its genus."
+ },
+ {
+ "name": "Tochisaurus",
+ "description": "A large troodont of late Cretaceous Asia."
+ },
+ {
+ "name": "Tornieria",
+ "description": "This sauropod has a complicated taxonomic history."
+ },
+ {
+ "name": "Torosaurus",
+ "description": "Was it really an elderly specimen of Triceratops?"
+ },
+ {
+ "name": "Torvosaurus",
+ "description": "One of the largest predators of Jurassic North America."
+ },
+ {
+ "name": "Triceratops",
+ "description": "The famous, three-horned, plant-eating dinosaur."
+ },
+ {
+ "name": "Trinisaura",
+ "description": "The first ornithopod ever to be discovered in Antarctica."
+ },
+ {
+ "name": "Troodon",
+ "description": "Possibly the smartest dinosaur that ever lived."
+ },
+ {
+ "name": "Tsaagan",
+ "description": "One of the earliest raptors yet discovered."
+ },
+ {
+ "name": "Tsintaosaurus",
+ "description": "Also known as the \"Unicorn Dinosaur\"."
+ },
+ {
+ "name": "Tuojiangosaurus",
+ "description": "One of the most well-known Chinese stegosaurs."
+ },
+ {
+ "name": "Turanoceratops",
+ "description": "What was this ceratopsian doing in late Cretaceous Asia?"
+ },
+ {
+ "name": "Turiasaurus",
+ "description": "The largest dinosaur ever to be discovered in Europe."
+ },
+ {
+ "name": "Tylocephale",
+ "description": "The tallest-domed of all the pachycephalosaurs."
+ },
+ {
+ "name": "Tyrannosaurus Rex",
+ "description": "The once—and always—king of the dinosaurs."
+ },
+ {
+ "name": "Tyrannotitan",
+ "description": "We know very little about this fearsomely named dinosaur."
+ },
+ {
+ "name": "Uberabatitan",
+ "description": "Discovered in the Uberaba region of Brazil."
+ },
+ {
+ "name": "Udanoceratops",
+ "description": "The largest ceratopsian to run on two legs."
+ },
+ {
+ "name": "Unaysaurus",
+ "description": "One of the oldest prosauropods yet discovered."
+ },
+ {
+ "name": "Unenlagia",
+ "description": "This bird-like raptor was native to South America."
+ },
+ {
+ "name": "Unescoceratops",
+ "description": "named after the United Nation's UNESCO."
+ },
+ {
+ "name": "Urbacodon",
+ "description": "This Troodon-like predator was discovered in Uzbekistan."
+ },
+ {
+ "name": "Utahceratops",
+ "description": "Guess what state this dinosaur was discovered in."
+ },
+ {
+ "name": "Utahraptor",
+ "description": "Probably the biggest raptor that ever lived."
+ },
+ {
+ "name": "Uteodon",
+ "description": "It was once classified as a species of Camptosaurus."
+ },
+ {
+ "name": "Vagaceratops",
+ "description": "This big-frilled dinosaur was closely related to Kosmoceratops."
+ },
+ {
+ "name": "Vahiny",
+ "description": "Its name is Malagasy for \"traveler\"."
+ },
+ {
+ "name": "Valdoraptor",
+ "description": "This early \"bird mimic\" dinosaur lived in England."
+ },
+ {
+ "name": "Valdosaurus",
+ "description": "This ornithopod was discovered on the Isle of Wight."
+ },
+ {
+ "name": "Variraptor",
+ "description": "The first raptor ever to be discovered in France."
+ },
+ {
+ "name": "Velafrons",
+ "description": "A new addition to the duck-billed dinosaur family."
+ },
+ {
+ "name": "Velociraptor",
+ "description": "This dinosaur was vicious but a lot smaller than you thought."
+ },
+ {
+ "name": "Velocisaurus",
+ "description": "A small, speedy theropod of late Cretaceous South America."
+ },
+ {
+ "name": "Venenosaurus",
+ "description": "This \"poison lizard\" was really a gentle plant-eater."
+ },
+ {
+ "name": "Veterupristisaurus",
+ "description": "One of the earliest carcharodontosaurs yet identified."
+ },
+ {
+ "name": "Vulcanodon",
+ "description": "An early sauropod of the Jurassic period."
+ },
+ {
+ "name": "Wannanosaurus",
+ "description": "Probably the smallest of all the bone-headed dinosaurs."
+ },
+ {
+ "name": "Wellnhoferia",
+ "description": "Was it really a species of Archaeopteryx?"
+ },
+ {
+ "name": "Wendiceratops",
+ "description": "This dinosaur honors Canadian fossil hunter Wendy Sloboda."
+ },
+ {
+ "name": "Willinakaqe",
+ "description": "A rare duck-billed dinosaur from South America."
+ },
+ {
+ "name": "Wintonotitan",
+ "description": "Another new titanosaur from Australia."
+ },
+ {
+ "name": "Wuerhosaurus",
+ "description": "Could this have been the last of the stegosaurs?"
+ },
+ {
+ "name": "Wulagasaurus",
+ "description": "The earliest saurolophine hadrosaur in the fossil record."
+ },
+ {
+ "name": "Xenoceratops",
+ "description": "This \"alien horned face\" was announced in 2012."
+ },
+ {
+ "name": "Xenoposeidon",
+ "description": "Experts aren't sure how to classify this sauropod."
+ },
+ {
+ "name": "Xenotarsosaurus",
+ "description": "A poorly understood abelisaur from South America."
+ },
+ {
+ "name": "Xiaosaurus",
+ "description": "A small ornithopod from late Jurassic Asia."
+ },
+ {
+ "name": "Xiaotingia",
+ "description": "This feathered dinosaur predated Archaeopteryx."
+ },
+ {
+ "name": "Xinjiangtitan",
+ "description": "This huge sauropod was a close relative of Mamenchisaurus."
+ },
+ {
+ "name": "Xiongguanlong",
+ "description": "A small, primitive tyrannosaur from Asia."
+ },
+ {
+ "name": "Xixianykus",
+ "description": "A long-legged dino-bird from eastern Asia."
+ },
+ {
+ "name": "Xuanhanosaurus",
+ "description": "You didn't think there'd be so many \"X\"'s on this list, did you?"
+ },
+ {
+ "name": "Xuanhuaceratops",
+ "description": "An early ceratopsian of the late Jurassic."
+ },
+ {
+ "name": "Xuwulong",
+ "description": "This iguanodontid ornithopod was recently discovered in China."
+ },
+ {
+ "name": "Yamaceratops",
+ "description": "No, it didn't have a sweet potato for a head."
+ },
+ {
+ "name": "Yandusaurus",
+ "description": "A small ornithopod of middle Jurassic China."
+ },
+ {
+ "name": "Yangchuanosaurus",
+ "description": "A large theropod of late Jurassic Asia."
+ },
+ {
+ "name": "Yaverlandia",
+ "description": "A classic case of mistaken dinosaur identity."
+ },
+ {
+ "name": "Yi Qi",
+ "description": "This strange Jurassic dinosaur had bat-like wings."
+ },
+ {
+ "name": "Yimenosaurus",
+ "description": "One of the better-known Chinese prosauropods."
+ },
+ {
+ "name": "Yinlong",
+ "description": "This \"hidden dragon\" was an early ceratopsian."
+ },
+ {
+ "name": "Yixianosaurus",
+ "description": "How did this dino-bird use its long fingers?"
+ },
+ {
+ "name": "Yizhousaurus",
+ "description": "The earliest intact sauropod yet discovered."
+ },
+ {
+ "name": "Yongjinglong",
+ "description": "This titanosaur was recently discovered in China."
+ },
+ {
+ "name": "Yueosaurus",
+ "description": "This basal ornithopod was discovered by construction workers."
+ },
+ {
+ "name": "Yulong",
+ "description": "The smallest oviraptor yet identified."
+ },
+ {
+ "name": "Yunnanosaurus",
+ "description": "One of the last prosauropods to walk the earth."
+ },
+ {
+ "name": "Yutyrannus",
+ "description": "The largest feathered tyrannosaur yet identified."
+ },
+ {
+ "name": "Zalmoxes",
+ "description": "A strange-looking ornithopod from Romania."
+ },
+ {
+ "name": "Zanabazar",
+ "description": "named after a Buddhist spiritual leader."
+ },
+ {
+ "name": "Zapalasaurus",
+ "description": "This \"diplodocoid\" sauropod lived in early Cretaceous South America."
+ },
+ {
+ "name": "Zby",
+ "description": "This dinosaur's name was inversely proportional to its size."
+ },
+ {
+ "name": "Zephyrosaurus",
+ "description": "Otherwise known as the Western Wind Lizard."
+ },
+ {
+ "name": "Zhanghenglong",
+ "description": "A transitional hadrosaur of late Cretaceous Asia."
+ },
+ {
+ "name": "Zhejiangosaurus",
+ "description": "The first identified nodosaur from Asia."
+ },
+ {
+ "name": "Zhenyuanlong",
+ "description": "Also known as the \"fluffy feathered poodle from hell\"."
+ },
+ {
+ "name": "Zhongyuansaurus",
+ "description": "The only known ankylosaur to lack a tail club."
+ },
+ {
+ "name": "Zhuchengceratops",
+ "description": "It probably figured on the lunch menu of Zhuchengtyrannus."
+ },
+ {
+ "name": "Zhuchengosaurus",
+ "description": "This hadrosaur was even bigger than Shantungosaurus."
+ },
+ {
+ "name": "Zhuchengtyrannus",
+ "description": "This Asian tyrannosaur was the size of T. Rex."
+ },
+ {
+ "name": "Zuniceratops",
+ "description": "This horned dinosaur was discovered by an eight-year-old boy."
+ },
+ {
+ "name": "Zuolong",
+ "description": "It was named after General Tso, of Chinese restaurant fame."
+ },
+ {
+ "name": "Zupaysaurus",
+ "description": "This \"devil lizard\" was one of the earliest theropods."
+ }
+ ]
diff --git a/_sili/app/api/main-hono.ts b/_sili/app/api/main-hono.ts
new file mode 100644
index 0000000000..738c392468
--- /dev/null
+++ b/_sili/app/api/main-hono.ts
@@ -0,0 +1,36 @@
+import { Hono } from "https://deno.land/x/hono@v4.2.0/mod.ts"; // 4.2.1 4.2.2 缺少类型推导
+import {
+ cors,
+ prettyJSON,
+} from "https://deno.land/x/hono@v4.2.0/middleware.ts";
+import data from "./data.json" assert { type: "json" };
+
+const app = new Hono();
+
+app.use(prettyJSON()) // With options: prettyJSON({ space: 4 })
+ .use(cors()) // 全局允许跨域请求
+ .get("/", (c) => {
+ return c.text("欢迎来到恐龙 API!");
+ })
+ .get("/api", (c) => {
+ return c.json(data);
+ })
+ .get("/api/:dinosaur", (c) => {
+ const dinosaurName = c.req.param("dinosaur");
+ if (dinosaurName) {
+ const found = data.find(
+ (item) => item.name.toLowerCase() === dinosaurName.toLowerCase()
+ );
+ if (found) {
+ return c.json(found);
+ } else {
+ return c.json("未找到恐龙。", 404);
+ }
+ }
+ });
+// .onError((err, c) => { // 美中不足的是无法定位报错位置
+// console.error(`${err}`)
+// return c.json(`Custom Error Message: ${err}`, 500)
+// })
+
+Deno.serve({ port: 8000 }, app.fetch);
diff --git a/_sili/app/api/main.ts b/_sili/app/api/main.ts
new file mode 100644
index 0000000000..f87bff78cb
--- /dev/null
+++ b/_sili/app/api/main.ts
@@ -0,0 +1,31 @@
+import { Application, Router } from "https://deno.land/x/oak@14.2.0/mod.ts";
+import { oakCors } from "https://deno.land/x/cors@v1.2.2/mod.ts";
+import data from "./data.json" assert { type: "json" };
+
+const router = new Router();
+router
+ .get("/", (c) => {
+ c.response.body = "欢迎来到恐龙 API!";
+ })
+ .get("/api", (c) => {
+ c.response.body = data;
+ })
+ .get("/api/:dinosaur", (c) => {
+ if (c?.params?.dinosaur) {
+ const found = data.find((item) =>
+ item.name.toLowerCase() === c.params.dinosaur.toLowerCase()
+ );
+ if (found) {
+ c.response.body = found;
+ } else {
+ c.response.body = "未找到恐龙。";
+ }
+ }
+ });
+
+const app = new Application();
+app.use(oakCors()); // 为所有路由启用 CORS
+app.use(router.routes());
+app.use(router.allowedMethods());
+
+await app.listen({ port: 8000 });
diff --git a/_sili/app/deno.jsonc b/_sili/app/deno.jsonc
new file mode 100644
index 0000000000..2a09504a86
--- /dev/null
+++ b/_sili/app/deno.jsonc
@@ -0,0 +1,36 @@
+{
+ "version": "1.0.1",
+ "tasks": {
+ "dev": "deno run -A --node-modules-dir npm:vite",
+ "build": "deno run -A --node-modules-dir npm:vite build",
+ "preview": "deno run -A --node-modules-dir npm:vite preview",
+ "serve": "deno run --allow-net --allow-read https://deno.land/std@0.157.0/http/file_server.ts dist/",
+ "api": "deno run --allow-env --allow-net api/main-hono.ts"
+ },
+ "lint": {
+ "include": ["src/"],
+ "exclude": [],
+ "rules": {
+ "tags": ["recommended"],
+ "include": ["ban-untagged-todo"],
+ "exclude": ["no-unused-vars","import-prefix-missing"]
+ }
+ },
+ "test": {
+ "include": ["src/"],
+ "exclude": []
+ },
+ "imports": { // 导入映射
+ "std/": "https://deno.land/std@0.208.0/",
+ "vite": "npm:vite@^5.0.10",
+ "@vitejs/plugin-react": "npm:@vitejs/plugin-react@^4.2.1",
+ "react": "npm:react",
+ "react-dom": "npm:react-dom",
+ "react-router-dom": "npm:react-router-dom@^6.4",
+ "react-vant@": "npm:react-vant@^3.3.4"
+ },
+ "compilerOptions": { // REF https://docs.denohub.com/deno/runtime/manual/advanced/typescript/configuration
+ "jsx": "react",
+ "lib": ["deno.window"]
+ }
+}
diff --git a/_sili/app/deno.lock b/_sili/app/deno.lock
new file mode 100644
index 0000000000..17b27c1bf5
--- /dev/null
+++ b/_sili/app/deno.lock
@@ -0,0 +1,1288 @@
+{
+ "version": "3",
+ "packages": {
+ "specifiers": {
+ "jsr:@oak/commons@0.7": "jsr:@oak/commons@0.7.0",
+ "jsr:@std/assert@0.218": "jsr:@std/assert@0.218.2",
+ "jsr:@std/assert@^0.218.2": "jsr:@std/assert@0.218.2",
+ "jsr:@std/bytes@0.218": "jsr:@std/bytes@0.218.2",
+ "jsr:@std/bytes@^0.218.2": "jsr:@std/bytes@0.218.2",
+ "jsr:@std/crypto@0.218": "jsr:@std/crypto@0.218.2",
+ "jsr:@std/encoding@0.218": "jsr:@std/encoding@0.218.2",
+ "jsr:@std/encoding@^0.218.2": "jsr:@std/encoding@0.218.2",
+ "jsr:@std/http@0.218": "jsr:@std/http@0.218.2",
+ "jsr:@std/io@0.218": "jsr:@std/io@0.218.2",
+ "jsr:@std/media-types@0.218": "jsr:@std/media-types@0.218.2",
+ "jsr:@std/path@0.218": "jsr:@std/path@0.218.2",
+ "npm:@vitejs/plugin-react@^4.2.1": "npm:@vitejs/plugin-react@4.2.1_vite@5.2.8_@babel+core@7.24.4",
+ "npm:path-to-regexp@6.2.1": "npm:path-to-regexp@6.2.1",
+ "npm:react-dom@^18.2.0": "npm:react-dom@18.2.0_react@18.2.0",
+ "npm:react-router-dom@^6.4": "npm:react-router-dom@6.22.3_react@18.2.0_react-dom@18.2.0__react@18.2.0",
+ "npm:react-vant@^3.3.4": "npm:react-vant@3.3.4_react@18.2.0_react-dom@18.2.0__react@18.2.0",
+ "npm:react@^18.2.0": "npm:react@18.2.0",
+ "npm:vite": "npm:vite@5.2.8",
+ "npm:vite@^5.0.10": "npm:vite@5.2.8"
+ },
+ "jsr": {
+ "@oak/commons@0.7.0": {
+ "integrity": "4bd889b3dc9ddac1b602034d88c137f06de7078775961b51081beb5f175c120b"
+ },
+ "@std/assert@0.218.2": {
+ "integrity": "7f0a5a1a8cf86607cd6c2c030584096e1ffad27fc9271429a8cb48cfbdee5eaf"
+ },
+ "@std/bytes@0.218.2": {
+ "integrity": "91fe54b232dcca73856b79a817247f4a651dbb60d51baafafb6408c137241670"
+ },
+ "@std/crypto@0.218.2": {
+ "integrity": "8c5031a3a1c3ac3bed3c0d4bed2fe7e7faedcb673bbfa0edd10570c8452f5cd2",
+ "dependencies": [
+ "jsr:@std/assert@^0.218.2",
+ "jsr:@std/encoding@^0.218.2"
+ ]
+ },
+ "@std/encoding@0.218.2": {
+ "integrity": "da55a763c29bf0dbf06fd286430b358266eb99c28789d89fe9a3e28edecb8d8e"
+ },
+ "@std/http@0.218.2": {
+ "integrity": "54223b62702e665b9dab6373ea2e51235e093ef47228d21cfa0469ee5ac75c9b",
+ "dependencies": [
+ "jsr:@std/assert@^0.218.2",
+ "jsr:@std/encoding@^0.218.2"
+ ]
+ },
+ "@std/io@0.218.2": {
+ "integrity": "c64fbfa087b7c9d4d386c5672f291f607d88cb7d44fc299c20c713e345f2785f",
+ "dependencies": [
+ "jsr:@std/bytes@^0.218.2"
+ ]
+ },
+ "@std/media-types@0.218.2": {
+ "integrity": "1ed3bd2a05e44bad3fc2bab1767d0ce7f2fd68baee62a980751ce51633acb788"
+ },
+ "@std/path@0.218.2": {
+ "integrity": "b568fd923d9e53ad76d17c513e7310bda8e755a3e825e6289a0ce536404e2662",
+ "dependencies": [
+ "jsr:@std/assert@^0.218.2"
+ ]
+ }
+ },
+ "npm": {
+ "@ampproject/remapping@2.3.0": {
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "@jridgewell/gen-mapping@0.3.5",
+ "@jridgewell/trace-mapping": "@jridgewell/trace-mapping@0.3.25"
+ }
+ },
+ "@babel/code-frame@7.24.2": {
+ "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==",
+ "dependencies": {
+ "@babel/highlight": "@babel/highlight@7.24.2",
+ "picocolors": "picocolors@1.0.0"
+ }
+ },
+ "@babel/compat-data@7.24.4": {
+ "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==",
+ "dependencies": {}
+ },
+ "@babel/core@7.24.4": {
+ "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==",
+ "dependencies": {
+ "@ampproject/remapping": "@ampproject/remapping@2.3.0",
+ "@babel/code-frame": "@babel/code-frame@7.24.2",
+ "@babel/generator": "@babel/generator@7.24.4",
+ "@babel/helper-compilation-targets": "@babel/helper-compilation-targets@7.23.6",
+ "@babel/helper-module-transforms": "@babel/helper-module-transforms@7.23.3_@babel+core@7.24.4",
+ "@babel/helpers": "@babel/helpers@7.24.4",
+ "@babel/parser": "@babel/parser@7.24.4",
+ "@babel/template": "@babel/template@7.24.0",
+ "@babel/traverse": "@babel/traverse@7.24.1",
+ "@babel/types": "@babel/types@7.24.0",
+ "convert-source-map": "convert-source-map@2.0.0",
+ "debug": "debug@4.3.4",
+ "gensync": "gensync@1.0.0-beta.2",
+ "json5": "json5@2.2.3",
+ "semver": "semver@6.3.1"
+ }
+ },
+ "@babel/generator@7.24.4": {
+ "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==",
+ "dependencies": {
+ "@babel/types": "@babel/types@7.24.0",
+ "@jridgewell/gen-mapping": "@jridgewell/gen-mapping@0.3.5",
+ "@jridgewell/trace-mapping": "@jridgewell/trace-mapping@0.3.25",
+ "jsesc": "jsesc@2.5.2"
+ }
+ },
+ "@babel/helper-compilation-targets@7.23.6": {
+ "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "dependencies": {
+ "@babel/compat-data": "@babel/compat-data@7.24.4",
+ "@babel/helper-validator-option": "@babel/helper-validator-option@7.23.5",
+ "browserslist": "browserslist@4.23.0",
+ "lru-cache": "lru-cache@5.1.1",
+ "semver": "semver@6.3.1"
+ }
+ },
+ "@babel/helper-environment-visitor@7.22.20": {
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dependencies": {}
+ },
+ "@babel/helper-function-name@7.23.0": {
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dependencies": {
+ "@babel/template": "@babel/template@7.24.0",
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@babel/helper-hoist-variables@7.22.5": {
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dependencies": {
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@babel/helper-module-imports@7.24.3": {
+ "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==",
+ "dependencies": {
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@babel/helper-module-transforms@7.23.3_@babel+core@7.24.4": {
+ "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "dependencies": {
+ "@babel/core": "@babel/core@7.24.4",
+ "@babel/helper-environment-visitor": "@babel/helper-environment-visitor@7.22.20",
+ "@babel/helper-module-imports": "@babel/helper-module-imports@7.24.3",
+ "@babel/helper-simple-access": "@babel/helper-simple-access@7.22.5",
+ "@babel/helper-split-export-declaration": "@babel/helper-split-export-declaration@7.22.6",
+ "@babel/helper-validator-identifier": "@babel/helper-validator-identifier@7.22.20"
+ }
+ },
+ "@babel/helper-plugin-utils@7.24.0": {
+ "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==",
+ "dependencies": {}
+ },
+ "@babel/helper-simple-access@7.22.5": {
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dependencies": {
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@babel/helper-split-export-declaration@7.22.6": {
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dependencies": {
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@babel/helper-string-parser@7.24.1": {
+ "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==",
+ "dependencies": {}
+ },
+ "@babel/helper-validator-identifier@7.22.20": {
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dependencies": {}
+ },
+ "@babel/helper-validator-option@7.23.5": {
+ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "dependencies": {}
+ },
+ "@babel/helpers@7.24.4": {
+ "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==",
+ "dependencies": {
+ "@babel/template": "@babel/template@7.24.0",
+ "@babel/traverse": "@babel/traverse@7.24.1",
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@babel/highlight@7.24.2": {
+ "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "@babel/helper-validator-identifier@7.22.20",
+ "chalk": "chalk@2.4.2",
+ "js-tokens": "js-tokens@4.0.0",
+ "picocolors": "picocolors@1.0.0"
+ }
+ },
+ "@babel/parser@7.24.4": {
+ "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
+ "dependencies": {}
+ },
+ "@babel/plugin-transform-react-jsx-self@7.24.1_@babel+core@7.24.4": {
+ "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==",
+ "dependencies": {
+ "@babel/core": "@babel/core@7.24.4",
+ "@babel/helper-plugin-utils": "@babel/helper-plugin-utils@7.24.0"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-source@7.24.1_@babel+core@7.24.4": {
+ "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==",
+ "dependencies": {
+ "@babel/core": "@babel/core@7.24.4",
+ "@babel/helper-plugin-utils": "@babel/helper-plugin-utils@7.24.0"
+ }
+ },
+ "@babel/runtime@7.24.4": {
+ "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
+ "dependencies": {
+ "regenerator-runtime": "regenerator-runtime@0.14.1"
+ }
+ },
+ "@babel/template@7.24.0": {
+ "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
+ "dependencies": {
+ "@babel/code-frame": "@babel/code-frame@7.24.2",
+ "@babel/parser": "@babel/parser@7.24.4",
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@babel/traverse@7.24.1": {
+ "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==",
+ "dependencies": {
+ "@babel/code-frame": "@babel/code-frame@7.24.2",
+ "@babel/generator": "@babel/generator@7.24.4",
+ "@babel/helper-environment-visitor": "@babel/helper-environment-visitor@7.22.20",
+ "@babel/helper-function-name": "@babel/helper-function-name@7.23.0",
+ "@babel/helper-hoist-variables": "@babel/helper-hoist-variables@7.22.5",
+ "@babel/helper-split-export-declaration": "@babel/helper-split-export-declaration@7.22.6",
+ "@babel/parser": "@babel/parser@7.24.4",
+ "@babel/types": "@babel/types@7.24.0",
+ "debug": "debug@4.3.4",
+ "globals": "globals@11.12.0"
+ }
+ },
+ "@babel/types@7.24.0": {
+ "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
+ "dependencies": {
+ "@babel/helper-string-parser": "@babel/helper-string-parser@7.24.1",
+ "@babel/helper-validator-identifier": "@babel/helper-validator-identifier@7.22.20",
+ "to-fast-properties": "to-fast-properties@2.0.0"
+ }
+ },
+ "@esbuild/aix-ppc64@0.20.2": {
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "dependencies": {}
+ },
+ "@esbuild/android-arm64@0.20.2": {
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "dependencies": {}
+ },
+ "@esbuild/android-arm@0.20.2": {
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "dependencies": {}
+ },
+ "@esbuild/android-x64@0.20.2": {
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "dependencies": {}
+ },
+ "@esbuild/darwin-arm64@0.20.2": {
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "dependencies": {}
+ },
+ "@esbuild/darwin-x64@0.20.2": {
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "dependencies": {}
+ },
+ "@esbuild/freebsd-arm64@0.20.2": {
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "dependencies": {}
+ },
+ "@esbuild/freebsd-x64@0.20.2": {
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-arm64@0.20.2": {
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-arm@0.20.2": {
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-ia32@0.20.2": {
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-loong64@0.20.2": {
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-mips64el@0.20.2": {
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-ppc64@0.20.2": {
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-riscv64@0.20.2": {
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-s390x@0.20.2": {
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "dependencies": {}
+ },
+ "@esbuild/linux-x64@0.20.2": {
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "dependencies": {}
+ },
+ "@esbuild/netbsd-x64@0.20.2": {
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "dependencies": {}
+ },
+ "@esbuild/openbsd-x64@0.20.2": {
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "dependencies": {}
+ },
+ "@esbuild/sunos-x64@0.20.2": {
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "dependencies": {}
+ },
+ "@esbuild/win32-arm64@0.20.2": {
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "dependencies": {}
+ },
+ "@esbuild/win32-ia32@0.20.2": {
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "dependencies": {}
+ },
+ "@esbuild/win32-x64@0.20.2": {
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "dependencies": {}
+ },
+ "@jridgewell/gen-mapping@0.3.5": {
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dependencies": {
+ "@jridgewell/set-array": "@jridgewell/set-array@1.2.1",
+ "@jridgewell/sourcemap-codec": "@jridgewell/sourcemap-codec@1.4.15",
+ "@jridgewell/trace-mapping": "@jridgewell/trace-mapping@0.3.25"
+ }
+ },
+ "@jridgewell/resolve-uri@3.1.2": {
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dependencies": {}
+ },
+ "@jridgewell/set-array@1.2.1": {
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dependencies": {}
+ },
+ "@jridgewell/sourcemap-codec@1.4.15": {
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dependencies": {}
+ },
+ "@jridgewell/trace-mapping@0.3.25": {
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "@jridgewell/resolve-uri@3.1.2",
+ "@jridgewell/sourcemap-codec": "@jridgewell/sourcemap-codec@1.4.15"
+ }
+ },
+ "@react-spring/animated@9.7.3_react@18.2.0": {
+ "integrity": "sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==",
+ "dependencies": {
+ "@react-spring/shared": "@react-spring/shared@9.7.3_react@18.2.0",
+ "@react-spring/types": "@react-spring/types@9.7.3",
+ "react": "react@18.2.0"
+ }
+ },
+ "@react-spring/core@9.7.3_react@18.2.0": {
+ "integrity": "sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==",
+ "dependencies": {
+ "@react-spring/animated": "@react-spring/animated@9.7.3_react@18.2.0",
+ "@react-spring/shared": "@react-spring/shared@9.7.3_react@18.2.0",
+ "@react-spring/types": "@react-spring/types@9.7.3",
+ "react": "react@18.2.0"
+ }
+ },
+ "@react-spring/shared@9.7.3_react@18.2.0": {
+ "integrity": "sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==",
+ "dependencies": {
+ "@react-spring/types": "@react-spring/types@9.7.3",
+ "react": "react@18.2.0"
+ }
+ },
+ "@react-spring/types@9.7.3": {
+ "integrity": "sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==",
+ "dependencies": {}
+ },
+ "@react-spring/web@9.7.3_react@18.2.0_react-dom@18.2.0__react@18.2.0": {
+ "integrity": "sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==",
+ "dependencies": {
+ "@react-spring/animated": "@react-spring/animated@9.7.3_react@18.2.0",
+ "@react-spring/core": "@react-spring/core@9.7.3_react@18.2.0",
+ "@react-spring/shared": "@react-spring/shared@9.7.3_react@18.2.0",
+ "@react-spring/types": "@react-spring/types@9.7.3",
+ "react": "react@18.2.0",
+ "react-dom": "react-dom@18.2.0_react@18.2.0"
+ }
+ },
+ "@react-vant/icons@0.0.11_react@18.2.0": {
+ "integrity": "sha512-ZVYpyNUjdO1tlMKwIWVCdrOgfrSdp2XjHpjQAZxDyMwJfiv1k7dvsBMAXHnUrcJRwnvJ1CU2GMYFP6m7GWBeow==",
+ "dependencies": {
+ "react": "react@18.2.0"
+ }
+ },
+ "@remix-run/router@1.15.3": {
+ "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-android-arm-eabi@4.14.0": {
+ "integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-android-arm64@4.14.0": {
+ "integrity": "sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-darwin-arm64@4.14.0": {
+ "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-darwin-x64@4.14.0": {
+ "integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-linux-arm-gnueabihf@4.14.0": {
+ "integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-linux-arm64-gnu@4.14.0": {
+ "integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-linux-arm64-musl@4.14.0": {
+ "integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-linux-powerpc64le-gnu@4.14.0": {
+ "integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-linux-riscv64-gnu@4.14.0": {
+ "integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-linux-s390x-gnu@4.14.0": {
+ "integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-linux-x64-gnu@4.14.0": {
+ "integrity": "sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-linux-x64-musl@4.14.0": {
+ "integrity": "sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-win32-arm64-msvc@4.14.0": {
+ "integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-win32-ia32-msvc@4.14.0": {
+ "integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==",
+ "dependencies": {}
+ },
+ "@rollup/rollup-win32-x64-msvc@4.14.0": {
+ "integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==",
+ "dependencies": {}
+ },
+ "@types/babel__core@7.20.5": {
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dependencies": {
+ "@babel/parser": "@babel/parser@7.24.4",
+ "@babel/types": "@babel/types@7.24.0",
+ "@types/babel__generator": "@types/babel__generator@7.6.8",
+ "@types/babel__template": "@types/babel__template@7.4.4",
+ "@types/babel__traverse": "@types/babel__traverse@7.20.5"
+ }
+ },
+ "@types/babel__generator@7.6.8": {
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dependencies": {
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@types/babel__template@7.4.4": {
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dependencies": {
+ "@babel/parser": "@babel/parser@7.24.4",
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@types/babel__traverse@7.20.5": {
+ "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
+ "dependencies": {
+ "@babel/types": "@babel/types@7.24.0"
+ }
+ },
+ "@types/estree@1.0.5": {
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "dependencies": {}
+ },
+ "@use-gesture/core@10.2.17": {
+ "integrity": "sha512-62hCybe4x6oGZ1/JA9gSYIdghV1FqxCdvYWt9SqCEAAikwT1OmVl2Q/Uu8CP636L57D+DfXtw6PWM+fdhr4oJQ==",
+ "dependencies": {}
+ },
+ "@use-gesture/react@10.2.17_react@18.2.0": {
+ "integrity": "sha512-Vfrp1KgdYn/kOEUAYNXtGBCl2dr38s3G6rru1TOPs+cVUjfNyNxvJK56grUyJ336N3rQLK8F9G7+FfrHuc3g/Q==",
+ "dependencies": {
+ "@use-gesture/core": "@use-gesture/core@10.2.17",
+ "react": "react@18.2.0"
+ }
+ },
+ "@vant/popperjs@1.3.0": {
+ "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==",
+ "dependencies": {}
+ },
+ "@vitejs/plugin-react@4.2.1_vite@5.2.8_@babel+core@7.24.4": {
+ "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==",
+ "dependencies": {
+ "@babel/core": "@babel/core@7.24.4",
+ "@babel/plugin-transform-react-jsx-self": "@babel/plugin-transform-react-jsx-self@7.24.1_@babel+core@7.24.4",
+ "@babel/plugin-transform-react-jsx-source": "@babel/plugin-transform-react-jsx-source@7.24.1_@babel+core@7.24.4",
+ "@types/babel__core": "@types/babel__core@7.20.5",
+ "react-refresh": "react-refresh@0.14.0",
+ "vite": "vite@5.2.8"
+ }
+ },
+ "ansi-styles@3.2.1": {
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "color-convert@1.9.3"
+ }
+ },
+ "async-validator@4.2.5": {
+ "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
+ "dependencies": {}
+ },
+ "browserslist@4.23.0": {
+ "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+ "dependencies": {
+ "caniuse-lite": "caniuse-lite@1.0.30001606",
+ "electron-to-chromium": "electron-to-chromium@1.4.729",
+ "node-releases": "node-releases@2.0.14",
+ "update-browserslist-db": "update-browserslist-db@1.0.13_browserslist@4.23.0"
+ }
+ },
+ "caniuse-lite@1.0.30001606": {
+ "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==",
+ "dependencies": {}
+ },
+ "chalk@2.4.2": {
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "ansi-styles@3.2.1",
+ "escape-string-regexp": "escape-string-regexp@1.0.5",
+ "supports-color": "supports-color@5.5.0"
+ }
+ },
+ "clsx@1.2.1": {
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "dependencies": {}
+ },
+ "color-convert@1.9.3": {
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "color-name@1.1.3"
+ }
+ },
+ "color-name@1.1.3": {
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dependencies": {}
+ },
+ "convert-source-map@2.0.0": {
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dependencies": {}
+ },
+ "csstype@3.1.3": {
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dependencies": {}
+ },
+ "debug@4.3.4": {
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "ms@2.1.2"
+ }
+ },
+ "dom-helpers@5.2.1": {
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dependencies": {
+ "@babel/runtime": "@babel/runtime@7.24.4",
+ "csstype": "csstype@3.1.3"
+ }
+ },
+ "electron-to-chromium@1.4.729": {
+ "integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==",
+ "dependencies": {}
+ },
+ "esbuild@0.20.2": {
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "dependencies": {
+ "@esbuild/aix-ppc64": "@esbuild/aix-ppc64@0.20.2",
+ "@esbuild/android-arm": "@esbuild/android-arm@0.20.2",
+ "@esbuild/android-arm64": "@esbuild/android-arm64@0.20.2",
+ "@esbuild/android-x64": "@esbuild/android-x64@0.20.2",
+ "@esbuild/darwin-arm64": "@esbuild/darwin-arm64@0.20.2",
+ "@esbuild/darwin-x64": "@esbuild/darwin-x64@0.20.2",
+ "@esbuild/freebsd-arm64": "@esbuild/freebsd-arm64@0.20.2",
+ "@esbuild/freebsd-x64": "@esbuild/freebsd-x64@0.20.2",
+ "@esbuild/linux-arm": "@esbuild/linux-arm@0.20.2",
+ "@esbuild/linux-arm64": "@esbuild/linux-arm64@0.20.2",
+ "@esbuild/linux-ia32": "@esbuild/linux-ia32@0.20.2",
+ "@esbuild/linux-loong64": "@esbuild/linux-loong64@0.20.2",
+ "@esbuild/linux-mips64el": "@esbuild/linux-mips64el@0.20.2",
+ "@esbuild/linux-ppc64": "@esbuild/linux-ppc64@0.20.2",
+ "@esbuild/linux-riscv64": "@esbuild/linux-riscv64@0.20.2",
+ "@esbuild/linux-s390x": "@esbuild/linux-s390x@0.20.2",
+ "@esbuild/linux-x64": "@esbuild/linux-x64@0.20.2",
+ "@esbuild/netbsd-x64": "@esbuild/netbsd-x64@0.20.2",
+ "@esbuild/openbsd-x64": "@esbuild/openbsd-x64@0.20.2",
+ "@esbuild/sunos-x64": "@esbuild/sunos-x64@0.20.2",
+ "@esbuild/win32-arm64": "@esbuild/win32-arm64@0.20.2",
+ "@esbuild/win32-ia32": "@esbuild/win32-ia32@0.20.2",
+ "@esbuild/win32-x64": "@esbuild/win32-x64@0.20.2"
+ }
+ },
+ "escalade@3.1.2": {
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dependencies": {}
+ },
+ "escape-string-regexp@1.0.5": {
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dependencies": {}
+ },
+ "fsevents@2.3.3": {
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dependencies": {}
+ },
+ "gensync@1.0.0-beta.2": {
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dependencies": {}
+ },
+ "globals@11.12.0": {
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dependencies": {}
+ },
+ "has-flag@3.0.0": {
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dependencies": {}
+ },
+ "js-tokens@4.0.0": {
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dependencies": {}
+ },
+ "jsesc@2.5.2": {
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dependencies": {}
+ },
+ "json5@2.2.3": {
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dependencies": {}
+ },
+ "loose-envify@1.4.0": {
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "js-tokens@4.0.0"
+ }
+ },
+ "lru-cache@5.1.1": {
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dependencies": {
+ "yallist": "yallist@3.1.1"
+ }
+ },
+ "ms@2.1.2": {
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dependencies": {}
+ },
+ "nanoid@3.3.7": {
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dependencies": {}
+ },
+ "node-releases@2.0.14": {
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "dependencies": {}
+ },
+ "object-assign@4.1.1": {
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dependencies": {}
+ },
+ "path-to-regexp@6.2.1": {
+ "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==",
+ "dependencies": {}
+ },
+ "picocolors@1.0.0": {
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dependencies": {}
+ },
+ "postcss@8.4.38": {
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "dependencies": {
+ "nanoid": "nanoid@3.3.7",
+ "picocolors": "picocolors@1.0.0",
+ "source-map-js": "source-map-js@1.2.0"
+ }
+ },
+ "prop-types@15.8.1": {
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "loose-envify@1.4.0",
+ "object-assign": "object-assign@4.1.1",
+ "react-is": "react-is@16.13.1"
+ }
+ },
+ "rc-field-form@1.44.0_react@18.2.0_react-dom@18.2.0__react@18.2.0": {
+ "integrity": "sha512-el7w87fyDUsca63Y/s8qJcq9kNkf/J5h+iTdqG5WsSHLH0e6Usl7QuYSmSVzJMgtp40mOVZIY/W/QP9zwrp1FA==",
+ "dependencies": {
+ "@babel/runtime": "@babel/runtime@7.24.4",
+ "async-validator": "async-validator@4.2.5",
+ "rc-util": "rc-util@5.39.1_react@18.2.0_react-dom@18.2.0__react@18.2.0",
+ "react": "react@18.2.0",
+ "react-dom": "react-dom@18.2.0_react@18.2.0"
+ }
+ },
+ "rc-util@5.39.1_react@18.2.0_react-dom@18.2.0__react@18.2.0": {
+ "integrity": "sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ==",
+ "dependencies": {
+ "@babel/runtime": "@babel/runtime@7.24.4",
+ "react": "react@18.2.0",
+ "react-dom": "react-dom@18.2.0_react@18.2.0",
+ "react-is": "react-is@18.2.0"
+ }
+ },
+ "react-dom@18.2.0_react@18.2.0": {
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "loose-envify@1.4.0",
+ "react": "react@18.2.0",
+ "scheduler": "scheduler@0.23.0"
+ }
+ },
+ "react-is@16.13.1": {
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dependencies": {}
+ },
+ "react-is@18.2.0": {
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+ "dependencies": {}
+ },
+ "react-refresh@0.14.0": {
+ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
+ "dependencies": {}
+ },
+ "react-router-dom@6.22.3_react@18.2.0_react-dom@18.2.0__react@18.2.0": {
+ "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==",
+ "dependencies": {
+ "@remix-run/router": "@remix-run/router@1.15.3",
+ "react": "react@18.2.0",
+ "react-dom": "react-dom@18.2.0_react@18.2.0",
+ "react-router": "react-router@6.22.3_react@18.2.0"
+ }
+ },
+ "react-router@6.22.3_react@18.2.0": {
+ "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==",
+ "dependencies": {
+ "@remix-run/router": "@remix-run/router@1.15.3",
+ "react": "react@18.2.0"
+ }
+ },
+ "react-transition-group@4.4.2_react@18.2.0_react-dom@18.2.0__react@18.2.0": {
+ "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==",
+ "dependencies": {
+ "@babel/runtime": "@babel/runtime@7.24.4",
+ "dom-helpers": "dom-helpers@5.2.1",
+ "loose-envify": "loose-envify@1.4.0",
+ "prop-types": "prop-types@15.8.1",
+ "react": "react@18.2.0",
+ "react-dom": "react-dom@18.2.0_react@18.2.0"
+ }
+ },
+ "react-vant@3.3.4_react@18.2.0_react-dom@18.2.0__react@18.2.0": {
+ "integrity": "sha512-ny1UNptaZ+cBQEye2CdSmbucDJ0yUrBiSuzabBVthQagy/jixuwDHrYfDvBcsx4MLfkkaEJwKY7dXyw1EcO5WA==",
+ "dependencies": {
+ "@react-spring/web": "@react-spring/web@9.7.3_react@18.2.0_react-dom@18.2.0__react@18.2.0",
+ "@react-vant/icons": "@react-vant/icons@0.0.11_react@18.2.0",
+ "@use-gesture/react": "@use-gesture/react@10.2.17_react@18.2.0",
+ "@vant/popperjs": "@vant/popperjs@1.3.0",
+ "clsx": "clsx@1.2.1",
+ "rc-field-form": "rc-field-form@1.44.0_react@18.2.0_react-dom@18.2.0__react@18.2.0",
+ "react": "react@18.2.0",
+ "react-dom": "react-dom@18.2.0_react@18.2.0",
+ "react-is": "react-is@18.2.0",
+ "react-transition-group": "react-transition-group@4.4.2_react@18.2.0_react-dom@18.2.0__react@18.2.0",
+ "tslib": "tslib@2.6.2"
+ }
+ },
+ "react@18.2.0": {
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "loose-envify@1.4.0"
+ }
+ },
+ "regenerator-runtime@0.14.1": {
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "dependencies": {}
+ },
+ "rollup@4.14.0": {
+ "integrity": "sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==",
+ "dependencies": {
+ "@rollup/rollup-android-arm-eabi": "@rollup/rollup-android-arm-eabi@4.14.0",
+ "@rollup/rollup-android-arm64": "@rollup/rollup-android-arm64@4.14.0",
+ "@rollup/rollup-darwin-arm64": "@rollup/rollup-darwin-arm64@4.14.0",
+ "@rollup/rollup-darwin-x64": "@rollup/rollup-darwin-x64@4.14.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "@rollup/rollup-linux-arm-gnueabihf@4.14.0",
+ "@rollup/rollup-linux-arm64-gnu": "@rollup/rollup-linux-arm64-gnu@4.14.0",
+ "@rollup/rollup-linux-arm64-musl": "@rollup/rollup-linux-arm64-musl@4.14.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "@rollup/rollup-linux-powerpc64le-gnu@4.14.0",
+ "@rollup/rollup-linux-riscv64-gnu": "@rollup/rollup-linux-riscv64-gnu@4.14.0",
+ "@rollup/rollup-linux-s390x-gnu": "@rollup/rollup-linux-s390x-gnu@4.14.0",
+ "@rollup/rollup-linux-x64-gnu": "@rollup/rollup-linux-x64-gnu@4.14.0",
+ "@rollup/rollup-linux-x64-musl": "@rollup/rollup-linux-x64-musl@4.14.0",
+ "@rollup/rollup-win32-arm64-msvc": "@rollup/rollup-win32-arm64-msvc@4.14.0",
+ "@rollup/rollup-win32-ia32-msvc": "@rollup/rollup-win32-ia32-msvc@4.14.0",
+ "@rollup/rollup-win32-x64-msvc": "@rollup/rollup-win32-x64-msvc@4.14.0",
+ "@types/estree": "@types/estree@1.0.5",
+ "fsevents": "fsevents@2.3.3"
+ }
+ },
+ "scheduler@0.23.0": {
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "loose-envify@1.4.0"
+ }
+ },
+ "semver@6.3.1": {
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dependencies": {}
+ },
+ "source-map-js@1.2.0": {
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "dependencies": {}
+ },
+ "supports-color@5.5.0": {
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "has-flag@3.0.0"
+ }
+ },
+ "to-fast-properties@2.0.0": {
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dependencies": {}
+ },
+ "tslib@2.6.2": {
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "dependencies": {}
+ },
+ "update-browserslist-db@1.0.13_browserslist@4.23.0": {
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "dependencies": {
+ "browserslist": "browserslist@4.23.0",
+ "escalade": "escalade@3.1.2",
+ "picocolors": "picocolors@1.0.0"
+ }
+ },
+ "vite@5.2.8": {
+ "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==",
+ "dependencies": {
+ "esbuild": "esbuild@0.20.2",
+ "fsevents": "fsevents@2.3.3",
+ "postcss": "postcss@8.4.38",
+ "rollup": "rollup@4.14.0"
+ }
+ },
+ "yallist@3.1.1": {
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dependencies": {}
+ }
+ }
+ },
+ "redirects": {
+ "https://deno.land/std/datetime/mod.ts": "https://deno.land/std@0.221.0/datetime/mod.ts",
+ "https://deno.land/x/cors/mod.ts": "https://deno.land/x/cors@v1.2.2/mod.ts",
+ "https://deno.land/x/oak/mod.ts": "https://deno.land/x/oak@14.2.0/mod.ts",
+ "https://deno.land/x/oak_logger/mod.ts": "https://deno.land/x/oak_logger@1.0.0/mod.ts"
+ },
+ "remote": {
+ "https://deno.land/std@0.152.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
+ "https://deno.land/std@0.152.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49",
+ "https://deno.land/std@0.152.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a",
+ "https://deno.land/std@0.152.0/bytes/bytes_list.ts": "aba5e2369e77d426b10af1de0dcc4531acecec27f9b9056f4f7bfbf8ac147ab4",
+ "https://deno.land/std@0.152.0/bytes/equals.ts": "3c3558c3ae85526f84510aa2b48ab2ad7bdd899e2e0f5b7a8ffc85acb3a6043a",
+ "https://deno.land/std@0.152.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf",
+ "https://deno.land/std@0.152.0/crypto/timing_safe_equal.ts": "82a29b737bc8932d75d7a20c404136089d5d23629e94ba14efa98a8cc066c73e",
+ "https://deno.land/std@0.152.0/encoding/base64.ts": "c57868ca7fa2fbe919f57f88a623ad34e3d970d675bdc1ff3a9d02bba7409db2",
+ "https://deno.land/std@0.152.0/fmt/colors.ts": "6f9340b7fb8cc25a993a99e5efc56fe81bb5af284ff412129dd06df06f53c0b4",
+ "https://deno.land/std@0.152.0/http/_negotiation/common.ts": "410e902f01cdd324e4746e8017595be4fc357d6fc4cd6044f2f808a943d7eaf7",
+ "https://deno.land/std@0.152.0/http/_negotiation/encoding.ts": "f749c1d539d139af783e8a7741de5a47a98a5e3c9af82b8af512567ccf5fe632",
+ "https://deno.land/std@0.152.0/http/_negotiation/language.ts": "53c306186904d2dace4c624a8822542866ad332a7f40ac90e0af1504f95c63d0",
+ "https://deno.land/std@0.152.0/http/_negotiation/media_type.ts": "ecdda87286495f7ff25116858f5088856953e2f1585e593d314e0c71b826a137",
+ "https://deno.land/std@0.152.0/http/http_errors.ts": "fe9b7f95f7ee0592c3306f8c7aed03ba53d55d1ef81e00041c1171b9588f46d9",
+ "https://deno.land/std@0.152.0/http/http_status.ts": "897575a7d6bc2b9123f6a38ecbc0f03d95a532c5d92029315dc9f508e12526b8",
+ "https://deno.land/std@0.152.0/http/negotiation.ts": "f35b1ff2ad4ff9feaa00ac234960b398172768205c8eceaef7f2eafe34716ba2",
+ "https://deno.land/std@0.152.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b",
+ "https://deno.land/std@0.152.0/io/readers.ts": "45847ad404afd2f605eae1cff193f223462bc55eeb9ae313c2f3db28aada0fd6",
+ "https://deno.land/std@0.152.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1",
+ "https://deno.land/std@0.152.0/media_types/mod.ts": "3829264ca0610cac40f3214f939d7733483523f82bc1041c51045d7c75fb93b8",
+ "https://deno.land/std@0.152.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af",
+ "https://deno.land/std@0.152.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
+ "https://deno.land/std@0.152.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
+ "https://deno.land/std@0.152.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b",
+ "https://deno.land/std@0.152.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
+ "https://deno.land/std@0.152.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
+ "https://deno.land/std@0.152.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac",
+ "https://deno.land/std@0.152.0/path/posix.ts": "c1f7afe274290ea0b51da07ee205653b2964bd74909a82deb07b69a6cc383aaa",
+ "https://deno.land/std@0.152.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
+ "https://deno.land/std@0.152.0/path/win32.ts": "bd7549042e37879c68ff2f8576a25950abbfca1d696d41d82c7bca0b7e6f452c",
+ "https://deno.land/std@0.152.0/streams/conversion.ts": "fc3db02026183da795fa32ac7549868e9f19c75ba029d4b4c3739af62b48517a",
+ "https://deno.land/std@0.152.0/testing/_diff.ts": "029a00560b0d534bc0046f1bce4bd36b3b41ada3f2a3178c85686eb2ff5f1413",
+ "https://deno.land/std@0.152.0/testing/_format.ts": "0d8dc79eab15b67cdc532826213bbe05bccfd276ca473a50a3fc7bbfb7260642",
+ "https://deno.land/std@0.152.0/testing/asserts.ts": "093735c88f52bbead7f60a1f7a97a2ce4df3c2d5fab00a46956f20b4a5793ccd",
+ "https://deno.land/std@0.221.0/datetime/_date_time_formatter.ts": "b810c4c0d8f7aafe765fb963efdbf704acceb0730f5b242a7ec46df37834307c",
+ "https://deno.land/std@0.221.0/datetime/constants.ts": "5df80a84e301da6db5793804122c034d2d090da31f1e1c5fdaa831fc70a45da7",
+ "https://deno.land/std@0.221.0/datetime/day_of_year.ts": "f46216f0e87277c7c2a92eb3bdf9414803f7d19706c137a7d70f3d596d3a2ce1",
+ "https://deno.land/std@0.221.0/datetime/difference.ts": "7580464beb74be6d2e87fb1a2f0aa338e543758c0b2ab18c8a42ea451a6c8a31",
+ "https://deno.land/std@0.221.0/datetime/format.ts": "8709d992917f490a99c9d625c8283b1f396ce8a56d1308b46435332b46f876e0",
+ "https://deno.land/std@0.221.0/datetime/is_leap.ts": "07b59c0900d20915737f5252c0d49929fcb0f5b79f4906918014ad44c0011a58",
+ "https://deno.land/std@0.221.0/datetime/mod.ts": "92df8f9c33d0b981e7e1e0d1d5d28b574da98b414e01bd36e35c9839482ef3f1",
+ "https://deno.land/std@0.221.0/datetime/parse.ts": "edd428e573e57bfccfd326c91150828cca7a96b2acb7e4b67a20a85152474845",
+ "https://deno.land/std@0.221.0/datetime/week_of_year.ts": "844d8c95acfd7c9679b13296bc4ba1923edc8b79f8a07e3df4660b9a0f3eb81e",
+ "https://deno.land/std@0.53.0/fmt/colors.ts": "ec9d653672a9a3c7b6eafe53c5bc797364a2db2dcf766ab649c1155fea7a80b2",
+ "https://deno.land/x/cors@v1.2.2/abcCors.ts": "cdf83a7eaa69a1bf3ab910d18b9422217902fac47601adcaf0afac5a61845d48",
+ "https://deno.land/x/cors@v1.2.2/attainCors.ts": "7d6aba0f942495cc31119604e0895c9bb8edd8f8baa7fe78e6c655bd0b4cbf59",
+ "https://deno.land/x/cors@v1.2.2/cors.ts": "0e2d9167e3685f9bcf48f565e312b6e1883fa458f7337e5ce7bc2e3b29767980",
+ "https://deno.land/x/cors@v1.2.2/mithCors.ts": "3a359d6e716e0410ede278ab54d875b293a2d66d838aaa7cfbf9ddc1e9e990d3",
+ "https://deno.land/x/cors@v1.2.2/mod.ts": "2b351913f56d77ad80cb3b8633d4539c9eeddb426dae79437ada0e6a9cb4f1a6",
+ "https://deno.land/x/cors@v1.2.2/oakCors.ts": "1348dc7673c61b85d2e80559a7b44f8e0246eaa6bcc6ec744fafe5d9b13b5c71",
+ "https://deno.land/x/cors@v1.2.2/opineCors.ts": "fb5790115c26b7061d84b8d6c17d258a1e241bcab75b0bc3ca1fdb2e57bc5072",
+ "https://deno.land/x/cors@v1.2.2/types.ts": "97546633ccc7f0df7a29bacba5d91dc6f61decdd1b65258300244dba905d34b8",
+ "https://deno.land/x/hono@v4.2.0/adapter/deno/serve-static.ts": "62b57d461ecebbc7b98809c4fc2a8358f0828d6e89cdc6841054e5bb3828fc80",
+ "https://deno.land/x/hono@v4.2.0/adapter/deno/ssg.ts": "49d73dd0d351fc52a54bfc8094096aff957f5a955a3eb976844ed8d88903bc0f",
+ "https://deno.land/x/hono@v4.2.0/adapter/deno/websocket.ts": "032bd72f32103ff948e7ad5945ccb6a32e1ccd507ad222758e72a7b3a7828fb5",
+ "https://deno.land/x/hono@v4.2.0/client/client.ts": "b9d07d47a7b23f007fb2ea29a3185885e85a963a63b0f921f93ae2981ee29cda",
+ "https://deno.land/x/hono@v4.2.0/client/index.ts": "30def535310a37bede261f1b23d11a9758983b8e9d60a6c56309cee5f6746ab2",
+ "https://deno.land/x/hono@v4.2.0/client/utils.ts": "a93e5dc542dceb892a6b39cc793689478627ba958d251794193cf26c0ecf5800",
+ "https://deno.land/x/hono@v4.2.0/compose.ts": "37d6e33b7db80e4c43a0629b12fd3a1e3406e7d9e62a4bfad4b30426ea7ae4f1",
+ "https://deno.land/x/hono@v4.2.0/context.ts": "3d8c8a1aaea396fe22e2db822e1a270482c7f4b3b273f8f05ae3b240408bc7b2",
+ "https://deno.land/x/hono@v4.2.0/helper.ts": "cf9f0fea6a338bea6104ba1518cce84f5d9f826e64e3bfa22dbc49d9ce56b85b",
+ "https://deno.land/x/hono@v4.2.0/helper/accepts/accepts.ts": "46330f2ff384b266ab2227f7943366c09d752c9b58e2908e7b7726548e8954d3",
+ "https://deno.land/x/hono@v4.2.0/helper/accepts/index.ts": "88a18cb5f7b15ec2bd515b6fbf5a2a8b5f77d1edbd6f7e1632afe5d755b2cf50",
+ "https://deno.land/x/hono@v4.2.0/helper/adapter/index.ts": "5a4ca736487a2a8303bdac9fff710eae38e6f39ed70eb171eed78e5f64da84df",
+ "https://deno.land/x/hono@v4.2.0/helper/cookie/index.ts": "80b98f8a014e8b03a9130cce9fb03f6175f82a64367e954d120634f8543556e2",
+ "https://deno.land/x/hono@v4.2.0/helper/css/common.ts": "596f3e777c11a73be52585c2140e80f8ad87f1ef3c483514480e11fb7394e986",
+ "https://deno.land/x/hono@v4.2.0/helper/css/index.ts": "f91b6c473f033c420077554bcc8c11635194e3ee49c974c22bbacf2b3449b63c",
+ "https://deno.land/x/hono@v4.2.0/helper/dev/index.ts": "86b2e7a3f8e60138c4280027b7267db41d53fac138cfa5fb4ce6b42045d50bb3",
+ "https://deno.land/x/hono@v4.2.0/helper/factory/index.ts": "da87032bd93785827448e5d1369c90f6d453cdd12ded597d4ca4051e3309e468",
+ "https://deno.land/x/hono@v4.2.0/helper/html/index.ts": "48a0ddc576c10452db6c3cab03dd4ee6986ab61ebdc667335b40a81fa0487f69",
+ "https://deno.land/x/hono@v4.2.0/helper/ssg/index.ts": "32994fd843088ddc5d9adb0d43469371fa974fda08be76d263e53605ebfdadb3",
+ "https://deno.land/x/hono@v4.2.0/helper/ssg/middleware.ts": "5728a41811294b23563d551e67156cd32da461645f410db23be275c17d7d5b76",
+ "https://deno.land/x/hono@v4.2.0/helper/ssg/ssg.ts": "0617ae133c3ed8044ed01627744af877c1fc1a98b2521186b139150842730aef",
+ "https://deno.land/x/hono@v4.2.0/helper/ssg/utils.ts": "90ff5f2f9a57e7cf2f76362ce0b2179677f46390ddf0cce0f5c2023db179d847",
+ "https://deno.land/x/hono@v4.2.0/helper/streaming/index.ts": "e4955c04cb5fe4d65abec256ff3f598c87958a1cfd9eece1d6de1b56d16c7723",
+ "https://deno.land/x/hono@v4.2.0/helper/streaming/sse.ts": "a88ae4615aace14fea1244538ab80dd591d1d05fb0f4cf57383150af4317d115",
+ "https://deno.land/x/hono@v4.2.0/helper/streaming/stream.ts": "a0eeb52395313ecb293edd1294dc21538b024ce1acc4745671f9f1548825cba2",
+ "https://deno.land/x/hono@v4.2.0/helper/streaming/text.ts": "bd8d1973feeabca63016cf638309aaeb829a914bf139a26120ca5c85e2b4ce96",
+ "https://deno.land/x/hono@v4.2.0/helper/testing/index.ts": "d4c51e2e1aff03dd1ce906737078931f1e32bcb40ae30652dcd3605247e07ec2",
+ "https://deno.land/x/hono@v4.2.0/hono-base.ts": "2a508c026687a1fc12c0458e100e66d5d72e17f6e6532b407d19663aa7300327",
+ "https://deno.land/x/hono@v4.2.0/hono.ts": "23edd0140bf0bd5a68c14ae96e5856a5cec6b844277e853b91025e91ea74f416",
+ "https://deno.land/x/hono@v4.2.0/http-exception.ts": "cd387c6f7357db375ac3375f0346c6da80b46193b661881f660d6b15293fc086",
+ "https://deno.land/x/hono@v4.2.0/jsx/base.ts": "4c1e9f841b8f287ed95541f4e0c6ba9afac2a353cb2a88dc373f27e2261b118b",
+ "https://deno.land/x/hono@v4.2.0/jsx/components.ts": "f79ab215f59388f01a69e2d6ec0b841fd3b42ba38e0ee7c93a525cdf06e159f9",
+ "https://deno.land/x/hono@v4.2.0/jsx/constants.ts": "03dbf805f4d07e3b34ab05ac84f3c0cb4fbafb2096fba7789a5f6226ca6f21ad",
+ "https://deno.land/x/hono@v4.2.0/jsx/context.ts": "2b7a86e6b35da171fab27aa05f09748bb3eba64b26c037ea1da655c07e8f6bc1",
+ "https://deno.land/x/hono@v4.2.0/jsx/dom/components.ts": "733da654edb3d4c178a4479649fac2c64e79069e37e848add0c3a49f90e7f2d7",
+ "https://deno.land/x/hono@v4.2.0/jsx/dom/context.ts": "39cd1108f0933934075fd88ef98139b0f29cce35b5d30d5fed2231daaa19c208",
+ "https://deno.land/x/hono@v4.2.0/jsx/dom/css.ts": "476699080c11fa16230e3fd59b6faf551e5d771c2998b4bf03368b3bc1f5a0e0",
+ "https://deno.land/x/hono@v4.2.0/jsx/dom/jsx-dev-runtime.ts": "266a61edb91f596f8581218c2afb253449fa700e069298b5a3e96ee064a57183",
+ "https://deno.land/x/hono@v4.2.0/jsx/dom/jsx-runtime.ts": "6a50a65306771a9000030f494d92a5fdeeb055112e0126234b2fd9179de1d4f5",
+ "https://deno.land/x/hono@v4.2.0/jsx/dom/render.ts": "ca76952d936e4994c08a8eef291a353ea39815f42b547f1b3cb143559b3227ca",
+ "https://deno.land/x/hono@v4.2.0/jsx/hooks/index.ts": "6a5e712581f29d1c28469006ec534833e600841939b5d0e13688bbcbaaf658f1",
+ "https://deno.land/x/hono@v4.2.0/jsx/index.ts": "ca3b63c99e446b29d5d1a6ec79948146e9c3c88121bcbfa4982d0e9b21e33906",
+ "https://deno.land/x/hono@v4.2.0/jsx/streaming.ts": "6a04614847ce8792b3c43cd9ca091077b4b4e86e756e81f37c672a5d9b7e9097",
+ "https://deno.land/x/hono@v4.2.0/jsx/types.ts": "880971bd1e0704a6fba6b786ca596cbe23fc06e36c506f42ea17f84f9879f278",
+ "https://deno.land/x/hono@v4.2.0/jsx/utils.ts": "7b9d84ce478c66a5f4709dc3a873ac7104ba3427597683221827abec2761da0e",
+ "https://deno.land/x/hono@v4.2.0/middleware.ts": "2e7c6062e36b0e5f84b44a62e7b0e1cef33a9827c19937c648be4b63e1b7d7c6",
+ "https://deno.land/x/hono@v4.2.0/middleware/basic-auth/index.ts": "2c8cb563f3b89df1a7a2232be37377c3df6194af38613dc0a823c6595816fc66",
+ "https://deno.land/x/hono@v4.2.0/middleware/bearer-auth/index.ts": "6a2361ca273a0dbbc9213b535a82dc434472f1e2ca85ab6d993b68f11d2067cd",
+ "https://deno.land/x/hono@v4.2.0/middleware/body-limit/index.ts": "3fefeaf7e6e576aa1b33f2694072d2eaab692842acd29cb360d98e20eebfe5aa",
+ "https://deno.land/x/hono@v4.2.0/middleware/cache/index.ts": "9bb67a362a9f06151709039a890837b8a1689a5a84a948a9a1483da876a99c0e",
+ "https://deno.land/x/hono@v4.2.0/middleware/compress/index.ts": "98c403a5fe7e9c5f5d776350b422b0a125fb34696851b8b14f825b9b7b06f2ac",
+ "https://deno.land/x/hono@v4.2.0/middleware/cors/index.ts": "976eb9ce8cefc214b403a2939503a13177cec76223274609a07ca554e0dc623b",
+ "https://deno.land/x/hono@v4.2.0/middleware/csrf/index.ts": "077bb0ce299d79d0d232cb9e462aaa4eaa901164f1310f74a7630f7e6cfe74e8",
+ "https://deno.land/x/hono@v4.2.0/middleware/etag/index.ts": "3392aabea4d02dfec51455c5919bff9aad76538b9fde375dd542fbc3f389dd3a",
+ "https://deno.land/x/hono@v4.2.0/middleware/jsx-renderer/index.ts": "98ed5803c3bdfded84040d859190a8cf850fc5b9b7fc9016ed1ee55992afca63",
+ "https://deno.land/x/hono@v4.2.0/middleware/jwt/index.ts": "4cb997d3d7a09d0b0c0e273841d29729e13e35dfc00021089aebaad868a7f8c6",
+ "https://deno.land/x/hono@v4.2.0/middleware/logger/index.ts": "52a2e968890ada2c11ce89a7a783692c5767b8ed7fb23ccf6b559d255d13ccbc",
+ "https://deno.land/x/hono@v4.2.0/middleware/method-override/index.ts": "303797bf0dc0600847f0a5f23a6351232c8bda596a64d38b3ef05e40ca354b42",
+ "https://deno.land/x/hono@v4.2.0/middleware/powered-by/index.ts": "6faba0cf042278d60b317b690640bb0b58747690cf280fa09024424c5174e66d",
+ "https://deno.land/x/hono@v4.2.0/middleware/pretty-json/index.ts": "2216ce4c9910be009fecac63367c3626b46137d4cf7cb9a82913e501104b4a88",
+ "https://deno.land/x/hono@v4.2.0/middleware/secure-headers/index.ts": "24cf3544002e882972842800bce223738b32c9c84bef7f74892e994819765f84",
+ "https://deno.land/x/hono@v4.2.0/middleware/serve-static/index.ts": "8a6e0e82ee7459e518ce8dc3d91e7872b272ffdf9a26dbcee3ff17f2157be088",
+ "https://deno.land/x/hono@v4.2.0/middleware/timing/index.ts": "241702aa10ab66cc832e8b556c57c236f3bf338a8817d802cb142eae0f852582",
+ "https://deno.land/x/hono@v4.2.0/middleware/trailing-slash/index.ts": "419cf0af99a137f591b72cc71c053e524fe3574393ce81e0e9dbce84a4046e24",
+ "https://deno.land/x/hono@v4.2.0/mod.ts": "35fd2a2e14b52365e0ad66f168b067363fd0a60d75cbcb1b01685b04de97d60e",
+ "https://deno.land/x/hono@v4.2.0/request.ts": "6f6e435955667425391f7626f4aa088211e33689a709ff9c4417746fc0b0dd96",
+ "https://deno.land/x/hono@v4.2.0/router.ts": "880316f561918fc197481755aac2165fdbe2f530b925c5357a9f98d6e2cc85c7",
+ "https://deno.land/x/hono@v4.2.0/router/linear-router/index.ts": "8a2a7144c50b1f4a92d9ee99c2c396716af144c868e10608255f969695efccd0",
+ "https://deno.land/x/hono@v4.2.0/router/linear-router/router.ts": "928d29894e4b45b047a4f453c7f1745c8b1869cd68447e1cb710c7bbf99a4e29",
+ "https://deno.land/x/hono@v4.2.0/router/pattern-router/index.ts": "304a66c50e243872037ed41c7dd79ed0c89d815e17e172e7ad7cdc4bc07d3383",
+ "https://deno.land/x/hono@v4.2.0/router/pattern-router/router.ts": "1b5f68e6af942579d3a40ee834294fea3d1f05fd5f70514e46ae301dd0107e46",
+ "https://deno.land/x/hono@v4.2.0/router/reg-exp-router/index.ts": "52755829213941756159b7a963097bafde5cc4fc22b13b1c7c9184dc0512d1db",
+ "https://deno.land/x/hono@v4.2.0/router/reg-exp-router/node.ts": "7efaa6f4301efc2aad0519c84973061be8555da02e5868409293a1fd98536aaf",
+ "https://deno.land/x/hono@v4.2.0/router/reg-exp-router/router.ts": "632f2fa426b3e45a66aeed03f7205dad6d13e8081bed6f8d1d987b6cad8fb455",
+ "https://deno.land/x/hono@v4.2.0/router/reg-exp-router/trie.ts": "852ce7207e6701e47fa30889a0d2b8bfcd56d8862c97e7bc9831e0a64bd8835f",
+ "https://deno.land/x/hono@v4.2.0/router/smart-router/index.ts": "74f9b4fe15ea535900f2b9b048581915f12fe94e531dd2b0032f5610e61c3bef",
+ "https://deno.land/x/hono@v4.2.0/router/smart-router/router.ts": "f1848a2a1eefa316a11853ae12e749552747771fb8a11fe713ae04ea6461140b",
+ "https://deno.land/x/hono@v4.2.0/router/trie-router/index.ts": "3eb75e7f71ba81801631b30de6b1f5cefb2c7239c03797e2b2cbab5085911b41",
+ "https://deno.land/x/hono@v4.2.0/router/trie-router/node.ts": "5786ed7b85bb55411ede249a381412d39406497285ce23c1eafd50551dcdc632",
+ "https://deno.land/x/hono@v4.2.0/router/trie-router/router.ts": "54ced78d35676302c8fcdda4204f7bdf5a7cc907fbf9967c75674b1e394f830d",
+ "https://deno.land/x/hono@v4.2.0/utils/body.ts": "1c7013f83bbef8216b3d862111efd5a183eaa29e86decf9a7eec6cdf25757e93",
+ "https://deno.land/x/hono@v4.2.0/utils/buffer.ts": "9066a973e64498cb262c7e932f47eed525a51677b17f90893862b7279dc0773e",
+ "https://deno.land/x/hono@v4.2.0/utils/color.ts": "23f8494d4cace2a74d4baf8216c69328ef7e5ed6ca8a402ba92f50144763d927",
+ "https://deno.land/x/hono@v4.2.0/utils/concurrent.ts": "789e3d0ee1b106007d0817f668c9f16da1618ef1029773afa0c1a885a5ec4eae",
+ "https://deno.land/x/hono@v4.2.0/utils/cookie.ts": "6eaaf6909a4ae11f6c82404e9398e1c247e3f1854d73994a9e2e6fc3cdf7b584",
+ "https://deno.land/x/hono@v4.2.0/utils/crypto.ts": "bda0e141bbe46d3a4a20f8fbcb6380d473b617123d9fdfa93e4499410b537acc",
+ "https://deno.land/x/hono@v4.2.0/utils/encode.ts": "311dfdfae7eb0b6345e9680f7ebbb3a692e872ed964e2029aca38567af8d1f33",
+ "https://deno.land/x/hono@v4.2.0/utils/filepath.ts": "a83e5fe87396bb291a6c5c28e13356fcbea0b5547bad2c3ba9660100ff964000",
+ "https://deno.land/x/hono@v4.2.0/utils/handler.ts": "2940f60d3fdae3df1ebde7f88c0f703c64bb1311c2c0a60f97e80a57b5690393",
+ "https://deno.land/x/hono@v4.2.0/utils/html.ts": "6ea4f6bf41587a51607dff7a6d2865ef4d5001e4203b07e5c8a45b63a098e871",
+ "https://deno.land/x/hono@v4.2.0/utils/jwt/index.ts": "3b66f48cdd3fcc2caed5e908ca31776e11b1c30391008931276da3035e6ba1e9",
+ "https://deno.land/x/hono@v4.2.0/utils/jwt/jwa.ts": "6874cacd8b6dde386636b81b5ea2754f8e4c61757802fa908dd1ce54b91a52fa",
+ "https://deno.land/x/hono@v4.2.0/utils/jwt/jws.ts": "22fdd03c26f5c2cc0ab03139f65859e688a9e4e4b383a91b189ccd03d21ad2c7",
+ "https://deno.land/x/hono@v4.2.0/utils/jwt/jwt.ts": "ea37caffefd49e64d01855a5cf51e957cc05b0010854a64dea677f9266ea4005",
+ "https://deno.land/x/hono@v4.2.0/utils/jwt/types.ts": "2845fe8633a5d39c958651ffef2733637e1a647f4b7b061de0458f0435f0f0f5",
+ "https://deno.land/x/hono@v4.2.0/utils/jwt/utf8.ts": "b9649f21ef91d1e83b3031a53970b29f13ff82053db3ffae372030706fa07d0e",
+ "https://deno.land/x/hono@v4.2.0/utils/mime.ts": "1e5db0919d2127995ec466dfd1ee637c3d63084f516ccbd3c6906ccf0d3f3c46",
+ "https://deno.land/x/hono@v4.2.0/utils/stream.ts": "491bebbc8cff49eddef05bca2e2d7b7c6d31c8444fdef60ae8a0373df293e6ae",
+ "https://deno.land/x/hono@v4.2.0/utils/url.ts": "855169632c61d03703bd08cafb27664ba3fdb352892f01687d5cce8fd49e3cb1",
+ "https://deno.land/x/hono@v4.2.0/validator/index.ts": "6c986e8b91dcf857ecc8164a506ae8eea8665792a4ff7215471df669c632ae7c",
+ "https://deno.land/x/hono@v4.2.0/validator/validator.ts": "6ac0cd5f77d5a921c71e83199d22a1f3692b8499faed958250bdca856d08de52",
+ "https://deno.land/x/hono@v4.2.1/adapter/deno/serve-static.ts": "62b57d461ecebbc7b98809c4fc2a8358f0828d6e89cdc6841054e5bb3828fc80",
+ "https://deno.land/x/hono@v4.2.1/client/client.ts": "b9d07d47a7b23f007fb2ea29a3185885e85a963a63b0f921f93ae2981ee29cda",
+ "https://deno.land/x/hono@v4.2.1/client/index.ts": "30def535310a37bede261f1b23d11a9758983b8e9d60a6c56309cee5f6746ab2",
+ "https://deno.land/x/hono@v4.2.1/client/utils.ts": "a93e5dc542dceb892a6b39cc793689478627ba958d251794193cf26c0ecf5800",
+ "https://deno.land/x/hono@v4.2.1/compose.ts": "37d6e33b7db80e4c43a0629b12fd3a1e3406e7d9e62a4bfad4b30426ea7ae4f1",
+ "https://deno.land/x/hono@v4.2.1/context.ts": "3d8c8a1aaea396fe22e2db822e1a270482c7f4b3b273f8f05ae3b240408bc7b2",
+ "https://deno.land/x/hono@v4.2.1/helper/adapter/index.ts": "5a4ca736487a2a8303bdac9fff710eae38e6f39ed70eb171eed78e5f64da84df",
+ "https://deno.land/x/hono@v4.2.1/helper/cookie/index.ts": "80b98f8a014e8b03a9130cce9fb03f6175f82a64367e954d120634f8543556e2",
+ "https://deno.land/x/hono@v4.2.1/helper/html/index.ts": "48a0ddc576c10452db6c3cab03dd4ee6986ab61ebdc667335b40a81fa0487f69",
+ "https://deno.land/x/hono@v4.2.1/hono-base.ts": "2a508c026687a1fc12c0458e100e66d5d72e17f6e6532b407d19663aa7300327",
+ "https://deno.land/x/hono@v4.2.1/hono.ts": "23edd0140bf0bd5a68c14ae96e5856a5cec6b844277e853b91025e91ea74f416",
+ "https://deno.land/x/hono@v4.2.1/http-exception.ts": "cd387c6f7357db375ac3375f0346c6da80b46193b661881f660d6b15293fc086",
+ "https://deno.land/x/hono@v4.2.1/jsx/base.ts": "4c1e9f841b8f287ed95541f4e0c6ba9afac2a353cb2a88dc373f27e2261b118b",
+ "https://deno.land/x/hono@v4.2.1/jsx/components.ts": "f79ab215f59388f01a69e2d6ec0b841fd3b42ba38e0ee7c93a525cdf06e159f9",
+ "https://deno.land/x/hono@v4.2.1/jsx/constants.ts": "03dbf805f4d07e3b34ab05ac84f3c0cb4fbafb2096fba7789a5f6226ca6f21ad",
+ "https://deno.land/x/hono@v4.2.1/jsx/context.ts": "2b7a86e6b35da171fab27aa05f09748bb3eba64b26c037ea1da655c07e8f6bc1",
+ "https://deno.land/x/hono@v4.2.1/jsx/dom/components.ts": "733da654edb3d4c178a4479649fac2c64e79069e37e848add0c3a49f90e7f2d7",
+ "https://deno.land/x/hono@v4.2.1/jsx/dom/context.ts": "39cd1108f0933934075fd88ef98139b0f29cce35b5d30d5fed2231daaa19c208",
+ "https://deno.land/x/hono@v4.2.1/jsx/dom/jsx-dev-runtime.ts": "266a61edb91f596f8581218c2afb253449fa700e069298b5a3e96ee064a57183",
+ "https://deno.land/x/hono@v4.2.1/jsx/dom/jsx-runtime.ts": "6a50a65306771a9000030f494d92a5fdeeb055112e0126234b2fd9179de1d4f5",
+ "https://deno.land/x/hono@v4.2.1/jsx/dom/render.ts": "ca76952d936e4994c08a8eef291a353ea39815f42b547f1b3cb143559b3227ca",
+ "https://deno.land/x/hono@v4.2.1/jsx/hooks/index.ts": "6a5e712581f29d1c28469006ec534833e600841939b5d0e13688bbcbaaf658f1",
+ "https://deno.land/x/hono@v4.2.1/jsx/index.ts": "ca3b63c99e446b29d5d1a6ec79948146e9c3c88121bcbfa4982d0e9b21e33906",
+ "https://deno.land/x/hono@v4.2.1/jsx/streaming.ts": "6a04614847ce8792b3c43cd9ca091077b4b4e86e756e81f37c672a5d9b7e9097",
+ "https://deno.land/x/hono@v4.2.1/jsx/types.ts": "880971bd1e0704a6fba6b786ca596cbe23fc06e36c506f42ea17f84f9879f278",
+ "https://deno.land/x/hono@v4.2.1/jsx/utils.ts": "7b9d84ce478c66a5f4709dc3a873ac7104ba3427597683221827abec2761da0e",
+ "https://deno.land/x/hono@v4.2.1/middleware.ts": "2e7c6062e36b0e5f84b44a62e7b0e1cef33a9827c19937c648be4b63e1b7d7c6",
+ "https://deno.land/x/hono@v4.2.1/middleware/basic-auth/index.ts": "2c8cb563f3b89df1a7a2232be37377c3df6194af38613dc0a823c6595816fc66",
+ "https://deno.land/x/hono@v4.2.1/middleware/bearer-auth/index.ts": "6a2361ca273a0dbbc9213b535a82dc434472f1e2ca85ab6d993b68f11d2067cd",
+ "https://deno.land/x/hono@v4.2.1/middleware/body-limit/index.ts": "3fefeaf7e6e576aa1b33f2694072d2eaab692842acd29cb360d98e20eebfe5aa",
+ "https://deno.land/x/hono@v4.2.1/middleware/cache/index.ts": "9bb67a362a9f06151709039a890837b8a1689a5a84a948a9a1483da876a99c0e",
+ "https://deno.land/x/hono@v4.2.1/middleware/compress/index.ts": "98c403a5fe7e9c5f5d776350b422b0a125fb34696851b8b14f825b9b7b06f2ac",
+ "https://deno.land/x/hono@v4.2.1/middleware/cors/index.ts": "976eb9ce8cefc214b403a2939503a13177cec76223274609a07ca554e0dc623b",
+ "https://deno.land/x/hono@v4.2.1/middleware/csrf/index.ts": "077bb0ce299d79d0d232cb9e462aaa4eaa901164f1310f74a7630f7e6cfe74e8",
+ "https://deno.land/x/hono@v4.2.1/middleware/etag/index.ts": "3392aabea4d02dfec51455c5919bff9aad76538b9fde375dd542fbc3f389dd3a",
+ "https://deno.land/x/hono@v4.2.1/middleware/jsx-renderer/index.ts": "98ed5803c3bdfded84040d859190a8cf850fc5b9b7fc9016ed1ee55992afca63",
+ "https://deno.land/x/hono@v4.2.1/middleware/jwt/index.ts": "4cb997d3d7a09d0b0c0e273841d29729e13e35dfc00021089aebaad868a7f8c6",
+ "https://deno.land/x/hono@v4.2.1/middleware/logger/index.ts": "52a2e968890ada2c11ce89a7a783692c5767b8ed7fb23ccf6b559d255d13ccbc",
+ "https://deno.land/x/hono@v4.2.1/middleware/method-override/index.ts": "303797bf0dc0600847f0a5f23a6351232c8bda596a64d38b3ef05e40ca354b42",
+ "https://deno.land/x/hono@v4.2.1/middleware/powered-by/index.ts": "6faba0cf042278d60b317b690640bb0b58747690cf280fa09024424c5174e66d",
+ "https://deno.land/x/hono@v4.2.1/middleware/pretty-json/index.ts": "2216ce4c9910be009fecac63367c3626b46137d4cf7cb9a82913e501104b4a88",
+ "https://deno.land/x/hono@v4.2.1/middleware/secure-headers/index.ts": "24cf3544002e882972842800bce223738b32c9c84bef7f74892e994819765f84",
+ "https://deno.land/x/hono@v4.2.1/middleware/serve-static/index.ts": "8a6e0e82ee7459e518ce8dc3d91e7872b272ffdf9a26dbcee3ff17f2157be088",
+ "https://deno.land/x/hono@v4.2.1/middleware/timing/index.ts": "241702aa10ab66cc832e8b556c57c236f3bf338a8817d802cb142eae0f852582",
+ "https://deno.land/x/hono@v4.2.1/middleware/trailing-slash/index.ts": "419cf0af99a137f591b72cc71c053e524fe3574393ce81e0e9dbce84a4046e24",
+ "https://deno.land/x/hono@v4.2.1/mod.ts": "35fd2a2e14b52365e0ad66f168b067363fd0a60d75cbcb1b01685b04de97d60e",
+ "https://deno.land/x/hono@v4.2.1/request.ts": "6f6e435955667425391f7626f4aa088211e33689a709ff9c4417746fc0b0dd96",
+ "https://deno.land/x/hono@v4.2.1/router.ts": "880316f561918fc197481755aac2165fdbe2f530b925c5357a9f98d6e2cc85c7",
+ "https://deno.land/x/hono@v4.2.1/router/linear-router/index.ts": "8a2a7144c50b1f4a92d9ee99c2c396716af144c868e10608255f969695efccd0",
+ "https://deno.land/x/hono@v4.2.1/router/linear-router/router.ts": "928d29894e4b45b047a4f453c7f1745c8b1869cd68447e1cb710c7bbf99a4e29",
+ "https://deno.land/x/hono@v4.2.1/router/pattern-router/index.ts": "304a66c50e243872037ed41c7dd79ed0c89d815e17e172e7ad7cdc4bc07d3383",
+ "https://deno.land/x/hono@v4.2.1/router/pattern-router/router.ts": "1b5f68e6af942579d3a40ee834294fea3d1f05fd5f70514e46ae301dd0107e46",
+ "https://deno.land/x/hono@v4.2.1/router/reg-exp-router/index.ts": "52755829213941756159b7a963097bafde5cc4fc22b13b1c7c9184dc0512d1db",
+ "https://deno.land/x/hono@v4.2.1/router/reg-exp-router/node.ts": "7efaa6f4301efc2aad0519c84973061be8555da02e5868409293a1fd98536aaf",
+ "https://deno.land/x/hono@v4.2.1/router/reg-exp-router/router.ts": "632f2fa426b3e45a66aeed03f7205dad6d13e8081bed6f8d1d987b6cad8fb455",
+ "https://deno.land/x/hono@v4.2.1/router/reg-exp-router/trie.ts": "852ce7207e6701e47fa30889a0d2b8bfcd56d8862c97e7bc9831e0a64bd8835f",
+ "https://deno.land/x/hono@v4.2.1/router/smart-router/index.ts": "74f9b4fe15ea535900f2b9b048581915f12fe94e531dd2b0032f5610e61c3bef",
+ "https://deno.land/x/hono@v4.2.1/router/smart-router/router.ts": "f1848a2a1eefa316a11853ae12e749552747771fb8a11fe713ae04ea6461140b",
+ "https://deno.land/x/hono@v4.2.1/router/trie-router/index.ts": "3eb75e7f71ba81801631b30de6b1f5cefb2c7239c03797e2b2cbab5085911b41",
+ "https://deno.land/x/hono@v4.2.1/router/trie-router/node.ts": "5786ed7b85bb55411ede249a381412d39406497285ce23c1eafd50551dcdc632",
+ "https://deno.land/x/hono@v4.2.1/router/trie-router/router.ts": "54ced78d35676302c8fcdda4204f7bdf5a7cc907fbf9967c75674b1e394f830d",
+ "https://deno.land/x/hono@v4.2.1/utils/body.ts": "1c7013f83bbef8216b3d862111efd5a183eaa29e86decf9a7eec6cdf25757e93",
+ "https://deno.land/x/hono@v4.2.1/utils/buffer.ts": "9066a973e64498cb262c7e932f47eed525a51677b17f90893862b7279dc0773e",
+ "https://deno.land/x/hono@v4.2.1/utils/color.ts": "23f8494d4cace2a74d4baf8216c69328ef7e5ed6ca8a402ba92f50144763d927",
+ "https://deno.land/x/hono@v4.2.1/utils/cookie.ts": "6eaaf6909a4ae11f6c82404e9398e1c247e3f1854d73994a9e2e6fc3cdf7b584",
+ "https://deno.land/x/hono@v4.2.1/utils/crypto.ts": "bda0e141bbe46d3a4a20f8fbcb6380d473b617123d9fdfa93e4499410b537acc",
+ "https://deno.land/x/hono@v4.2.1/utils/encode.ts": "311dfdfae7eb0b6345e9680f7ebbb3a692e872ed964e2029aca38567af8d1f33",
+ "https://deno.land/x/hono@v4.2.1/utils/filepath.ts": "a83e5fe87396bb291a6c5c28e13356fcbea0b5547bad2c3ba9660100ff964000",
+ "https://deno.land/x/hono@v4.2.1/utils/html.ts": "6ea4f6bf41587a51607dff7a6d2865ef4d5001e4203b07e5c8a45b63a098e871",
+ "https://deno.land/x/hono@v4.2.1/utils/jwt/index.ts": "3b66f48cdd3fcc2caed5e908ca31776e11b1c30391008931276da3035e6ba1e9",
+ "https://deno.land/x/hono@v4.2.1/utils/jwt/jwa.ts": "6874cacd8b6dde386636b81b5ea2754f8e4c61757802fa908dd1ce54b91a52fa",
+ "https://deno.land/x/hono@v4.2.1/utils/jwt/jws.ts": "878fa7d1966b0db20ae231cfee279ba2bb198943e949049cab3f5845cd5ee2d1",
+ "https://deno.land/x/hono@v4.2.1/utils/jwt/jwt.ts": "ea37caffefd49e64d01855a5cf51e957cc05b0010854a64dea677f9266ea4005",
+ "https://deno.land/x/hono@v4.2.1/utils/jwt/types.ts": "2845fe8633a5d39c958651ffef2733637e1a647f4b7b061de0458f0435f0f0f5",
+ "https://deno.land/x/hono@v4.2.1/utils/jwt/utf8.ts": "b9649f21ef91d1e83b3031a53970b29f13ff82053db3ffae372030706fa07d0e",
+ "https://deno.land/x/hono@v4.2.1/utils/mime.ts": "1e5db0919d2127995ec466dfd1ee637c3d63084f516ccbd3c6906ccf0d3f3c46",
+ "https://deno.land/x/hono@v4.2.1/utils/url.ts": "855169632c61d03703bd08cafb27664ba3fdb352892f01687d5cce8fd49e3cb1",
+ "https://deno.land/x/hono@v4.2.1/validator/index.ts": "6c986e8b91dcf857ecc8164a506ae8eea8665792a4ff7215471df669c632ae7c",
+ "https://deno.land/x/hono@v4.2.1/validator/validator.ts": "6ac0cd5f77d5a921c71e83199d22a1f3692b8499faed958250bdca856d08de52",
+ "https://deno.land/x/hono@v4.2.2/adapter/deno/serve-static.ts": "62b57d461ecebbc7b98809c4fc2a8358f0828d6e89cdc6841054e5bb3828fc80",
+ "https://deno.land/x/hono@v4.2.2/client/client.ts": "4afa3be7d5f36c507b50fa6185e7e94920160bed98417924e364cf32ff59e9e4",
+ "https://deno.land/x/hono@v4.2.2/client/index.ts": "30def535310a37bede261f1b23d11a9758983b8e9d60a6c56309cee5f6746ab2",
+ "https://deno.land/x/hono@v4.2.2/client/utils.ts": "a93e5dc542dceb892a6b39cc793689478627ba958d251794193cf26c0ecf5800",
+ "https://deno.land/x/hono@v4.2.2/compose.ts": "37d6e33b7db80e4c43a0629b12fd3a1e3406e7d9e62a4bfad4b30426ea7ae4f1",
+ "https://deno.land/x/hono@v4.2.2/context.ts": "3d8c8a1aaea396fe22e2db822e1a270482c7f4b3b273f8f05ae3b240408bc7b2",
+ "https://deno.land/x/hono@v4.2.2/helper/adapter/index.ts": "5a4ca736487a2a8303bdac9fff710eae38e6f39ed70eb171eed78e5f64da84df",
+ "https://deno.land/x/hono@v4.2.2/helper/cookie/index.ts": "80b98f8a014e8b03a9130cce9fb03f6175f82a64367e954d120634f8543556e2",
+ "https://deno.land/x/hono@v4.2.2/helper/html/index.ts": "48a0ddc576c10452db6c3cab03dd4ee6986ab61ebdc667335b40a81fa0487f69",
+ "https://deno.land/x/hono@v4.2.2/hono-base.ts": "2a508c026687a1fc12c0458e100e66d5d72e17f6e6532b407d19663aa7300327",
+ "https://deno.land/x/hono@v4.2.2/hono.ts": "23edd0140bf0bd5a68c14ae96e5856a5cec6b844277e853b91025e91ea74f416",
+ "https://deno.land/x/hono@v4.2.2/http-exception.ts": "cd387c6f7357db375ac3375f0346c6da80b46193b661881f660d6b15293fc086",
+ "https://deno.land/x/hono@v4.2.2/jsx/base.ts": "4c1e9f841b8f287ed95541f4e0c6ba9afac2a353cb2a88dc373f27e2261b118b",
+ "https://deno.land/x/hono@v4.2.2/jsx/components.ts": "f79ab215f59388f01a69e2d6ec0b841fd3b42ba38e0ee7c93a525cdf06e159f9",
+ "https://deno.land/x/hono@v4.2.2/jsx/constants.ts": "03dbf805f4d07e3b34ab05ac84f3c0cb4fbafb2096fba7789a5f6226ca6f21ad",
+ "https://deno.land/x/hono@v4.2.2/jsx/context.ts": "2b7a86e6b35da171fab27aa05f09748bb3eba64b26c037ea1da655c07e8f6bc1",
+ "https://deno.land/x/hono@v4.2.2/jsx/dom/components.ts": "733da654edb3d4c178a4479649fac2c64e79069e37e848add0c3a49f90e7f2d7",
+ "https://deno.land/x/hono@v4.2.2/jsx/dom/context.ts": "39cd1108f0933934075fd88ef98139b0f29cce35b5d30d5fed2231daaa19c208",
+ "https://deno.land/x/hono@v4.2.2/jsx/dom/jsx-dev-runtime.ts": "266a61edb91f596f8581218c2afb253449fa700e069298b5a3e96ee064a57183",
+ "https://deno.land/x/hono@v4.2.2/jsx/dom/jsx-runtime.ts": "6a50a65306771a9000030f494d92a5fdeeb055112e0126234b2fd9179de1d4f5",
+ "https://deno.land/x/hono@v4.2.2/jsx/dom/render.ts": "ca76952d936e4994c08a8eef291a353ea39815f42b547f1b3cb143559b3227ca",
+ "https://deno.land/x/hono@v4.2.2/jsx/hooks/index.ts": "6a5e712581f29d1c28469006ec534833e600841939b5d0e13688bbcbaaf658f1",
+ "https://deno.land/x/hono@v4.2.2/jsx/index.ts": "ca3b63c99e446b29d5d1a6ec79948146e9c3c88121bcbfa4982d0e9b21e33906",
+ "https://deno.land/x/hono@v4.2.2/jsx/streaming.ts": "6a04614847ce8792b3c43cd9ca091077b4b4e86e756e81f37c672a5d9b7e9097",
+ "https://deno.land/x/hono@v4.2.2/jsx/types.ts": "880971bd1e0704a6fba6b786ca596cbe23fc06e36c506f42ea17f84f9879f278",
+ "https://deno.land/x/hono@v4.2.2/jsx/utils.ts": "7b9d84ce478c66a5f4709dc3a873ac7104ba3427597683221827abec2761da0e",
+ "https://deno.land/x/hono@v4.2.2/middleware.ts": "2e7c6062e36b0e5f84b44a62e7b0e1cef33a9827c19937c648be4b63e1b7d7c6",
+ "https://deno.land/x/hono@v4.2.2/middleware/basic-auth/index.ts": "2c8cb563f3b89df1a7a2232be37377c3df6194af38613dc0a823c6595816fc66",
+ "https://deno.land/x/hono@v4.2.2/middleware/bearer-auth/index.ts": "6a2361ca273a0dbbc9213b535a82dc434472f1e2ca85ab6d993b68f11d2067cd",
+ "https://deno.land/x/hono@v4.2.2/middleware/body-limit/index.ts": "3fefeaf7e6e576aa1b33f2694072d2eaab692842acd29cb360d98e20eebfe5aa",
+ "https://deno.land/x/hono@v4.2.2/middleware/cache/index.ts": "9bb67a362a9f06151709039a890837b8a1689a5a84a948a9a1483da876a99c0e",
+ "https://deno.land/x/hono@v4.2.2/middleware/compress/index.ts": "98c403a5fe7e9c5f5d776350b422b0a125fb34696851b8b14f825b9b7b06f2ac",
+ "https://deno.land/x/hono@v4.2.2/middleware/cors/index.ts": "976eb9ce8cefc214b403a2939503a13177cec76223274609a07ca554e0dc623b",
+ "https://deno.land/x/hono@v4.2.2/middleware/csrf/index.ts": "077bb0ce299d79d0d232cb9e462aaa4eaa901164f1310f74a7630f7e6cfe74e8",
+ "https://deno.land/x/hono@v4.2.2/middleware/etag/index.ts": "3392aabea4d02dfec51455c5919bff9aad76538b9fde375dd542fbc3f389dd3a",
+ "https://deno.land/x/hono@v4.2.2/middleware/jsx-renderer/index.ts": "76b08d24c7b8cf3c808dc1d2063358c8b284e4fc48c8966b731a5d32286f62fd",
+ "https://deno.land/x/hono@v4.2.2/middleware/jwt/index.ts": "4cb997d3d7a09d0b0c0e273841d29729e13e35dfc00021089aebaad868a7f8c6",
+ "https://deno.land/x/hono@v4.2.2/middleware/logger/index.ts": "52a2e968890ada2c11ce89a7a783692c5767b8ed7fb23ccf6b559d255d13ccbc",
+ "https://deno.land/x/hono@v4.2.2/middleware/method-override/index.ts": "303797bf0dc0600847f0a5f23a6351232c8bda596a64d38b3ef05e40ca354b42",
+ "https://deno.land/x/hono@v4.2.2/middleware/powered-by/index.ts": "6faba0cf042278d60b317b690640bb0b58747690cf280fa09024424c5174e66d",
+ "https://deno.land/x/hono@v4.2.2/middleware/pretty-json/index.ts": "2216ce4c9910be009fecac63367c3626b46137d4cf7cb9a82913e501104b4a88",
+ "https://deno.land/x/hono@v4.2.2/middleware/secure-headers/index.ts": "24cf3544002e882972842800bce223738b32c9c84bef7f74892e994819765f84",
+ "https://deno.land/x/hono@v4.2.2/middleware/serve-static/index.ts": "8a6e0e82ee7459e518ce8dc3d91e7872b272ffdf9a26dbcee3ff17f2157be088",
+ "https://deno.land/x/hono@v4.2.2/middleware/timing/index.ts": "241702aa10ab66cc832e8b556c57c236f3bf338a8817d802cb142eae0f852582",
+ "https://deno.land/x/hono@v4.2.2/middleware/trailing-slash/index.ts": "419cf0af99a137f591b72cc71c053e524fe3574393ce81e0e9dbce84a4046e24",
+ "https://deno.land/x/hono@v4.2.2/mod.ts": "35fd2a2e14b52365e0ad66f168b067363fd0a60d75cbcb1b01685b04de97d60e",
+ "https://deno.land/x/hono@v4.2.2/request.ts": "6f6e435955667425391f7626f4aa088211e33689a709ff9c4417746fc0b0dd96",
+ "https://deno.land/x/hono@v4.2.2/router.ts": "880316f561918fc197481755aac2165fdbe2f530b925c5357a9f98d6e2cc85c7",
+ "https://deno.land/x/hono@v4.2.2/router/linear-router/index.ts": "8a2a7144c50b1f4a92d9ee99c2c396716af144c868e10608255f969695efccd0",
+ "https://deno.land/x/hono@v4.2.2/router/linear-router/router.ts": "928d29894e4b45b047a4f453c7f1745c8b1869cd68447e1cb710c7bbf99a4e29",
+ "https://deno.land/x/hono@v4.2.2/router/pattern-router/index.ts": "304a66c50e243872037ed41c7dd79ed0c89d815e17e172e7ad7cdc4bc07d3383",
+ "https://deno.land/x/hono@v4.2.2/router/pattern-router/router.ts": "1b5f68e6af942579d3a40ee834294fea3d1f05fd5f70514e46ae301dd0107e46",
+ "https://deno.land/x/hono@v4.2.2/router/reg-exp-router/index.ts": "52755829213941756159b7a963097bafde5cc4fc22b13b1c7c9184dc0512d1db",
+ "https://deno.land/x/hono@v4.2.2/router/reg-exp-router/node.ts": "7efaa6f4301efc2aad0519c84973061be8555da02e5868409293a1fd98536aaf",
+ "https://deno.land/x/hono@v4.2.2/router/reg-exp-router/router.ts": "632f2fa426b3e45a66aeed03f7205dad6d13e8081bed6f8d1d987b6cad8fb455",
+ "https://deno.land/x/hono@v4.2.2/router/reg-exp-router/trie.ts": "852ce7207e6701e47fa30889a0d2b8bfcd56d8862c97e7bc9831e0a64bd8835f",
+ "https://deno.land/x/hono@v4.2.2/router/smart-router/index.ts": "74f9b4fe15ea535900f2b9b048581915f12fe94e531dd2b0032f5610e61c3bef",
+ "https://deno.land/x/hono@v4.2.2/router/smart-router/router.ts": "f1848a2a1eefa316a11853ae12e749552747771fb8a11fe713ae04ea6461140b",
+ "https://deno.land/x/hono@v4.2.2/router/trie-router/index.ts": "3eb75e7f71ba81801631b30de6b1f5cefb2c7239c03797e2b2cbab5085911b41",
+ "https://deno.land/x/hono@v4.2.2/router/trie-router/node.ts": "5786ed7b85bb55411ede249a381412d39406497285ce23c1eafd50551dcdc632",
+ "https://deno.land/x/hono@v4.2.2/router/trie-router/router.ts": "54ced78d35676302c8fcdda4204f7bdf5a7cc907fbf9967c75674b1e394f830d",
+ "https://deno.land/x/hono@v4.2.2/utils/body.ts": "1c7013f83bbef8216b3d862111efd5a183eaa29e86decf9a7eec6cdf25757e93",
+ "https://deno.land/x/hono@v4.2.2/utils/buffer.ts": "9066a973e64498cb262c7e932f47eed525a51677b17f90893862b7279dc0773e",
+ "https://deno.land/x/hono@v4.2.2/utils/color.ts": "23f8494d4cace2a74d4baf8216c69328ef7e5ed6ca8a402ba92f50144763d927",
+ "https://deno.land/x/hono@v4.2.2/utils/cookie.ts": "6eaaf6909a4ae11f6c82404e9398e1c247e3f1854d73994a9e2e6fc3cdf7b584",
+ "https://deno.land/x/hono@v4.2.2/utils/crypto.ts": "bda0e141bbe46d3a4a20f8fbcb6380d473b617123d9fdfa93e4499410b537acc",
+ "https://deno.land/x/hono@v4.2.2/utils/encode.ts": "311dfdfae7eb0b6345e9680f7ebbb3a692e872ed964e2029aca38567af8d1f33",
+ "https://deno.land/x/hono@v4.2.2/utils/filepath.ts": "a83e5fe87396bb291a6c5c28e13356fcbea0b5547bad2c3ba9660100ff964000",
+ "https://deno.land/x/hono@v4.2.2/utils/html.ts": "6ea4f6bf41587a51607dff7a6d2865ef4d5001e4203b07e5c8a45b63a098e871",
+ "https://deno.land/x/hono@v4.2.2/utils/jwt/index.ts": "3b66f48cdd3fcc2caed5e908ca31776e11b1c30391008931276da3035e6ba1e9",
+ "https://deno.land/x/hono@v4.2.2/utils/jwt/jwa.ts": "6874cacd8b6dde386636b81b5ea2754f8e4c61757802fa908dd1ce54b91a52fa",
+ "https://deno.land/x/hono@v4.2.2/utils/jwt/jws.ts": "878fa7d1966b0db20ae231cfee279ba2bb198943e949049cab3f5845cd5ee2d1",
+ "https://deno.land/x/hono@v4.2.2/utils/jwt/jwt.ts": "ea37caffefd49e64d01855a5cf51e957cc05b0010854a64dea677f9266ea4005",
+ "https://deno.land/x/hono@v4.2.2/utils/jwt/types.ts": "2845fe8633a5d39c958651ffef2733637e1a647f4b7b061de0458f0435f0f0f5",
+ "https://deno.land/x/hono@v4.2.2/utils/jwt/utf8.ts": "b9649f21ef91d1e83b3031a53970b29f13ff82053db3ffae372030706fa07d0e",
+ "https://deno.land/x/hono@v4.2.2/utils/mime.ts": "1e5db0919d2127995ec466dfd1ee637c3d63084f516ccbd3c6906ccf0d3f3c46",
+ "https://deno.land/x/hono@v4.2.2/utils/url.ts": "855169632c61d03703bd08cafb27664ba3fdb352892f01687d5cce8fd49e3cb1",
+ "https://deno.land/x/hono@v4.2.2/validator/index.ts": "6c986e8b91dcf857ecc8164a506ae8eea8665792a4ff7215471df669c632ae7c",
+ "https://deno.land/x/hono@v4.2.2/validator/validator.ts": "6ac0cd5f77d5a921c71e83199d22a1f3692b8499faed958250bdca856d08de52",
+ "https://deno.land/x/oak@14.2.0/application.ts": "27242ca872580c44321b71e2581bcb7a81004b326b06bb7e90c2625278e405c2",
+ "https://deno.land/x/oak@14.2.0/body.ts": "da0ad584c6fb8acbe3ccad288ebb5e5cfd5e65e8186c0f6d43516bb6c11fb968",
+ "https://deno.land/x/oak@14.2.0/content_disposition.ts": "8b8c3cb2fba7138cd5b7f82fc3b5ea39b33db924a824b28261659db7e164621e",
+ "https://deno.land/x/oak@14.2.0/context.ts": "6a48ba99151478c5f7fd84072f722f9d20dd73816f175f001dbb8716a5225f6f",
+ "https://deno.land/x/oak@14.2.0/deps.ts": "9fdb7a99720ad023d609dda13f5d0cb995e8b5cc0e223e08cf2b1fb94c1ddca6",
+ "https://deno.land/x/oak@14.2.0/etag.ts": "68d2b34b6bbf41a5e57181f26a90e22ab2f5230d77bf7679b567444fb1a107de",
+ "https://deno.land/x/oak@14.2.0/form_data.ts": "dd3599c3b8e47e154434bf43049898187519117403d3494433a68d708f0d1937",
+ "https://deno.land/x/oak@14.2.0/forwarded.ts": "97fa621071e4878ce64196055b49cdf8ee63f1bb39185c9446bfb817c209bcc9",
+ "https://deno.land/x/oak@14.2.0/headers.ts": "4d74f92a6eda8746473612c04176823e3d12c52189aa4239e624a8ae61835f14",
+ "https://deno.land/x/oak@14.2.0/helpers.ts": "d198b50cb13abb1629406882a483c078015d75b3343991ad8ec69aabff879372",
+ "https://deno.land/x/oak@14.2.0/http_server_bun.ts": "7d36a3caab01578545257f8d197abc063d30f2df88529ba2e845006c74223910",
+ "https://deno.land/x/oak@14.2.0/http_server_native.ts": "ee1598e4bf798a0f6dfc04cde6639d318f73ae25963b13bacc355466e369758a",
+ "https://deno.land/x/oak@14.2.0/http_server_native_request.ts": "e34b9ef0e4a52bd3d5d761fff010256612e538aba1bef643c5ea805931e6a410",
+ "https://deno.land/x/oak@14.2.0/http_server_node.ts": "9ab25aae469e52aecd4cca85345a8e8ad9af6112a96728c13900ab6d51558ab9",
+ "https://deno.land/x/oak@14.2.0/middleware.ts": "5165e0c18f0a3b92bf01ca9d9f0ae211b30ca9b23a9460f11334459a2ff715aa",
+ "https://deno.land/x/oak@14.2.0/middleware/proxy.ts": "c136d22c3e396fdee6a9c2e2ba65388bb895d0f82af412c197bc7cda69e5664e",
+ "https://deno.land/x/oak@14.2.0/middleware/serve.ts": "83f6559b4cd5e5d30bcbe6acc8478bb7dbcb98af719952bc2810e2d6ead664ea",
+ "https://deno.land/x/oak@14.2.0/mod.ts": "0d29f7941ab1f170436a15c3c1f5de4fa94fbe32f4ec79732ed6e06c6b581ceb",
+ "https://deno.land/x/oak@14.2.0/node_shims.ts": "4db1569b2b79b73f37c4d947f4aaa50a93e266d48fe67601c8a31af17a28884d",
+ "https://deno.land/x/oak@14.2.0/range.ts": "789cb5bc86987843c4ea47e054cad6ceacfbe853c0a57f37a46596b8215c458e",
+ "https://deno.land/x/oak@14.2.0/request.ts": "86ea0498e934257ecc07d15ea83493547d9db49a29ae98b4bc76ab234e7d862b",
+ "https://deno.land/x/oak@14.2.0/response.ts": "b1985ece7b727d5ba8830ada09318f98ff967b25f63f3e976fc2ebda03b59750",
+ "https://deno.land/x/oak@14.2.0/router.ts": "568e45888c8a2a571e983129f337f8a944f492653ec943328dd58a4eb914c599",
+ "https://deno.land/x/oak@14.2.0/send.ts": "2ca6b54b16092ab209e2cbea1803947d101c5381bd59a84df5ce44cb1811999d",
+ "https://deno.land/x/oak@14.2.0/structured_clone.ts": "a01fa10ea9aae733264557f962630f155873d3bf45dbb2a8e53be5daa1b8cf5a",
+ "https://deno.land/x/oak@14.2.0/testing.ts": "157711ade8634f9377ca87147db4317861d51388c82e0da4ae829c142a123db8",
+ "https://deno.land/x/oak@14.2.0/types.ts": "09f0494db5d642e3492d23cd46da665d2df2590ef7e987b0412659260453d1f9",
+ "https://deno.land/x/oak@14.2.0/util.ts": "22fb55001472158ed4bdf53ce1a6848e10860507aa9a2e16d0b92d2b420f2a90",
+ "https://deno.land/x/oak@v11.1.0/application.ts": "0a728331822b8e27727ceec48a8499657c3163fc48fd379a8a9578a75f3cdb62",
+ "https://deno.land/x/oak@v11.1.0/body.ts": "78402a4936accb80372c4944384658105604352d6783de7ff1e36b8832dd93c9",
+ "https://deno.land/x/oak@v11.1.0/buf_reader.ts": "7cf96aa0ac670b75098113cf88a291a68332cc45efa8a9698f064ac5b8098a0f",
+ "https://deno.land/x/oak@v11.1.0/content_disposition.ts": "8b8c3cb2fba7138cd5b7f82fc3b5ea39b33db924a824b28261659db7e164621e",
+ "https://deno.land/x/oak@v11.1.0/context.ts": "014d1ce40e62a7901411425541b0d5a08018968a330595bd686f8d00222a35bb",
+ "https://deno.land/x/oak@v11.1.0/cookies.ts": "d9f94b99f26c6169c6982ce12323c41a548d001bfc28f464264c22dc3dbf2181",
+ "https://deno.land/x/oak@v11.1.0/deps.ts": "b897b0f2bec99cd8b402b279b7f21de955d98cbd72835b6c912be5e11c26148b",
+ "https://deno.land/x/oak@v11.1.0/etag.ts": "19918f5e1964e3fe6c9fe524a88ffbf9900ce1dfe4146b187b2a86256bb6b663",
+ "https://deno.land/x/oak@v11.1.0/headers.ts": "f50fb05614432bda971021633129aa2e8737e0844e0f01c27a937997b4d8dd4f",
+ "https://deno.land/x/oak@v11.1.0/helpers.ts": "42212afa07a560b2958359cc19577417e89d9574d6579551a0af36ff7f00cc6e",
+ "https://deno.land/x/oak@v11.1.0/http_request.ts": "0831c828816fcb58a5aa8361c6865c4151f4c8b59fabcef2e2cd235bb28170c5",
+ "https://deno.land/x/oak@v11.1.0/http_server_flash.ts": "e312754acad26d3d70f243d657547e697921f67f0a2179dbec41a20a3228fd79",
+ "https://deno.land/x/oak@v11.1.0/http_server_native.ts": "549dffcd2db5cbb0e44ad50cf9c54956b42a10450b1ac66e1362e32a073c8c1b",
+ "https://deno.land/x/oak@v11.1.0/http_server_native_request.ts": "07910ea2ed51af6c4e69addf9015cdd8d2b5c9ee03fd4993e386834a129a9eb6",
+ "https://deno.land/x/oak@v11.1.0/isMediaType.ts": "62d638abcf837ece3a8f07a4b7ca59794135cb0d4b73194c7d5837efd4161005",
+ "https://deno.land/x/oak@v11.1.0/keyStack.ts": "fa0d5898fb8ba34de1c9cdcf4b2e8434952dc9931671858d33560368784a22ef",
+ "https://deno.land/x/oak@v11.1.0/mediaTyper.ts": "042b853fc8e9c3f6c628dd389e03ef481552bf07242efc3f8a1af042102a6105",
+ "https://deno.land/x/oak@v11.1.0/middleware.ts": "de14f045a2ddfe845d89b5d3140ff52cbcc6f3b3965391106ce04480f9786737",
+ "https://deno.land/x/oak@v11.1.0/middleware/proxy.ts": "b927232f97ec18af4185d7912e45b1191e3ffe24a9c875262ad524211b1274c9",
+ "https://deno.land/x/oak@v11.1.0/mod.ts": "de52855c8f626e30ba683fb265c0a0773ba2f5f117b3549b7d9c857edba58338",
+ "https://deno.land/x/oak@v11.1.0/multipart.ts": "98fe9f226de8c26a16d067027b69fb1e34ad8c4055767dd157907d06cea36f9a",
+ "https://deno.land/x/oak@v11.1.0/range.ts": "68a6df7ab3b868843e33f52deb94c3d4cab25cb9ef369691990c2ac15b04fafb",
+ "https://deno.land/x/oak@v11.1.0/request.ts": "5852ad36389b48e0428a6f3c90854d01f10d1b15949b56001e1e75c2a00ef0f9",
+ "https://deno.land/x/oak@v11.1.0/response.ts": "867d81f7eb0c65c7b8e0e0e9e145ededd5b6daa9ad922e6adc6a36a525f439a6",
+ "https://deno.land/x/oak@v11.1.0/router.ts": "187522a549f6c179ff01d321882a8bfacbfb7f3e24b004ec4534a3613c7f9b0e",
+ "https://deno.land/x/oak@v11.1.0/send.ts": "7ef2591792426d62add91536bb434566d4b224247ca343fdd63e486f9d4e9446",
+ "https://deno.land/x/oak@v11.1.0/server_sent_event.ts": "948b0fe4cb3fe38c7db15e476eb3b7671ef20e566d130e9f701d7c0146aa47dd",
+ "https://deno.land/x/oak@v11.1.0/structured_clone.ts": "ecf42598652b8082f37252cb873d6e257ad728e6fe73c6bd61f343d94501fbde",
+ "https://deno.land/x/oak@v11.1.0/testing.ts": "7612656efd2975f7a2e6848609f5971922dbec46b76372c5c623202fdd7b9a85",
+ "https://deno.land/x/oak@v11.1.0/util.ts": "3af8c4ed04c6cc2bedbe66e562a77fc59c72df31c55a902a63885861ca1639d6",
+ "https://deno.land/x/oak_logger@1.0.0/mod.ts": "10253fd9517a71d3c0771fcf2d9bd9297874160794d470597afce4102b0d51b3",
+ "https://deno.land/x/path_to_regexp@v6.2.1/index.ts": "894060567837bae8fc9c5cbd4d0a05e9024672083d5883b525c031eea940e556"
+ },
+ "workspace": {
+ "dependencies": [
+ "npm:@vitejs/plugin-react@^4.2.1",
+ "npm:react",
+ "npm:react-dom",
+ "npm:react-router-dom@^6.4",
+ "npm:react-vant@^3.3.4",
+ "npm:vite@^5.0.10"
+ ]
+ }
+}
diff --git a/_sili/app/index.html b/_sili/app/index.html
new file mode 100644
index 0000000000..e0d1c84080
--- /dev/null
+++ b/_sili/app/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite + React + TS
+
+
+
+
+
+
diff --git a/_sili/app/public/vite-deno.svg b/_sili/app/public/vite-deno.svg
new file mode 100644
index 0000000000..62267f70db
--- /dev/null
+++ b/_sili/app/public/vite-deno.svg
@@ -0,0 +1,36 @@
+
diff --git a/_sili/app/public/vite.svg b/_sili/app/public/vite.svg
new file mode 100644
index 0000000000..e7b8dfb1b2
--- /dev/null
+++ b/_sili/app/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/_sili/app/src/App.css b/_sili/app/src/App.css
new file mode 100644
index 0000000000..2c5e2ef5cd
--- /dev/null
+++ b/_sili/app/src/App.css
@@ -0,0 +1,41 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/_sili/app/src/App.tsx b/_sili/app/src/App.tsx
new file mode 100644
index 0000000000..b9c0e57236
--- /dev/null
+++ b/_sili/app/src/App.tsx
@@ -0,0 +1,21 @@
+import React from "react";
+import {
+ BrowserRouter as Router,
+ Navigate,
+ Route,
+ Routes,
+} from "react-router-dom";
+import Index from "./pages/Index.jsx";
+import Dinosaur from "./pages/Dinosaur.jsx";
+
+export default function App(props:any) {
+ return (
+
+
+ } />
+ } />
+ } />
+
+
+ );
+}
diff --git a/_sili/app/src/assets/react.svg b/_sili/app/src/assets/react.svg
new file mode 100644
index 0000000000..6c87de9bb3
--- /dev/null
+++ b/_sili/app/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/_sili/app/src/index.css b/_sili/app/src/index.css
new file mode 100644
index 0000000000..2c3fac689c
--- /dev/null
+++ b/_sili/app/src/index.css
@@ -0,0 +1,69 @@
+:root {
+ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/_sili/app/src/main.tsx b/_sili/app/src/main.tsx
new file mode 100644
index 0000000000..791f139e24
--- /dev/null
+++ b/_sili/app/src/main.tsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
+
+
+ ,
+)
diff --git a/_sili/app/src/pages/Dinosaur.jsx b/_sili/app/src/pages/Dinosaur.jsx
new file mode 100644
index 0000000000..c38ae5ba2c
--- /dev/null
+++ b/_sili/app/src/pages/Dinosaur.jsx
@@ -0,0 +1,24 @@
+import React, { useEffect, useState } from "react";
+import { Link, useParams } from "react-router-dom";
+
+const Dinosaur = () => {
+ const { dinosaur } = useParams();
+ const [dino, setDino] = useState({});
+ useEffect(() => {
+ fetch(`http://localhost:8000/api/${dinosaur}`)
+ .then(async (res) => await res.json())
+ .then((json) => setDino(json));
+ }, []);
+
+ return (
+
+
{dino.name}
+
+ {dino.description}
+
+
查看全部
+
+ );
+};
+
+export default Dinosaur;
diff --git a/_sili/app/src/pages/Index.jsx b/_sili/app/src/pages/Index.jsx
new file mode 100644
index 0000000000..4abb0092de
--- /dev/null
+++ b/_sili/app/src/pages/Index.jsx
@@ -0,0 +1,60 @@
+import React, { useEffect, useState } from "react";
+import { Link, useParams } from "react-router-dom";
+import { Button } from 'react-vant';
+
+const Index = () => {
+ const [dinos, setDinos] = useState([]);
+ const [error, setError] = useState(null); // 添加错误状态
+
+ useEffect(() => {
+ const fetchDinos = async () => {
+ try {
+ const response = await fetch(`http://localhost:8000/api`);
+ if (response.ok) { // 检查响应状态码
+ const json = await response.json();
+ setDinos(json);
+ } else {
+ const text = await response.text();
+ console.warn("Failed to fetch dinosaurs:", text);
+ setError(text); // 设置错误信息
+ }
+ } catch (e) {
+ console.error("Fetch error:", e);
+ setError(e.message); // 设置错误信息
+ }
+ };
+
+ fetchDinos();
+ }, []);
+
+ if (error) {
+ return 服务器错误: {error}
; // 如果有错误,显示错误信息
+ }
+
+ return (
+
+
欢迎来到恐龙应用
+
+ 单击下面的恐龙以了解更多信息。
+
+
+
+
+
+
+
+
+
+ {dinos.map((dino) => {
+ return (
+
+ {dino.name}
+
+ );
+ })}
+
+
+ );
+};
+
+export default Index;
diff --git a/_sili/app/src/vite-env.d.ts b/_sili/app/src/vite-env.d.ts
new file mode 100644
index 0000000000..11f02fe2a0
--- /dev/null
+++ b/_sili/app/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/_sili/app/vite.config.mts b/_sili/app/vite.config.mts
new file mode 100644
index 0000000000..c4c3d063c8
--- /dev/null
+++ b/_sili/app/vite.config.mts
@@ -0,0 +1,8 @@
+// 在 deno.jsonc 中添加了导入映射的无需在此 import "npm:xxx"
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()]
+})
diff --git a/app/appearance/.gitignore b/app/appearance/.gitignore
index f853a9864b..97f89c1faf 100644
--- a/app/appearance/.gitignore
+++ b/app/appearance/.gitignore
@@ -2,8 +2,7 @@ themes/*/custom.css
themes/*
!themes/daylight/
!themes/midnight/
-!themes/sillon/
-!themes/sillou/
+!themes/_lnco/
icons/
!icons/ant/
diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json
index 225d01c47b..5986375671 100644
--- a/app/appearance/langs/en_US.json
+++ b/app/appearance/langs/en_US.json
@@ -1,4 +1,8 @@
{
+ "unbindBlock": "Unbind block",
+ "showTitle": "Show database title",
+ "fillCreated": "Default fill created time",
+ "removeCard": "Remove flashcard",
"updateLayout": "Update layout",
"dndFolderTip": "Please note that ${x} only inserts the file:// hyperlink and does not copy the file",
"removeCol": "Are you sure you want to delete the ${x} column in the database?",
@@ -98,7 +102,7 @@
"imported": "Import completed",
"mirrorTip": "Mirror database, all data updates will be synchronized to all other mirrors",
"includeTime": "Include time",
- "accountSupport1": "Since its first public release on August 31, 2020, SiYuan has been released a total of 481 times, solved user requirements and feedback 9257 times, and submitted code 10189 times. We cannot do without your support and feedback.",
+ "accountSupport1": "Since its first public release on August 31, 2020, SiYuan has been released a total of 580 times, solved user requirements and feedback 10591 times, and commited code 12822 times. We cannot do without your support and feedback.",
"accountSupport2": "Your support and feedback will allow SiYuan to develop and develop better. We will always be friends with users, work hard to make products better, and provide you with a better knowledge management experience. Thank you very much for your support!",
"goToTab1": "Go to tab #1",
"goToTab2": "Go to tab #2",
@@ -685,7 +689,8 @@
"syncMode2": "Manual (automatic auto only once when the software is started and closed, other times need to manually trigger)",
"syncMode3": "Full manual sync (no sync on startup and shutdown, full manual control of sync timing and sync direction)",
"cloudSync": "Cloud sync",
- "cloudSyncDir": "Cloud sync dir",
+ "cloudSyncDir": "Cloud sync directory",
+ "cloudSyncDirTip": "The cloud sync directory corresponds one-to-one with the workspace and cannot be mixed. After changing the data repo key, a new cloud sync directory needs to be replaced",
"emptyCloudSyncList": "The cloud sync list is empty",
"retry": "Retry",
"insertVideoURL": "Insert video link",
@@ -741,7 +746,7 @@
"moveToLeft": "Move Left",
"moveToRight": "Move Right",
"copyProtocol": "Copy block hyperlink",
- "copyProtocolInMd": "Copy block hyperlink (Markdown)",
+ "copyProtocolInMd": "Copy block Markdown link",
"uploadAssets2CDN": "Upload asset files to cloud",
"uploadAssets2CDNConfirmTip": "Are you sure to upload the assets in this document to the cloud?",
"notSupport1": "Does not support drag and drop across notebooks",
@@ -989,6 +994,7 @@
"fileTree19": "Some operating systems have technical limitations that may prevent manual copying of workspace data after creating sub-documents greater than 7 levels",
"fileTree20": "Save with a single line",
"fileTree21": "After enabling, the single-line JSON format will be used when saving .sy docs and database .json files, which can reduce the file size by about 30% and improve read and write efficiency by 50%",
+ "export10": "For example <span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span>
, if empty, use watermark text or watermark file path.",
"export11": "Content handling method of content ref block when exporting",
"export12": "Content handling method of content embed block when exporting",
"export13": "Anchor text wrapping symbol",
@@ -1052,6 +1058,7 @@
"parentRelation": "Parent - Child",
"openInNewTab": "Open in New Tab",
"help": "Help",
+ "userGuide": "User Guide",
"paragraphBeginningSpace": "Two empty spaces at the beginning of the paragraph",
"outline": "Outline",
"newFile": "New Doc",
@@ -1396,7 +1403,7 @@
"170": "Uploading data repo chunk %v/%v",
"171": "Uploading data repo reference %s",
"172": "If you forget the authorization code, please find help here",
- "173": " Access Auth Code Please",
+ "173": " Access Auth Code",
"174": "Unlock access",
"175": "Please enter the verification code",
"176": "SiYuan (Sillot) ",
diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json
index b5ccb6909e..c55a49c2e4 100644
--- a/app/appearance/langs/es_ES.json
+++ b/app/appearance/langs/es_ES.json
@@ -1,4 +1,8 @@
{
+ "unbindBlock": "Desvincular bloque",
+ "showTitle": "Mostrar título de la base de datos",
+ "fillCreated": "Hora de creación del relleno predeterminado",
+ "removeCard": "Eliminar tarjeta flash",
"updateLayout": "Actualizar diseño",
"dndFolderTip": "Tenga en cuenta que ${x} solo inserta el hipervínculo file:// y no copia el archivo",
"removeCol": "¿Está seguro de que desea eliminar la columna ${x} en la base de datos?",
@@ -98,7 +102,7 @@
"imported": "Importación completada",
"mirrorTip": "Base de datos espejo, todas las actualizaciones de datos se sincronizarán con todos los demás espejos",
"includeTime": "Incluir tiempo",
- "accountSupport1": "Desde su primer lanzamiento público el 31 de agosto de 2020, SiYuan se ha publicado un total de 481 veces, ha resuelto los requisitos y comentarios de los usuarios 9257 veces y ha enviado código 10189 veces. No podemos prescindir de su apoyo y comentarios.",
+ "accountSupport1": "Desde su primer lanzamiento público el 31 de agosto de 2020, SiYuan se ha publicado un total de 580 veces, ha resuelto los requisitos y comentarios de los usuarios 10591 veces y ha enviado código 12822 veces. No podemos prescindir de su apoyo y comentarios.",
"accountSupport2": "Su apoyo y comentarios permitirán a SiYuan desarrollarse y desarrollarse mejor. Siempre seremos amigos de los usuarios, trabajaremos duro para mejorar los productos y brindarle una mejor experiencia de gestión del conocimiento. ¡Muchas gracias por tu apoyo!",
"goToTab1": "Ir a la pestaña #1",
"goToTab2": "Ir a la pestaña #2",
@@ -354,7 +358,7 @@
"pointExchangeSize": "Intercambio de puntos",
"panels": "Paneles",
"copyPath": "Copiar ruta",
- "workspaceList": "Áreas de trabajo",
+ "workspaceList": "Espacio de trabajo",
"removeWorkspaceTip": "Quitar de los espacios de trabajo",
"new": "Nuevo",
"share2LiandiConfirmTip": "¿Estás seguro de compartir este documento con comunidad?",
@@ -685,7 +689,8 @@
"syncMode2": "Manual (automático sólo una vez cuando se inicia y se cierra el software, otras veces hay que activarlo manualmente)",
"syncMode3": "Manual Completa (sin sincronización al iniciar y apagar, control manual completo de sincronización y dirección de sincronización)",
"cloudSync": "Sincronización en la nube",
- "cloudSyncDir": "Destino de sincronización en la nube",
+ "cloudSyncDir": "Directorio de sincronización en la nube",
+ "cloudSyncDirTip": "El Directorio de sincronización en la nube corresponde uno a uno con el Espacio de trabajo, no se pueden mezclar. Después de cambiar la Clave del repositorio de datos, es necesario cambiar el nuevo Directorio de sincronización en la nube",
"emptyCloudSyncList": "La lista de sincronización con la nube está vacía",
"retry": "Reintentar",
"insertVideoURL": "Insertar enlace de vídeo",
@@ -741,7 +746,7 @@
"moveToLeft": "Mover a la izquierda",
"moveToRight": "Mover a la derecha",
"copyProtocol": "Copiar hipervínculo de bloque",
- "copyProtocolInMd": "Copiar hipervínculo de bloque (Markdown)",
+ "copyProtocolInMd": "Copiar enlace de bloque de Markdown",
"uploadAssets2CDN": "Subir archivos de activos a la nube",
"uploadAssets2CDNConfirmTip": "¿Está seguro de cargar los recursos de este documento en la nube?",
"notSupport1": "No admite la función de arrastrar y soltar en los cuadernos",
@@ -989,6 +994,7 @@
"fileTree19": "Algunos sistemas operativos tienen limitaciones técnicas que pueden impedir la copia manual de los datos del espacio de trabajo después de crear subdocumentos de más de 7 niveles",
"fileTree20": "Guardar con una sola línea",
"fileTree21": "Después de habilitarlo, se utilizará el formato JSON de una sola línea al guardar documentos .sy y archivos .json de bases de datos, lo que puede reducir el tamaño del archivo en aproximadamente un 30 % y mejorar la eficiencia de lectura y escritura en un 50 %.",
+ "export10": "Por ejemplo <span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span>
, si está vacío, utilice texto de marca de agua o ruta del archivo de marca de agua.",
"export11": "Método de manejo de contenido del bloque de referencia de contenido al exportar",
"export12": "Método de manejo de contenido del bloque de incrustación de contenido al exportar",
"export13": "Símbolo de envoltura de texto ancla",
@@ -1052,6 +1058,7 @@
"parentRelation": "Padre - Hijo",
"openInNewTab": "Abrir en una nueva pestaña",
"help": "Ayuda",
+ "userGuide": "User Guide",
"paragraphBeginningSpace": "Dos espacios vacíos al principio del párrafo",
"outline": "Esquema",
"newFile": "Nuevo documento",
diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json
index 955761ea9f..50b4d8cbba 100644
--- a/app/appearance/langs/fr_FR.json
+++ b/app/appearance/langs/fr_FR.json
@@ -1,4 +1,8 @@
{
+ "unbindBlock": "Dissocier le bloc",
+ "showTitle": "Afficher le titre de la base de données",
+ "fillCreated": "Heure de création de remplissage par défaut",
+ "removeCard": "Supprimer la flashcard",
"updateLayout": "Mettre à jour la mise en page",
"dndFolderTip": "Veuillez noter que ${x} insère uniquement le lien hypertexte file:// et ne copie pas le fichier",
"removeCol": "Êtes-vous sûr de vouloir supprimer la colonne ${x} de la base de données ?",
@@ -98,7 +102,7 @@
"imported": "Importation terminée",
"mirrorTip": "Base de données miroir, toutes les mises à jour des données seront synchronisées avec tous les autres miroirs",
"includeTime": "Inclure l'heure",
- "accountSupport1": "Depuis sa première version publique le 31 août 2020, SiYuan a été publié 481 fois au total, a répondu aux exigences et aux commentaires des utilisateurs 9 257 fois et a soumis du code 10 189 fois. Nous ne pouvons pas nous passer de votre soutien et de vos commentaires.",
+ "accountSupport1": "Depuis sa première version publique le 31 août 2020, SiYuan a été publié 580 fois au total, a répondu aux exigences et aux commentaires des utilisateurs 10 591 fois et a soumis du code 12 822 fois. Nous ne pouvons pas nous passer de votre soutien et de vos commentaires.",
"accountSupport2": "Votre soutien et vos retours permettront à SiYuan de se développer et de mieux se développer. Nous serons toujours amis avec les utilisateurs, travaillerons dur pour améliorer les produits et vous offrirons une meilleure expérience de gestion des connaissances. Merci beaucoup pour votre soutient!",
"goToTab1": "Aller à l'onglet #1",
"goToTab2": "Aller à l'onglet #2",
@@ -686,6 +690,7 @@
"syncMode3": "Manuelle Complète (pas de synchronisation au démarrage et à l'arrêt, contrôle manuel complet de la synchronisation et du sens de synchronisation)",
"cloudSync": "Cloud Sync",
"cloudSyncDir": "Répertoire de sync cloud",
+ "cloudSyncDirTip": "Les répertoires de synchronisation cloud correspondent un à un aux espaces de travail, ils ne doivent pas être mélangés. Après avoir modifié la clé de référentiel de données, il est nécessaire de remplacer le nouveau répertoire de synchronisation cloud",
"emptyCloudSyncList": "La liste de sync du cloud est videy",
"retry": "Réessayer",
"insertVideoURL": "Insérer lien vidéo",
@@ -741,7 +746,7 @@
"moveToLeft": "vers la Gauche",
"moveToRight": "vers la Droite",
"copyProtocol": "Copier bloc d'hyperliens",
- "copyProtocolInMd": "Copier bloc d'hyperliens (Markdown)",
+ "copyProtocolInMd": "Copier le lien Markdown du bloc",
"uploadAssets2CDN": "Transférer les fichiers asset vers le Cloud",
"uploadAssets2CDNConfirmTip": "Êtes-vous sûr de télécharger les ressources de ce document dans le cloud ?",
"notSupport1": "Le glisser-déposer entre carnets n'est pas pris en charge",
@@ -989,6 +994,7 @@
"fileTree19": "Certains systèmes d'exploitation ont des limitations techniques qui peuvent empêcher la copie manuelle des données de l'espace de travail après la création de sous-documents supérieurs à 7 niveaux",
"fileTree20": "Enregistrer avec une seule ligne",
"fileTree21": "Après activation, le format JSON sur une seule ligne sera utilisé lors de l'enregistrement des documents .sy et des fichiers .json de base de données, ce qui peut réduire la taille du fichier d'environ 30 % et améliorer l'efficacité de lecture et d'écriture de 50 %",
+ "export10": "Par exemple <span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span>
, s'il est vide, utilisez le texte du filigrane ou le chemin du fichier du filigrane.",
"export11": "Traitement du contenu des blocs de référence lors de l'exportation",
"export12": "Gestion du contenu des blocs intégrés lors de l'exportation",
"export13": "Symbole d'enveloppement du texte d'ancrage",
@@ -1052,6 +1058,7 @@
"parentRelation": "Parent - Enfant",
"openInNewTab": "Ouvrir dans un nouvel onglet",
"help": "Aide",
+ "userGuide": "User Guide",
"paragraphBeginningSpace": "Deux espaces vides au début du paragraphe",
"outline": "Outline",
"newFile": "Nouveau Doc",
diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json
index 466cff1af9..18c1270371 100644
--- a/app/appearance/langs/zh_CHT.json
+++ b/app/appearance/langs/zh_CHT.json
@@ -1,4 +1,8 @@
{
+ "unbindBlock": "取消綁定區塊",
+ "showTitle": "顯示資料庫標題",
+ "fillCreated": "預設填滿創建時間",
+ "removeCard": "移除閃卡",
"updateLayout": "更新版面配置",
"dndFolderTip": "請注意 ${x} 僅插入 file:// 超鏈接,不複製檔案",
"removeCol": "確定刪除資料庫中的 ${x} 欄位?",
@@ -98,7 +102,7 @@
"imported": "導入完成",
"mirrorTip": "鏡像資料庫,所有資料更新會同步到其他所有鏡像中",
"includeTime": "具體時間",
- "accountSupport1": "自 2020 年 8 月 31 日第一次公開版本以來,思源筆記已累計發版 481 次,解決用戶需求與反饋 9257 次,提交代碼 10189 次,背後無數次的辛勤付出與長期堅持不懈的更新都 離不開您的支持與回饋。",
+ "accountSupport1": "自 2020 年 8 月 31 日第一次公開版本以來,思源筆記已累計發版 580 次,解決用戶需求與反饋 10591 次,提交代碼 12822 次,背後無數次的辛勤付出與長期堅持不懈的更新都 離不開您的支持與回饋。",
"accountSupport2": "您的支持與回饋能讓思源筆記更好地開發與發展下去,我們會一直與使用者做朋友,用心做好產品,為您提供更好的知識管理體驗。 非常感謝您的支持! ",
"goToTab1": "跳到第一個頁籤",
"goToTab2": "跳到第二個頁籤",
@@ -437,13 +441,13 @@
"downloaded": "已下載",
"allOp": "所有操作",
"allNotebooks": "所有筆記本",
- "historyClean": "清理 (clean)",
- "historyUpdate": "更新 (update)",
- "historyDelete": "刪除 (delete)",
- "historyFormat": "格式化 (format)",
- "historySync": "同步 (sync)",
- "historyReplace": "替換 (replace)",
- "historyOutline": "大綱 (outline)",
+ "historyClean": "清理 (clean)",
+ "historyUpdate": "更新 (update)",
+ "historyDelete": "刪除 (delete)",
+ "historyFormat": "排版 (format)",
+ "historySync": "同步 (sync)",
+ "historyReplace": "替換 (replace)",
+ "historyOutline": "大綱 (outline)",
"htmlBlockError": "以下 script 執行會影響界面顯示,已經停止運行該腳本",
"fileHistory": "文件歷史",
"htmlBlockTip": "形成了多個 HTML 塊,為防止資料丟失請使用 <div>
標籤包裹並去掉空行",
@@ -686,6 +690,7 @@
"syncMode3": "完全手動同步(啟動和關閉時均不同步,完全手動控制同步時機和同步方向)",
"cloudSync": "雲端同步",
"cloudSyncDir": "雲端同步目錄",
+ "cloudSyncDirTip": "雲端同步目錄與工作空間一一對應,不可混用。資料倉庫密鑰更改後需要更換新的雲端同步目錄",
"emptyCloudSyncList": "雲端同步列表為空",
"retry": "重試",
"insertVideoURL": "插入影片連結",
@@ -741,7 +746,7 @@
"moveToLeft": "向左移",
"moveToRight": "向右移",
"copyProtocol": "複製塊超連結",
- "copyProtocolInMd": "複製塊超連結(Markdown)",
+ "copyProtocolInMd": "複製塊 Markdown 連結",
"uploadAssets2CDN": "上傳資料檔到圖床",
"uploadAssets2CDNConfirmTip": "確定將該文檔內的資源文件上傳到圖床嗎?",
"notSupport1": "不支援跨筆記本進行拖拽",
@@ -989,6 +994,7 @@
"fileTree19": "一些操作系統存在技術限制導致建立大於 7 層的子文檔後可能無法正常手動複製工作空間資料",
"fileTree20": "使用單行保存",
"fileTree21": "啟用後儲存 .sy 文件和資料庫 .json 時將使用單行 JSON 格式,大約能減少 30% 檔案大小並提升 50% 讀寫效率",
+ "export10": "例如 <span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span>
,為空時使用水印文字或浮水印檔案路徑。",
"export11": "匯出時關於引用塊內容的處理方式",
"export12": "匯出時關於嵌入塊內容的處理方式",
"export13": "錨文字包裹符號",
@@ -1052,6 +1058,7 @@
"parentRelation": "父子關係",
"openInNewTab": "在新分頁中打開",
"help": "幫助",
+ "userGuide": "用戶指南",
"paragraphBeginningSpace": "段落開頭空兩格",
"outline": "大綱",
"newFile": "新建文檔",
diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json
index b487960f1a..b12e2756b6 100644
--- a/app/appearance/langs/zh_CN.json
+++ b/app/appearance/langs/zh_CN.json
@@ -1,4 +1,8 @@
{
+ "unbindBlock": "取消绑定块",
+ "showTitle": "显示数据库标题",
+ "fillCreated": "默认填充创建时间",
+ "removeCard": "移除闪卡",
"updateLayout": "更新布局",
"dndFolderTip": "请注意 ${x} 仅插入 file:// 超链接,不复制文件",
"removeCol": "确定删除数据库中的 ${x} 列?",
@@ -98,7 +102,7 @@
"imported": "导入完成",
"mirrorTip": "镜像数据库,所有数据更新会同步到其他所有镜像中",
"includeTime": "具体时间",
- "accountSupport1": "自 2020 年 8 月 31 日第一次公开发版以来,思源笔记已累计发版 481 次,解决用户需求与反馈 9257 次,提交代码 10189 次,背后无数次的辛勤付出与长期坚持不懈的更新都离不开您的支持与反馈。",
+ "accountSupport1": "自 2020 年 8 月 31 日第一次公开发版以来,思源笔记已累计发版 580 次,解决用户需求与反馈 10591 次,提交代码 12822 次,背后无数次的辛勤付出与长期坚持不懈的更新都离不开您的支持与反馈。",
"accountSupport2": "您的支持与反馈能够让思源笔记更好地开发与发展下去,我们会一直与用户做朋友,用心做好产品,为您提供更好的知识管理体验。非常感谢您的支持!",
"goToTab1": "跳转到第一个页签",
"goToTab2": "跳转到第二个页签",
@@ -438,13 +442,13 @@
"downloaded": "已下载",
"allOp": "所有操作",
"allNotebooks": "所有笔记本",
- "historyClean": "清理 (clean)",
- "historyUpdate": "更新 (update)",
- "historyDelete": "删除 (delete)",
- "historyFormat": "格式化 (format)",
- "historySync": "同步 (sync)",
- "historyReplace": "替换 (replace)",
- "historyOutline": "大纲 (outline)",
+ "historyClean": "清理 (clean)",
+ "historyUpdate": "更新 (update)",
+ "historyDelete": "删除 (delete)",
+ "historyFormat": "排版 (format)",
+ "historySync": "同步 (sync)",
+ "historyReplace": "替换 (replace)",
+ "historyOutline": "大纲 (outline)",
"htmlBlockError": "以下 script 执行会影响界面显示,已经停止运行该脚本",
"fileHistory": "文件历史",
"htmlBlockTip": "形成了多个 HTML 块,为防止数据丢失请使用 <div>
标签包裹并去掉空行",
@@ -687,6 +691,7 @@
"syncMode3": "完全手动同步(启动和关闭时均不同步,完全手动控制同步时机和同步方向)",
"cloudSync": "云端同步",
"cloudSyncDir": "云端同步目录",
+ "cloudSyncDirTip": "云端同步目录与工作空间一一对应,不可混用。数据仓库密钥更改后需要更换新的云端同步目录",
"emptyCloudSyncList": "云端同步列表为空",
"retry": "重试",
"insertVideoURL": "插入视频链接",
@@ -732,7 +737,7 @@
"sub": "下标",
"enter": "聚焦",
"enterBack": "聚焦到上层",
- "duplicate": "重复",
+ "duplicate": "复制为副本",
"turnInto": "转换为",
"split": "分屏",
"underline": "下划线",
@@ -742,7 +747,7 @@
"moveToLeft": "向左移",
"moveToRight": "向右移",
"copyProtocol": "复制块超链接",
- "copyProtocolInMd": "复制块超链接(Markdown)",
+ "copyProtocolInMd": "复制块 Markdown 链接",
"uploadAssets2CDN": "上传资源文件到图床",
"uploadAssets2CDNConfirmTip": "确定将该文档内的资源文件上传到图床吗?",
"notSupport1": "不支持跨笔记本进行拖拽",
@@ -990,6 +995,7 @@
"fileTree19": "一些操作系统存在技术限制导致创建大于 7 层的子文档后可能无法正常手动复制工作空间数据",
"fileTree20": "使用单行保存",
"fileTree21": "启用后保存 .sy 文档和数据库 .json 时将使用单行 JSON 格式,大约能减少 30% 文件大小并提升 50% 读写效率",
+ "export10": "例如 <span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\">SiYuan</span>
,为空时使用水印文本或水印文件路径。",
"export11": "导出时关于引用块内容的处理方式",
"export12": "导出时关于嵌入块内容的处理方式",
"export13": "锚文本包裹符号",
@@ -1053,6 +1059,7 @@
"parentRelation": "父子关系",
"openInNewTab": "在新页签中打开",
"help": "帮助",
+ "userGuide": "用户指南",
"paragraphBeginningSpace": "段落开头空两格",
"outline": "大纲",
"newFile": "新建文档",
diff --git a/app/appearance/themes/_lnco/.gitignore b/app/appearance/themes/_lnco/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/app/appearance/themes/sillou/theme.css b/app/appearance/themes/_lnco/dark/theme.css
similarity index 100%
rename from app/appearance/themes/sillou/theme.css
rename to app/appearance/themes/_lnco/dark/theme.css
diff --git a/app/appearance/themes/sillon/theme.css b/app/appearance/themes/_lnco/light/theme.css
similarity index 100%
rename from app/appearance/themes/sillon/theme.css
rename to app/appearance/themes/_lnco/light/theme.css
diff --git a/app/appearance/themes/sillou/theme.json b/app/appearance/themes/_lnco/theme.json
similarity index 63%
rename from app/appearance/themes/sillou/theme.json
rename to app/appearance/themes/_lnco/theme.json
index 07b72b2a89..d899d88913 100644
--- a/app/appearance/themes/sillou/theme.json
+++ b/app/appearance/themes/_lnco/theme.json
@@ -1,9 +1,10 @@
{
- "name": "sillou",
+ "name": "lnco",
"author": "Soltus",
"url": "https://github.com/Soltus",
- "version": "1.0.2",
+ "version": "1.0.1",
"modes": [
+ "light",
"dark"
]
}
diff --git a/app/appearance/themes/sillon/theme.json b/app/appearance/themes/sillon/theme.json
deleted file mode 100644
index dc832d5ebe..0000000000
--- a/app/appearance/themes/sillon/theme.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "sillon",
- "author": "Soltus",
- "url": "https://github.com/Soltus",
- "version": "1.0.2",
- "modes": [
- "light"
- ]
-}
diff --git a/app/appx/AppxManifest.xml b/app/appx/AppxManifest.xml
index eb0308f76d..4f015d56cf 100644
--- a/app/appx/AppxManifest.xml
+++ b/app/appx/AppxManifest.xml
@@ -9,7 +9,7 @@
+ Version="3.0.8.0"/>
SiYuan
云南链滴科技有限公司
diff --git a/app/changelogs/v3.0.7/v3.0.7.md b/app/changelogs/v3.0.7/v3.0.7.md
new file mode 100644
index 0000000000..7b626be2c0
--- /dev/null
+++ b/app/changelogs/v3.0.7/v3.0.7.md
@@ -0,0 +1,31 @@
+## Overview
+
+This version fixes some bugs that affected general use.
+
+## Changelogs
+
+Below are the detailed changes in this version.
+
+### Enhancement
+
+* [Export PDF and add watermarks no longer covered by images](https://github.com/siyuan-note/siyuan/issues/10818)
+* [Don't show floating window when editing ref](https://github.com/siyuan-note/siyuan/issues/10821)
+* [Improve database template empty date rendering](https://github.com/siyuan-note/siyuan/issues/10830)
+* [Document title supports `Paste as plain text`](https://github.com/siyuan-note/siyuan/issues/10832)
+* [Generate document history when dragging outline](https://github.com/siyuan-note/siyuan/issues/10834)
+* [`↓` Support jump to the end of the line](https://github.com/siyuan-note/siyuan/issues/10847)
+* [Improve block ref search ID extraction](https://github.com/siyuan-note/siyuan/issues/10848)
+
+### Bugfix
+
+* [Outline drag function is abnormal](https://github.com/siyuan-note/siyuan/issues/10828)
+* [Abnormal sorting of database relation fields](https://github.com/siyuan-note/siyuan/issues/10835)
+* [Side panel auto hide on the mobile](https://github.com/siyuan-note/siyuan/issues/10837)
+* [Database rollup calculation misses null values](https://github.com/siyuan-note/siyuan/issues/10843)
+* [Last row misaligned after adjusting column width](https://github.com/siyuan-note/siyuan/issues/10844)
+* [Unable to roll back document history](https://github.com/siyuan-note/siyuan/issues/10846)
+
+## Download
+
+* [B3log](https://b3log.org/siyuan/en/download.html)
+* [GitHub](https://github.com/siyuan-note/siyuan/releases)
diff --git a/app/changelogs/v3.0.7/v3.0.7_zh_CHT.md b/app/changelogs/v3.0.7/v3.0.7_zh_CHT.md
new file mode 100644
index 0000000000..202d429ea7
--- /dev/null
+++ b/app/changelogs/v3.0.7/v3.0.7_zh_CHT.md
@@ -0,0 +1,31 @@
+## 概述
+
+該版本修復了一些影響常規使用的缺陷。
+
+## 變更記錄
+
+以下是此版本中的詳細變更。
+
+### 改進功能
+
+* [匯出 PDF 新增浮水印不再被圖片覆蓋](https://github.com/siyuan-note/siyuan/issues/10818)
+* [編輯引用時不顯示浮動視窗](https://github.com/siyuan-note/siyuan/issues/10821)
+* [改進資料庫範本空日期渲染](https://github.com/siyuan-note/siyuan/issues/10830)
+* [文件標題支援 `貼為純文字`](https://github.com/siyuan-note/siyuan/issues/10832)
+* [拖曳大綱時產生文件歷史](https://github.com/siyuan-note/siyuan/issues/10834)
+* [`↓` 支援跳到行尾](https://github.com/siyuan-note/siyuan/issues/10847)
+* [改進區塊引用搜尋 ID 擷取](https://github.com/siyuan-note/siyuan/issues/10848)
+
+### 修復缺陷
+
+* [大綱拖曳功能異常](https://github.com/siyuan-note/siyuan/issues/10828)
+* [資料庫關聯欄位排序異常](https://github.com/siyuan-note/siyuan/issues/10835)
+* [行動端側邊欄自動隱藏](https://github.com/siyuan-note/siyuan/issues/10837)
+* [資料庫總計欄位計算遺漏空值](https://github.com/siyuan-note/siyuan/issues/10843)
+* [調整列寬後最後一行未對齊](https://github.com/siyuan-note/siyuan/issues/10844)
+* [無法回溯文件歷史](https://github.com/siyuan-note/siyuan/issues/10846)
+
+## 下載
+
+* [B3log](https://b3log.org/siyuan/download.html)
+* [GitHub](https://github.com/siyuan-note/siyuan/releases)
diff --git a/app/changelogs/v3.0.7/v3.0.7_zh_CN.md b/app/changelogs/v3.0.7/v3.0.7_zh_CN.md
new file mode 100644
index 0000000000..fa5c81774e
--- /dev/null
+++ b/app/changelogs/v3.0.7/v3.0.7_zh_CN.md
@@ -0,0 +1,31 @@
+## 概述
+
+该版本修复了一些影响常规使用的缺陷。
+
+## 变更记录
+
+以下是此版本中的详细变更。
+
+### 改进功能
+
+* [导出 PDF 添加水印不再被图片覆盖](https://github.com/siyuan-note/siyuan/issues/10818)
+* [编辑引用时不显示浮动窗口](https://github.com/siyuan-note/siyuan/issues/10821)
+* [改进数据库模板空日期渲染](https://github.com/siyuan-note/siyuan/issues/10830)
+* [文档标题支持 `粘贴为纯文本`](https://github.com/siyuan-note/siyuan/issues/10832)
+* [拖动大纲时生成文档历史](https://github.com/siyuan-note/siyuan/issues/10834)
+* [`↓` 支持跳转到行尾](https://github.com/siyuan-note/siyuan/issues/10847)
+* [改进块引用搜索 ID 提取](https://github.com/siyuan-note/siyuan/issues/10848)
+
+### 修复缺陷
+
+* [大纲拖动功能异常](https://github.com/siyuan-note/siyuan/issues/10828)
+* [数据库关联字段排序异常](https://github.com/siyuan-note/siyuan/issues/10835)
+* [移动端侧边栏自动隐藏](https://github.com/siyuan-note/siyuan/issues/10837)
+* [数据库汇总字段计算遗漏空值](https://github.com/siyuan-note/siyuan/issues/10843)
+* [调整列宽后最后一行未对齐](https://github.com/siyuan-note/siyuan/issues/10844)
+* [无法回滚文档历史](https://github.com/siyuan-note/siyuan/issues/10846)
+
+## 下载
+
+* [B3log](https://b3log.org/siyuan/download.html)
+* [GitHub](https://github.com/siyuan-note/siyuan/releases)
diff --git a/app/changelogs/v3.0.8/v3.0.8.md b/app/changelogs/v3.0.8/v3.0.8.md
new file mode 100644
index 0000000000..ceaa188a4a
--- /dev/null
+++ b/app/changelogs/v3.0.8/v3.0.8.md
@@ -0,0 +1,67 @@
+## Overview
+
+This version supports the database date field filling the current time by default.
+
+## Changelogs
+
+Below are the detailed changes in this version.
+
+### Enhancement
+
+* [Database date field supports filling the current time by default](https://github.com/siyuan-note/siyuan/issues/10823)
+* [Database primary key supports unbinding block](https://github.com/siyuan-note/siyuan/issues/10849)
+* [Improve flashcard menu](https://github.com/siyuan-note/siyuan/issues/10857)
+* [Refresh the corresponding rollup after deleting rows from the database](https://github.com/siyuan-note/siyuan/issues/10858)
+* [Auto verify the database name when clicking the block superscript icon](https://github.com/siyuan-note/siyuan/issues/10861)
+* [Improve doc title `Paste as plain text`](https://github.com/siyuan-note/siyuan/issues/10866)
+* [Ignore `*` back mentions and virtual references](https://github.com/siyuan-note/siyuan/issues/10873)
+* [Improve performance of importing .sy.zip](https://github.com/siyuan-note/siyuan/issues/10874)
+* [Support adding database blocks to a database](https://github.com/siyuan-note/siyuan/issues/10876)
+* [Improve interaction of the database table view selected cell content](https://github.com/siyuan-note/siyuan/issues/10877)
+* [Improve selection of iframe block](https://github.com/siyuan-note/siyuan/issues/10879)
+* [Improve database block ref anchor text display](https://github.com/siyuan-note/siyuan/issues/10880)
+* [Database select field filters follow option editing changes](https://github.com/siyuan-note/siyuan/issues/10881)
+* [Improve database primary key setting](https://github.com/siyuan-note/siyuan/issues/10882)
+* [Improve database table view UI](https://github.com/siyuan-note/siyuan/pull/10886)
+* [Improve view tab UI in database table view](https://github.com/siyuan-note/siyuan/issues/10887)
+* [Improve the cursor style of the scroll bar at the bottom of the database table view](https://github.com/siyuan-note/siyuan/issues/10888)
+* [Improve database block text in breadcrumbs](https://github.com/siyuan-note/siyuan/issues/10891)
+* [Improve block attributes panel spellcheck](https://github.com/siyuan-note/siyuan/issues/10897)
+* [Clicking the document focus will not switch in read-only mode](https://github.com/siyuan-note/siyuan/issues/10898)
+* [Improve cursor position after Esc and Del](https://github.com/siyuan-note/siyuan/issues/10899)
+* [Support drag widget block](https://github.com/siyuan-note/siyuan/issues/10900)
+* [Improve `Show Database Title` item in database view menu](https://github.com/siyuan-note/siyuan/issues/10908)
+* [Support adding the current document in the database](https://github.com/siyuan-note/siyuan/issues/10912)
+* [Support floating window to open related database when filling in the database relation field](https://github.com/siyuan-note/siyuan/issues/10915)
+* [Improve /widget search](https://github.com/siyuan-note/siyuan/issues/10917)
+* [Database blocks are included in document word count](https://github.com/siyuan-note/siyuan/issues/10918)
+* [Improve remove and duplication of column menu in database table view](https://github.com/siyuan-note/siyuan/issues/10920)
+* [Remove rows in database bound to child blocks when deleting parent block](https://github.com/siyuan-note/siyuan/issues/10923)
+* [Improv updateing of outlines, backlinks and charts when switching between doc and pdf](https://github.com/siyuan-note/siyuan/issues/10930)
+* [Disable outline item dragging when the doc is read-only](https://github.com/siyuan-note/siyuan/issues/10931)
+* [`Add to Database` search on database title only](https://github.com/siyuan-note/siyuan/issues/10934)
+* [Improve user guide entry](https://github.com/siyuan-note/siyuan/pull/10939)
+* [Improve spaces at the beginning of exported paragraphs](https://github.com/siyuan-note/siyuan/issues/10940)
+
+### Bugfix
+
+* [Database relation field `Ctrl+Hover` not open the floating window](https://github.com/siyuan-note/siyuan/issues/10836)
+* [Creating a new block may cause the tab to close](https://github.com/siyuan-note/siyuan/issues/10851)
+* [Database column width adjustment fails](https://github.com/siyuan-note/siyuan/issues/10865)
+* [Database date between filter cannot select the end time](https://github.com/siyuan-note/siyuan/issues/10870)
+* [The order after `Enter` at the end of `1\n\n2` is wrong](https://github.com/siyuan-note/siyuan/issues/10901)
+* [`Bold+Inline code` causes the content to disappear](https://github.com/siyuan-note/siyuan/issues/10910)
+* [Database rollup calculation range anomaly](https://github.com/siyuan-note/siyuan/issues/10913)
+* [Cannot open doc via `siyuan://` when startup the application](https://github.com/siyuan-note/siyuan/issues/10937)
+* [Unbind the "Hide Window" hotkey exception](https://github.com/siyuan-note/siyuan/issues/10938)
+* [`Ctrl+X` followed by `Ctrl+M` cannot call out inline-level formula editing](https://github.com/siyuan-note/siyuan/issues/10941)
+
+### Refactor
+
+* [Upgrade to Electron v28.2.10](https://github.com/siyuan-note/siyuan/issues/10869)
+* [Improve outline loading mechanism](https://github.com/siyuan-note/siyuan/issues/10884)
+
+## Download
+
+* [B3log](https://b3log.org/siyuan/en/download.html)
+* [GitHub](https://github.com/siyuan-note/siyuan/releases)
diff --git a/app/changelogs/v3.0.8/v3.0.8_zh_CHT.md b/app/changelogs/v3.0.8/v3.0.8_zh_CHT.md
new file mode 100644
index 0000000000..889b31e399
--- /dev/null
+++ b/app/changelogs/v3.0.8/v3.0.8_zh_CHT.md
@@ -0,0 +1,67 @@
+## 概述
+
+此版本支援了資料庫日期欄位預設填入目前時間。
+
+## 變更記錄
+
+以下是此版本中的詳細變更。
+
+### 改進功能
+
+* [資料庫日期欄位支援預設填入目前時間](https://github.com/siyuan-note/siyuan/issues/10823)
+* [資料庫主鍵支援解綁區塊](https://github.com/siyuan-note/siyuan/issues/10849)
+* [改進閃卡選單](https://github.com/siyuan-note/siyuan/issues/10857)
+* [從資料庫刪除行後刷新對應的總和](https://github.com/siyuan-note/siyuan/issues/10858)
+* [點選區塊上標圖示時自動校驗資料庫名稱](https://github.com/siyuan-note/siyuan/issues/10861)
+* [改進文件標題 `貼上為純文字`](https://github.com/siyuan-note/siyuan/issues/10866)
+* [忽略 `*` 提及與虛擬引用](https://github.com/siyuan-note/siyuan/issues/10873)
+* [提高導入 .sy.zip 的效能](https://github.com/siyuan-note/siyuan/issues/10874)
+* [支援新增資料庫區塊](https://github.com/siyuan-note/siyuan/issues/10876)
+* [改進資料庫表格視圖選取儲存格內容的互動](https://github.com/siyuan-note/siyuan/issues/10877)
+* [改進 iframe 區塊的選擇](https://github.com/siyuan-note/siyuan/issues/10879)
+* [改進資料庫區塊引用錨文本顯示](https://github.com/siyuan-note/siyuan/issues/10880)
+* [資料庫選擇欄位過濾器跟隨選項編輯變更](https://github.com/siyuan-note/siyuan/issues/10881)
+* [改進資料庫主鍵設定](https://github.com/siyuan-note/siyuan/issues/10882)
+* [改進資料庫表格視圖介面](https://github.com/siyuan-note/siyuan/pull/10886)
+* [改進資料庫表格檢視中的檢視標籤介面](https://github.com/siyuan-note/siyuan/issues/10887)
+* [改進資料庫表格視圖底部捲軸的遊標樣式](https://github.com/siyuan-note/siyuan/issues/10888)
+* [改進麵包屑中的資料庫區塊文字](https://github.com/siyuan-note/siyuan/issues/10891)
+* [改進塊屬性面板拼字檢查](https://github.com/siyuan-note/siyuan/issues/10897)
+* [點選文件重點在唯讀模式下不會切換](https://github.com/siyuan-note/siyuan/issues/10898)
+* [改進 Esc 和 Del 後的遊標位置](https://github.com/siyuan-note/siyuan/issues/10899)
+* [支援拖曳掛件區塊](https://github.com/siyuan-note/siyuan/issues/10900)
+* [改進資料庫檢視選單中的 `顯示資料庫標題` 項](https://github.com/siyuan-note/siyuan/issues/10908)
+* [支援在資料庫中新增目前文件](https://github.com/siyuan-note/siyuan/issues/10912)
+* [支援填充資料庫關係欄位時開啟浮動視窗以開啟相關資料庫](https://github.com/siyuan-note/siyuan/issues/10915)
+* [改進 /widget 搜尋](https://github.com/siyuan-note/siyuan/issues/10917)
+* [資料庫區塊包含在文件字數統計中](https://github.com/siyuan-note/siyuan/issues/10918)
+* [改進資料庫表格檢視中的列選單的刪除和複製](https://github.com/siyuan-note/siyuan/issues/10920)
+* [刪除父區塊時刪除綁定到子區塊的資料庫行](https://github.com/siyuan-note/siyuan/issues/10923)
+* [在文件和 PDF 之間切換時,改進大綱、反向連結和圖表的更新](https://github.com/siyuan-note/siyuan/issues/10930)
+* [當文件為唯讀時停用大綱項拖曳](https://github.com/siyuan-note/siyuan/issues/10931)
+* [`加入資料庫` 只在資料庫標題上搜尋](https://github.com/siyuan-note/siyuan/issues/10934)
+* [改進使用者指南入口](https://github.com/siyuan-note/siyuan/pull/10939)
+* [改進匯出段落開頭的空格](https://github.com/siyuan-note/siyuan/issues/10940)
+
+### 修復缺陷
+
+* [資料庫關聯欄位 `Ctrl+Hover` 不開啟浮動視窗](https://github.com/siyuan-note/siyuan/issues/10836)
+* [建立新的區塊可能會導致頁籤關閉](https://github.com/siyuan-note/siyuan/issues/10851)
+* [資料庫列寬調整失效](https://github.com/siyuan-note/siyuan/issues/10865)
+* [資料庫日期間隔過濾器無法選擇結束時間](https://github.com/siyuan-note/siyuan/issues/10870)
+* [`1\n\n2` 結尾處按 `Enter` 後的順序錯誤](https://github.com/siyuan-note/siyuan/issues/10901)
+* [`Bold+Inline code` 導致內容消失](https://github.com/siyuan-note/siyuan/issues/10910)
+* [資料庫總結計算極差異常](https://github.com/siyuan-note/siyuan/issues/10913)
+* [啟動應用程式時無法透過 `siyuan://` 開啟文件](https://github.com/siyuan-note/siyuan/issues/10937)
+* [解綁 "隱藏視窗" 快速鍵異常](https://github.com/siyuan-note/siyuan/issues/10938)
+* [`Ctrl+X` 後 `Ctrl+M` 無法召喚出行級公式編輯](https://github.com/siyuan-note/siyuan/issues/10941)
+
+### 開發重構
+
+* [升級至 Electron v28.2.10](https://github.com/siyuan-note/siyuan/issues/10869)
+* [改進大綱載入機制](https://github.com/siyuan-note/siyuan/issues/10884)
+
+## 下載
+
+* [B3log](https://b3log.org/siyuan/download.html)
+* [GitHub](https://github.com/siyuan-note/siyuan/releases)
diff --git a/app/changelogs/v3.0.8/v3.0.8_zh_CN.md b/app/changelogs/v3.0.8/v3.0.8_zh_CN.md
new file mode 100644
index 0000000000..f3e8c6be90
--- /dev/null
+++ b/app/changelogs/v3.0.8/v3.0.8_zh_CN.md
@@ -0,0 +1,67 @@
+## 概述
+
+该版本支持了数据库日期字段默认填充当前时间。
+
+## 变更记录
+
+以下是此版本中的详细变更。
+
+### 改进功能
+
+* [数据库日期字段支持默认填充当前时间](https://github.com/siyuan-note/siyuan/issues/10823)
+* [数据库主键支持解绑块](https://github.com/siyuan-note/siyuan/issues/10849)
+* [改进闪卡菜单](https://github.com/siyuan-note/siyuan/issues/10857)
+* [从数据库删除行后刷新相应的汇总](https://github.com/siyuan-note/siyuan/issues/10858)
+* [点击块上标图标时自动校验数据库名称](https://github.com/siyuan-note/siyuan/issues/10861)
+* [改进文档标题 `粘贴为纯文本`](https://github.com/siyuan-note/siyuan/issues/10866)
+* [忽略 `*` 提及和虚拟引用](https://github.com/siyuan-note/siyuan/issues/10873)
+* [提高导入 .sy.zip 的性能](https://github.com/siyuan-note/siyuan/issues/10874)
+* [支持向数据库添加数据库块](https://github.com/siyuan-note/siyuan/issues/10876)
+* [改进数据库表格视图选中单元格内容的交互](https://github.com/siyuan-note/siyuan/issues/10877)
+* [改进 iframe 块的选择](https://github.com/siyuan-note/siyuan/issues/10879)
+* [改进数据库块引用锚文本显示](https://github.com/siyuan-note/siyuan/issues/10880)
+* [数据库选择字段过滤器跟随选项编辑更改](https://github.com/siyuan-note/siyuan/issues/10881)
+* [改进数据库主键设置](https://github.com/siyuan-note/siyuan/issues/10882)
+* [改进数据库表格视图界面](https://github.com/siyuan-note/siyuan/pull/10886)
+* [改进数据库表格视图中的视图选项卡界面](https://github.com/siyuan-note/siyuan/issues/10887)
+* [改进数据库表格视图底部滚动条的光标样式](https://github.com/siyuan-note/siyuan/issues/10888)
+* [改进面包屑中的数据库块文本](https://github.com/siyuan-note/siyuan/issues/10891)
+* [改进块属性面板拼写检查](https://github.com/siyuan-note/siyuan/issues/10897)
+* [点击文档焦点在只读模式下不会切换](https://github.com/siyuan-note/siyuan/issues/10898)
+* [改进 Esc 和 Del 后的光标位置](https://github.com/siyuan-note/siyuan/issues/10899)
+* [支持拖动挂件块](https://github.com/siyuan-note/siyuan/issues/10900)
+* [改进数据库视图菜单中的 `显示数据库标题` 项](https://github.com/siyuan-note/siyuan/issues/10908)
+* [支持在数据库中添加当前文档](https://github.com/siyuan-note/siyuan/issues/10912)
+* [支持填充数据库关系字段时打开浮动窗口以打开相关数据库](https://github.com/siyuan-note/siyuan/issues/10915)
+* [改进 /widget 搜索](https://github.com/siyuan-note/siyuan/issues/10917)
+* [数据库块包含在文档字数统计中](https://github.com/siyuan-note/siyuan/issues/10918)
+* [改进数据库表格视图中的列菜单的删除和复制](https://github.com/siyuan-note/siyuan/issues/10920)
+* [删除父块时删除绑定到子块的数据库行](https://github.com/siyuan-note/siyuan/issues/10923)
+* [在文档和 PDF 之间切换时,改进大纲、反向链接和图表的更新](https://github.com/siyuan-note/siyuan/issues/10930)
+* [当文档为只读时禁用大纲项拖动](https://github.com/siyuan-note/siyuan/issues/10931)
+* [`添加到数据库` 只在数据库标题上搜索](https://github.com/siyuan-note/siyuan/issues/10934)
+* [改进用户指南入口](https://github.com/siyuan-note/siyuan/pull/10939)
+* [改进导出段落开头的空格](https://github.com/siyuan-note/siyuan/issues/10940)
+
+### 修复缺陷
+
+* [数据库关联字段 `Ctrl+Hover` 不打开浮动窗口](https://github.com/siyuan-note/siyuan/issues/10836)
+* [创建新的块可能会导致页签关闭](https://github.com/siyuan-note/siyuan/issues/10851)
+* [数据库列宽调整失效](https://github.com/siyuan-note/siyuan/issues/10865)
+* [数据库日期间隔过滤器无法选择结束时间](https://github.com/siyuan-note/siyuan/issues/10870)
+* [`1\n\n2` 结尾处按 `Enter` 后的顺序错误](https://github.com/siyuan-note/siyuan/issues/10901)
+* [`Bold+Inline code` 导致内容消失](https://github.com/siyuan-note/siyuan/issues/10910)
+* [数据库汇总计算极差异常](https://github.com/siyuan-note/siyuan/issues/10913)
+* [启动应用程序时无法通过 `siyuan://` 打开文档](https://github.com/siyuan-note/siyuan/issues/10937)
+* [解绑 "隐藏窗口" 快捷键异常](https://github.com/siyuan-note/siyuan/issues/10938)
+* [`Ctrl+X` 后 `Ctrl+M` 无法唤出行级公式编辑](https://github.com/siyuan-note/siyuan/issues/10941)
+
+### 开发重构
+
+* [升级到 Electron v28.2.10](https://github.com/siyuan-note/siyuan/issues/10869)
+* [改进大纲加载机制](https://github.com/siyuan-note/siyuan/issues/10884)
+
+## 下载
+
+* [B3log](https://b3log.org/siyuan/download.html)
+* [GitHub](https://github.com/siyuan-note/siyuan/releases)
diff --git a/app/electron-builder-darwin-arm64.yml b/app/electron-builder-darwin-arm64.yml
index 99f7a1eb2b..7474d0ccb7 100644
--- a/app/electron-builder-darwin-arm64.yml
+++ b/app/electron-builder-darwin-arm64.yml
@@ -58,11 +58,8 @@ extraResources:
- from: "src/assets/fonts"
to: "appearance/fonts"
filter: "!**/{.DS_Store}"
- - from: "appearance/themes/sillou"
- to: "appearance/themes/sillou"
- filter: "!**/{.DS_Store,custom.css}"
- - from: "appearance/themes/sillon"
- to: "appearance/themes/sillon"
+ - from: "appearance/themes/_lnco"
+ to: "appearance/themes/lnco"
filter: "!**/{.DS_Store,custom.css}"
- from: "pandoc/pandoc-darwin-amd64.zip"
to: "pandoc.zip"
diff --git a/app/electron-builder-darwin.yml b/app/electron-builder-darwin.yml
index fd13a14047..e7c5003f26 100644
--- a/app/electron-builder-darwin.yml
+++ b/app/electron-builder-darwin.yml
@@ -58,11 +58,8 @@ extraResources:
- from: "src/assets/fonts"
to: "appearance/fonts"
filter: "!**/{.DS_Store}"
- - from: "appearance/themes/sillou"
- to: "appearance/themes/sillou"
- filter: "!**/{.DS_Store,custom.css}"
- - from: "appearance/themes/sillon"
- to: "appearance/themes/sillon"
+ - from: "appearance/themes/_lnco"
+ to: "appearance/themes/lnco"
filter: "!**/{.DS_Store,custom.css}"
- from: "pandoc/pandoc-darwin-amd64.zip"
to: "pandoc.zip"
diff --git a/app/electron-builder-linux.yml b/app/electron-builder-linux.yml
index 88ac792251..5f89e5eb13 100644
--- a/app/electron-builder-linux.yml
+++ b/app/electron-builder-linux.yml
@@ -53,13 +53,10 @@ extraResources:
- from: "src/assets/fonts"
to: "appearance/fonts"
filter: "!**/{.DS_Store}"
- - from: "appearance/themes/sillou"
- to: "appearance/themes/sillou"
- filter: "!**/{.DS_Store,custom.css}"
- - from: "appearance/themes/sillon"
- to: "appearance/themes/sillon"
+ - from: "appearance/themes/_lnco"
+ to: "appearance/themes/lnco"
filter: "!**/{.DS_Store,custom.css}"
- from: "pandoc/pandoc-linux-amd64.zip"
to: "pandoc.zip"
- from: "apps/deno/deno-x86_64-unknown-linux-gnu.zip"
- to: "deno.zip"
\ No newline at end of file
+ to: "deno.zip"
diff --git a/app/electron-builder.yml b/app/electron-builder.yml
index 82a4543414..0b516c6cae 100644
--- a/app/electron-builder.yml
+++ b/app/electron-builder.yml
@@ -70,13 +70,10 @@ extraResources:
- from: "src/assets/fonts"
to: "appearance/fonts"
filter: "!**/{.DS_Store}"
- - from: "appearance/themes/sillou"
- to: "appearance/themes/sillou"
- filter: "!**/{.DS_Store,custom.css}"
- - from: "appearance/themes/sillon"
- to: "appearance/themes/sillon"
+ - from: "appearance/themes/_lnco"
+ to: "appearance/themes/lnco"
filter: "!**/{.DS_Store,custom.css}"
- from: "pandoc/pandoc-windows-amd64.zip"
to: "pandoc.zip"
- from: "apps/deno/deno-x86_64-pc-windows-msvc.zip"
- to: "deno.zip"
\ No newline at end of file
+ to: "deno.zip"
diff --git a/app/electron/main.js b/app/electron/main.js
index 94e3b5a180..48adb194eb 100644
--- a/app/electron/main.js
+++ b/app/electron/main.js
@@ -778,7 +778,7 @@ app.whenReady().then(() => {
};
const ReactDeveloperToolsRoot = path.join(app.getPath("userData"), "extensions", "ReactDeveloperTools");
loadExtension(ReactDeveloperToolsRoot);
- const resetTrayMenu = (tray, lang, mainWindow) => {
+ const resetTrayMenu = (tray, lang, mainWindow) => { // 系统托盘右键菜单
const trayMenuTemplate = [{
label: mainWindow.isVisible() ? lang.hideWindow : lang.showWindow, click: () => {
showHideWindow(tray, lang, mainWindow);
@@ -799,6 +799,7 @@ app.whenReady().then(() => {
}, {
label: lang.quit, click: () => {
mainWindow.webContents.send("siyuan-save-close", true);
+ setTimeout(()=> { app.exit();}, 30000); // 强制退出
},
},];
@@ -983,7 +984,9 @@ app.whenReady().then(() => {
event.sender.openDevTools({mode: "bottom"});
break;
case "unregisterGlobalShortcut":
- globalShortcut.unregister(hotKey2Electron(data.accelerator));
+ if (data.accelerator) {
+ globalShortcut.unregister(hotKey2Electron(data.accelerator));
+ }
break;
case "show":
if (!currentWindow) {
@@ -1513,8 +1516,18 @@ app.whenReady().then(() => {
);
});
-app.on("open-url", (event, url) => { // for macOS
+app.on("open-url", async (event, url) => { // for macOS
if (url.startsWith("siyuan://")) {
+ if (workspaces.length === 0) {
+ let index = 0;
+ while (index < 10) {
+ index++;
+ await sleep(500);
+ if (workspaces.length > 0) {
+ break;
+ }
+ }
+ }
workspaces.forEach(item => {
if (item.browserWindow && !item.browserWindow.isDestroyed()) {
item.browserWindow.webContents.send("siyuan-open-url", url);
diff --git a/app/guide/20210808180117-6v0mkxr/20200923234011-ieuun1p/20210808180303-xaduj2o/20201204184532-3qm9l8n.sy b/app/guide/20210808180117-6v0mkxr/20200923234011-ieuun1p/20210808180303-xaduj2o/20201204184532-3qm9l8n.sy
index 646562c2a8..780987f901 100644
--- a/app/guide/20210808180117-6v0mkxr/20200923234011-ieuun1p/20210808180303-xaduj2o/20201204184532-3qm9l8n.sy
+++ b/app/guide/20210808180117-6v0mkxr/20200923234011-ieuun1p/20210808180303-xaduj2o/20201204184532-3qm9l8n.sy
@@ -6,7 +6,7 @@
"id": "20201204184532-3qm9l8n",
"title": "Template snippet",
"type": "doc",
- "updated": "20240308162730"
+ "updated": "20240403151002"
},
"Children": [
{
@@ -214,7 +214,7 @@
"ListData": {},
"Properties": {
"id": "20210104091444-mwbvc9m",
- "updated": "20240308162730"
+ "updated": "20240403151002"
},
"Children": [
{
@@ -378,7 +378,8 @@
"Marker": "Kg=="
},
"Properties": {
- "id": "20210121193829-wfzsf6m"
+ "id": "20210121193829-wfzsf6m",
+ "updated": "20240403150956"
},
"Children": [
{
@@ -386,7 +387,7 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20210131162138-7ufhbho",
- "updated": "20210504093006"
+ "updated": "20240403150956"
},
"Children": [
{
@@ -400,40 +401,7 @@
},
{
"Type": "NodeText",
- "Data": ": This function is used to query the "
- },
- {
- "Type": "NodeText",
- "Data": "database"
- },
- {
- "Type": "NodeText",
- "Data": ", and the return value is "
- },
- {
- "Type": "NodeText",
- "Data": "a"
- },
- {
- "Type": "NodeText",
- "Data": " list of blocks, and the parameter is "
- },
- {
- "Type": "NodeText",
- "Data": "a"
- },
- {
- "Type": "NodeText",
- "Data": " SQL statement: "
- },
- {
- "Type": "NodeTextMark",
- "TextMarkType": "code",
- "TextMarkTextContent": ".action{sql \u0026quot;SELECT * FROM blocks LIMIT 7\u0026quot;}"
- },
- {
- "Type": "NodeText",
- "Data": ""
+ "Data": ": This function is used to query the database, and the return value is a list of blocks, please refer to the example below"
}
]
}
@@ -447,7 +415,8 @@
"Marker": "Kg=="
},
"Properties": {
- "id": "20210504093232-vukp34t"
+ "id": "20210504093232-vukp34t",
+ "updated": "20240403151002"
},
"Children": [
{
@@ -455,7 +424,7 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20210504093232-6wxl589",
- "updated": "20210504093302"
+ "updated": "20240403151002"
},
"Children": [
{
@@ -469,40 +438,7 @@
},
{
"Type": "NodeText",
- "Data": ": This function is used to query the "
- },
- {
- "Type": "NodeText",
- "Data": "database"
- },
- {
- "Type": "NodeText",
- "Data": ", and the return value is "
- },
- {
- "Type": "NodeText",
- "Data": "a"
- },
- {
- "Type": "NodeText",
- "Data": " list of spans, and the parameter is "
- },
- {
- "Type": "NodeText",
- "Data": "a"
- },
- {
- "Type": "NodeText",
- "Data": " SQL statement: "
- },
- {
- "Type": "NodeTextMark",
- "TextMarkType": "code",
- "TextMarkTextContent": ".action{sql \u0026quot;SELECT * FROM spans LIMIT 7\u0026quot;}"
- },
- {
- "Type": "NodeText",
- "Data": ""
+ "Data": ": This function is used to query the database, and the return value is a list of spans, please refer to the example below"
}
]
}
diff --git a/app/guide/20210808180117-6v0mkxr/20240317202444-5txwumu.sy b/app/guide/20210808180117-6v0mkxr/20240317202444-5txwumu.sy
index 350208fa82..280bfc9f81 100644
--- a/app/guide/20210808180117-6v0mkxr/20240317202444-5txwumu.sy
+++ b/app/guide/20210808180117-6v0mkxr/20240317202444-5txwumu.sy
@@ -7,7 +7,7 @@
"id": "20240317202444-5txwumu",
"title": "Extend development",
"type": "doc",
- "updated": "20240317202840"
+ "updated": "20240407172201"
},
"Children": [
{
@@ -283,7 +283,7 @@
"ListData": {},
"Properties": {
"id": "20240317202702-wczm3on",
- "updated": "20240317202840"
+ "updated": "20240407172201"
},
"Children": [
{
@@ -377,7 +377,7 @@
},
"Properties": {
"id": "20240317202755-i4ttgax",
- "updated": "20240317202837"
+ "updated": "20240407172201"
},
"Children": [
{
@@ -399,7 +399,7 @@
"Type": "NodeBlockquote",
"Properties": {
"id": "20240317202837-ahu56j5",
- "updated": "20240317202837"
+ "updated": "20240407172201"
},
"Children": [
{
@@ -411,22 +411,12 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20240317202837-83ygog5",
- "updated": "20240317202837"
+ "updated": "20240407172201"
},
"Children": [
{
"Type": "NodeText",
- "Data": "For more details, please refer to "
- },
- {
- "Type": "NodeTextMark",
- "TextMarkType": "a",
- "TextMarkAHref": "https://github.com/siyuan-note/siyuan/issues/9807",
- "TextMarkTextContent": "Github Issue #9807"
- },
- {
- "Type": "NodeText",
- "Data": "."
+ "Data": "For more details, please refer to Github Issue #9807."
}
]
}
diff --git a/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20210808180321-hbvl5c2/20201204181006-7bkppue.sy b/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20210808180321-hbvl5c2/20201204181006-7bkppue.sy
index 79f6a2339a..7e81f607f5 100644
--- a/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20210808180321-hbvl5c2/20201204181006-7bkppue.sy
+++ b/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20210808180321-hbvl5c2/20201204181006-7bkppue.sy
@@ -6,7 +6,7 @@
"id": "20201204181006-7bkppue",
"title": "模板片段",
"type": "doc",
- "updated": "20240308162603"
+ "updated": "20240403150838"
},
"Children": [
{
@@ -236,7 +236,7 @@
"ListData": {},
"Properties": {
"id": "20210104091309-gjkg3u5",
- "updated": "20240308162603"
+ "updated": "20240403150838"
},
"Children": [
{
@@ -401,7 +401,8 @@
"Marker": "Kg=="
},
"Properties": {
- "id": "20210121193601-uwo8s5h"
+ "id": "20210121193601-uwo8s5h",
+ "updated": "20240403150712"
},
"Children": [
{
@@ -409,7 +410,7 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20210131155558-ghlchbx",
- "updated": "20210504092933"
+ "updated": "20240403150712"
},
"Children": [
{
@@ -423,24 +424,7 @@
},
{
"Type": "NodeText",
- "Data": ":该函数用于查询"
- },
- {
- "Type": "NodeText",
- "Data": "数据库"
- },
- {
- "Type": "NodeText",
- "Data": ",返回值为 blocks 列表,参数为 SQL 语句:"
- },
- {
- "Type": "NodeTextMark",
- "TextMarkType": "code",
- "TextMarkTextContent": ".action{sql \u0026quot;SELECT * FROM blocks LIMIT 7\u0026quot;}"
- },
- {
- "Type": "NodeText",
- "Data": ""
+ "Data": ":该函数用于查询数据库,返回值为 blocks 列表,请参考下面的例子"
}
]
}
@@ -454,7 +438,8 @@
"Marker": "Kg=="
},
"Properties": {
- "id": "20210504093313-4aoyxd0"
+ "id": "20210504093313-4aoyxd0",
+ "updated": "20240403150838"
},
"Children": [
{
@@ -462,7 +447,7 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20210504093313-ya53o58",
- "updated": "20210504093332"
+ "updated": "20240403150838"
},
"Children": [
{
@@ -476,24 +461,7 @@
},
{
"Type": "NodeText",
- "Data": ":该函数用于查询"
- },
- {
- "Type": "NodeText",
- "Data": "数据库"
- },
- {
- "Type": "NodeText",
- "Data": ",返回值为 spans 列表,参数为 SQL 语句:"
- },
- {
- "Type": "NodeTextMark",
- "TextMarkType": "code",
- "TextMarkTextContent": ".action{sql \u0026quot;SELECT * FROM spans LIMIT 7\u0026quot;}"
- },
- {
- "Type": "NodeText",
- "Data": ""
+ "Data": ":该函数用于查询数据库,返回值为 spans 列表,请参考下面的例子"
}
]
}
diff --git a/app/guide/20210808180117-czj9bvb/20240317200013-fim8wm8.sy b/app/guide/20210808180117-czj9bvb/20240317200013-fim8wm8.sy
index b40c8692ae..cf4ce0df1f 100644
--- a/app/guide/20210808180117-czj9bvb/20240317200013-fim8wm8.sy
+++ b/app/guide/20210808180117-czj9bvb/20240317200013-fim8wm8.sy
@@ -7,7 +7,7 @@
"id": "20240317200013-fim8wm8",
"title": "扩展开发",
"type": "doc",
- "updated": "20240317202200"
+ "updated": "20240407172150"
},
"Children": [
{
@@ -277,7 +277,7 @@
"ListData": {},
"Properties": {
"id": "20240317201708-e6uwpl2",
- "updated": "20240317202200"
+ "updated": "20240407172150"
},
"Children": [
{
@@ -362,7 +362,7 @@
},
"Properties": {
"id": "20240317201924-6yrpv38",
- "updated": "20240317202200"
+ "updated": "20240407172150"
},
"Children": [
{
@@ -384,7 +384,7 @@
"Type": "NodeBlockquote",
"Properties": {
"id": "20240317201924-ljq7w3h",
- "updated": "20240317201924"
+ "updated": "20240407172150"
},
"Children": [
{
@@ -396,22 +396,12 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20240317201924-fr7chfe",
- "updated": "20240317201924"
+ "updated": "20240407172150"
},
"Children": [
{
"Type": "NodeText",
- "Data": "详情请见 "
- },
- {
- "Type": "NodeTextMark",
- "TextMarkType": "a",
- "TextMarkAHref": "https://github.com/siyuan-note/siyuan/issues/9807",
- "TextMarkTextContent": "Github Issue #9807"
- },
- {
- "Type": "NodeText",
- "Data": "。"
+ "Data": "详情请见 Github Issue #9807。"
}
]
}
diff --git a/app/guide/20211226090932-5lcq56f/20240317202230-l8duv3r.sy b/app/guide/20211226090932-5lcq56f/20240317202230-l8duv3r.sy
index 863b072eb6..8116adba99 100644
--- a/app/guide/20211226090932-5lcq56f/20240317202230-l8duv3r.sy
+++ b/app/guide/20211226090932-5lcq56f/20240317202230-l8duv3r.sy
@@ -7,7 +7,7 @@
"id": "20240317202230-l8duv3r",
"title": "擴充開發",
"type": "doc",
- "updated": "20240317202429"
+ "updated": "20240407172156"
},
"Children": [
{
@@ -283,7 +283,7 @@
"ListData": {},
"Properties": {
"id": "20240317202310-3n68u3l",
- "updated": "20240317202310"
+ "updated": "20240407172156"
},
"Children": [
{
@@ -368,7 +368,7 @@
},
"Properties": {
"id": "20240317202310-poaxn3m",
- "updated": "20240317202310"
+ "updated": "20240407172156"
},
"Children": [
{
@@ -390,7 +390,7 @@
"Type": "NodeBlockquote",
"Properties": {
"id": "20240317202310-ozkltzq",
- "updated": "20240317202310"
+ "updated": "20240407172156"
},
"Children": [
{
@@ -402,22 +402,12 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20240317202310-tfo5fiq",
- "updated": "20240317202310"
+ "updated": "20240407172156"
},
"Children": [
{
"Type": "NodeText",
- "Data": "詳情請見 "
- },
- {
- "Type": "NodeTextMark",
- "TextMarkType": "a",
- "TextMarkAHref": "https://github.com/siyuan-note/siyuan/issues/9807",
- "TextMarkTextContent": "Github Issue #9807"
- },
- {
- "Type": "NodeText",
- "Data": "。"
+ "Data": "詳情請見 Github Issue #9807。"
}
]
}
diff --git a/app/package.json b/app/package.json
index 98b03b14e5..c08efc7502 100644
--- a/app/package.json
+++ b/app/package.json
@@ -1,8 +1,8 @@
{
"name": "sillot",
- "version": "0.28.14",
- "syv": "3.0.7",
- "sypv": "3.0.6",
+ "version": "0.28.23",
+ "syv": "3.0.8",
+ "sypv": "[3.0.7, 3.0.6]",
"description": "Build Your Eternal Digital Garden",
"author": "Soltus",
"homepage": "https://github.com/Hi-Windom/Sillot",
@@ -15,7 +15,7 @@
"packageManager": "pnpm@9.0.0-alpha.8",
"scripts": {
"cli": "node ./package.cli.mjs",
- "dlv": "echo '注意:dlv debug 是否在独立终端运行中(需要在dlv里执行continue)?没有请先启动(终端工作路径是 kernel/main.go 所在目录),不需要内核调试则应该运行 pnpm run dev 命令\n' && pause && NODE_ENV=development MODE=dlv electron-forge start",
+ "dlv": "echo '注意:dlv debug 是否在独立终端运行中(需要在dlv里执行continue)?没有请先启动(终端工作路径是 kernel/main.go 所在目录),不需要内核调试则应该运行 pnpm run start 命令\n' && pause && NODE_ENV=development MODE=dlv electron-forge start",
"v": "pnpm version && echo '\npnpm:' && pnpm -v && echo '\n'",
"git:tag": "git push origin --tags",
"git:proxy": "git config --global http.proxy http://127.0.0.1:7890 && git config --global https.proxy http://127.0.0.1:7890 && echo '7890是 clash 默认端口'",
@@ -76,20 +76,22 @@
}
],
"devDependencies": {
- "@babel/core": "^7.24.3",
+ "@babel/core": "^7.24.4",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
"@babel/plugin-proposal-optional-chaining": "^7.21.0",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1",
+ "@babel/plugin-transform-optional-chaining": "^7.24.1",
"@babel/plugin-transform-runtime": "^7.24.3",
- "@babel/preset-env": "^7.24.3",
+ "@babel/preset-env": "^7.24.4",
"@babel/preset-react": "^7.23.3",
"@babel/preset-typescript": "^7.23.3",
- "@babel/runtime": "^7.24.0",
+ "@babel/runtime": "^7.24.4",
"@electron-forge/cli": "^7.3.1",
"@emotion/react": "^11.11.4",
"@emotion/styled": "^11.11.5",
- "@mui/icons-material": "^5.15.13",
+ "@mui/icons-material": "^5.15.15",
"@mui/joy": "5.0.0-alpha.77",
- "@mui/material": "^5.15.13",
+ "@mui/material": "^5.15.15",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-json": "^6.1.0",
@@ -99,12 +101,12 @@
"@simonwep/pickr": "^1.9.0",
"@types/jest": "^29.5.12",
"@types/lodash": "^4.17.0",
- "@types/node": "^20.12.3",
+ "@types/node": "^20.12.5",
"@types/react": "^18.2.74",
- "@types/react-dom": "^18.2.23",
+ "@types/react-dom": "^18.2.24",
"@typescript-eslint/eslint-plugin": "^7.5.0",
"@typescript-eslint/parser": "^7.5.0",
- "@wixc3/react-board": "^2.4.1",
+ "@wixc3/react-board": "^2.5.0",
"babel-loader": "^9.1.3",
"brace": "^0.11.1",
"clean-webpack-plugin": "^4.0.0",
@@ -113,7 +115,7 @@
"csstype": "^3.1.3",
"date-fns": "^3.6.0",
"ejs": "^3.1.9",
- "electron": "30.0.0-beta.5",
+ "electron": "30.0.0-beta.7",
"electron-builder": "^24.13.3",
"electron-reloader": "^1.2.3",
"encoding": "^0.1.13",
@@ -150,11 +152,11 @@
"rome": "^12.1.3",
"rxjs": "^7.8.1",
"safer-buffer": "^2.1.2",
- "sass": "^1.72.0",
+ "sass": "^1.74.1",
"sass-loader": "^14.1.1",
"shelljs": "^0.8.5",
"socket.io": "^4.7.5",
- "sofill": "^1.1.4",
+ "sofill": "^1.1.8",
"sout": "^1.1.0",
"style-loader": "^3.3.4",
"sweetalert2": "^11.10.7",
@@ -162,7 +164,7 @@
"ts-jest": "^29.1.2",
"ts-loader": "^9.5.1",
"tslib": "^2.6.2",
- "typescript": "^5.4.3",
+ "typescript": "^5.4.4",
"vconsole": "^3.15.1",
"webpack": "^5.91.0",
"webpack-bundle-analyzer": "^4.10.1",
diff --git a/app/package/.github/workflows/npm.yml b/app/package/.github/workflows/npm.yml
deleted file mode 100644
index ccb1fb72b0..0000000000
--- a/app/package/.github/workflows/npm.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: Publish Package to npmjs
-
-on:
- workflow_dispatch:
- push:
- branches:
- - main--DISABLE
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- # Setup .npmrc file to publish to npm
- - uses: actions/setup-node@v4
- with:
- node-version: '18.x'
- registry-url: 'https://registry.npmjs.org'
- - run: npm install
- - run: npm ci
- - run: npm publish --access public
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/app/package/.gitignore b/app/package/.gitignore
deleted file mode 100644
index b4c1da3101..0000000000
--- a/app/package/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/.history
-**/node_modules
\ No newline at end of file
diff --git a/app/package/.npmignore b/app/package/.npmignore
deleted file mode 100644
index 821c19db48..0000000000
--- a/app/package/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-.github
\ No newline at end of file
diff --git a/app/package/README.md b/app/package/README.md
deleted file mode 100644
index 85ce9041c1..0000000000
--- a/app/package/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-
-# Sillot-Bridge
-
-汐洛开发桥(sdb)
-
-## 开发工具
-
-包管理使用 `pnpm`
-打包使用 `esbuild`
-检查使用 `rome`
-测试使用 `jest`
-
-ES2022 目标统一
diff --git a/app/package/package.json b/app/package/package.json
deleted file mode 100644
index 53f9b31b3c..0000000000
--- a/app/package/package.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "name": "@sillot/bridge",
- "version": "0.0.3",
- "description": "",
- "main": "index.cjs",
- "module": "index.mjs",
- "keywords": [],
- "author": "Soltus",
- "license": "ISC",
- "devDependencies": {
- }
-}
diff --git a/app/package/rome.json b/app/package/rome.json
deleted file mode 100644
index 92e9f1f183..0000000000
--- a/app/package/rome.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "$schema": "./app/node_modules/rome/configuration_schema.json",
- "formatter": {
- "enabled": true,
- "indentStyle": "space",
- "indentSize": 2,
- "lineWidth": 120,
- "formatWithErrors": true
- },
- "javascript": {
- "formatter": {
- "quoteStyle": "single"
- }
- },
- "linter": {
- "enabled": true,
- "rules": {
- "recommended": true,
- "suspicious": {
- "noExplicitAny": "off",
- "noAsyncPromiseExecutor": "off"
- },
- "performance": { "noDelete": "warn" },
- "style": { "useTemplate": "warn" },
- "complexity": { "useSimplifiedLogicExpression": "warn" },
- "correctness": { "noUnreachable": "warn" }
- }
- }
-}
diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml
index b51646e472..b0c4503333 100644
--- a/app/pnpm-lock.yaml
+++ b/app/pnpm-lock.yaml
@@ -13,7 +13,7 @@ importers:
dependencies:
'@electron/remote':
specifier: ^2.1.0
- version: 2.1.2(electron@30.0.0-beta.5)
+ version: 2.1.2(electron@30.0.0-beta.7)
'@monaco-editor/loader':
specifier: ^1.4.0
version: 1.4.0(monaco-editor@0.47.0)
@@ -31,29 +31,35 @@ importers:
version: 3.1.0
devDependencies:
'@babel/core':
- specifier: ^7.24.3
- version: 7.24.3
+ specifier: ^7.24.4
+ version: 7.24.4
'@babel/plugin-proposal-nullish-coalescing-operator':
specifier: ^7.18.6
- version: 7.18.6(@babel/core@7.24.3)
+ version: 7.18.6(@babel/core@7.24.4)
'@babel/plugin-proposal-optional-chaining':
specifier: ^7.21.0
- version: 7.21.0(@babel/core@7.24.3)
+ version: 7.21.0(@babel/core@7.24.4)
+ '@babel/plugin-transform-nullish-coalescing-operator':
+ specifier: ^7.24.1
+ version: 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-optional-chaining':
+ specifier: ^7.24.1
+ version: 7.24.1(@babel/core@7.24.4)
'@babel/plugin-transform-runtime':
specifier: ^7.24.3
- version: 7.24.3(@babel/core@7.24.3)
+ version: 7.24.3(@babel/core@7.24.4)
'@babel/preset-env':
- specifier: ^7.24.3
- version: 7.24.3(@babel/core@7.24.3)
+ specifier: ^7.24.4
+ version: 7.24.4(@babel/core@7.24.4)
'@babel/preset-react':
specifier: ^7.23.3
- version: 7.24.1(@babel/core@7.24.3)
+ version: 7.24.1(@babel/core@7.24.4)
'@babel/preset-typescript':
specifier: ^7.23.3
- version: 7.24.1(@babel/core@7.24.3)
+ version: 7.24.1(@babel/core@7.24.4)
'@babel/runtime':
- specifier: ^7.24.0
- version: 7.24.1
+ specifier: ^7.24.4
+ version: 7.24.4
'@electron-forge/cli':
specifier: ^7.3.1
version: 7.3.1(encoding@0.1.13)
@@ -64,17 +70,17 @@ importers:
specifier: ^11.11.5
version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
'@mui/icons-material':
- specifier: ^5.15.13
- version: 5.15.14(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
+ specifier: ^5.15.15
+ version: 5.15.15(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
'@mui/joy':
specifier: 5.0.0-alpha.77
version: 5.0.0-alpha.77(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@mui/material':
- specifier: ^5.15.13
- version: 5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ specifier: ^5.15.15
+ version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@rollup/plugin-babel':
specifier: ^6.0.4
- version: 6.0.4(@babel/core@7.24.3)(rollup@4.14.0)
+ version: 6.0.4(@babel/core@7.24.4)(rollup@4.14.0)
'@rollup/plugin-commonjs':
specifier: ^25.0.7
version: 25.0.7(rollup@4.14.0)
@@ -100,26 +106,26 @@ importers:
specifier: ^4.17.0
version: 4.17.0
'@types/node':
- specifier: ^20.12.3
- version: 20.12.3
+ specifier: ^20.12.5
+ version: 20.12.5
'@types/react':
specifier: ^18.2.74
version: 18.2.74
'@types/react-dom':
- specifier: ^18.2.23
- version: 18.2.23
+ specifier: ^18.2.24
+ version: 18.2.24
'@typescript-eslint/eslint-plugin':
specifier: ^7.5.0
- version: 7.5.0(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.4.3))(eslint@8.57.0)(typescript@5.4.3)
+ version: 7.5.0(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.4.4))(eslint@8.57.0)(typescript@5.4.4)
'@typescript-eslint/parser':
specifier: ^7.5.0
- version: 7.5.0(eslint@8.57.0)(typescript@5.4.3)
+ version: 7.5.0(eslint@8.57.0)(typescript@5.4.4)
'@wixc3/react-board':
- specifier: ^2.4.1
- version: 2.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ specifier: ^2.5.0
+ version: 2.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
babel-loader:
specifier: ^9.1.3
- version: 9.1.3(@babel/core@7.24.3)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4))
+ version: 9.1.3(@babel/core@7.24.4)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4))
brace:
specifier: ^0.11.1
version: 0.11.1
@@ -142,8 +148,8 @@ importers:
specifier: ^3.1.9
version: 3.1.9
electron:
- specifier: 30.0.0-beta.5
- version: 30.0.0-beta.5
+ specifier: 30.0.0-beta.7
+ version: 30.0.0-beta.7
electron-builder:
specifier: ^24.13.3
version: 24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3))
@@ -191,7 +197,7 @@ importers:
version: 9.2.17
jest:
specifier: ^29.7.0
- version: 29.7.0(@types/node@20.12.3)
+ version: 29.7.0(@types/node@20.12.5)
lodash:
specifier: 4.17.21
version: 4.17.21
@@ -253,11 +259,11 @@ importers:
specifier: ^2.1.2
version: 2.1.2
sass:
- specifier: ^1.72.0
- version: 1.72.0
+ specifier: ^1.74.1
+ version: 1.74.1
sass-loader:
specifier: ^14.1.1
- version: 14.1.1(sass@1.72.0)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4))
+ version: 14.1.1(sass@1.74.1)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4))
shelljs:
specifier: ^0.8.5
version: 0.8.5
@@ -265,8 +271,8 @@ importers:
specifier: ^4.7.5
version: 4.7.5
sofill:
- specifier: ^1.1.4
- version: 1.1.4(@sillot/bridge@0.0.3)(typescript@5.4.3)
+ specifier: ^1.1.8
+ version: 1.1.8(@sillot/bridge@0.0.3)(typescript@5.4.4)
sout:
specifier: ^1.1.0
version: 1.1.0
@@ -281,16 +287,16 @@ importers:
version: 5.3.10(esbuild@0.20.2)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4))
ts-jest:
specifier: ^29.1.2
- version: 29.1.2(@babel/core@7.24.3)(esbuild@0.20.2)(jest@29.7.0(@types/node@20.12.3))(typescript@5.4.3)
+ version: 29.1.2(@babel/core@7.24.4)(esbuild@0.20.2)(jest@29.7.0(@types/node@20.12.5))(typescript@5.4.4)
ts-loader:
specifier: ^9.5.1
- version: 9.5.1(typescript@5.4.3)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4))
+ version: 9.5.1(typescript@5.4.4)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4))
tslib:
specifier: ^2.6.2
version: 2.6.2
typescript:
- specifier: ^5.4.3
- version: 5.4.3
+ specifier: ^5.4.4
+ version: 5.4.4
vconsole:
specifier: ^3.15.1
version: 3.15.1
@@ -329,14 +335,22 @@ packages:
resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==}
engines: {node: '>=6.9.0'}
- '@babel/core@7.24.3':
- resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==}
+ '@babel/compat-data@7.24.4':
+ resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.24.4':
+ resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==}
engines: {node: '>=6.9.0'}
'@babel/generator@7.24.1':
resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==}
engines: {node: '>=6.9.0'}
+ '@babel/generator@7.24.4':
+ resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-annotate-as-pure@7.22.5':
resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
engines: {node: '>=6.9.0'}
@@ -355,6 +369,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
+ '@babel/helper-create-class-features-plugin@7.24.4':
+ resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
'@babel/helper-create-regexp-features-plugin@7.22.15':
resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==}
engines: {node: '>=6.9.0'}
@@ -444,8 +464,8 @@ packages:
resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.24.1':
- resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==}
+ '@babel/helpers@7.24.4':
+ resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==}
engines: {node: '>=6.9.0'}
'@babel/highlight@7.24.1':
@@ -461,6 +481,17 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
+ '@babel/parser@7.24.4':
+ resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4':
+ resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
'@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1':
resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==}
engines: {node: '>=6.9.0'}
@@ -636,8 +667,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-block-scoping@7.24.1':
- resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==}
+ '@babel/plugin-transform-block-scoping@7.24.4':
+ resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -648,8 +679,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-class-static-block@7.24.1':
- resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==}
+ '@babel/plugin-transform-class-static-block@7.24.4':
+ resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.12.0
@@ -936,8 +967,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/preset-env@7.24.3':
- resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==}
+ '@babel/preset-env@7.24.4':
+ resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -962,8 +993,8 @@ packages:
'@babel/regjsgen@0.8.0':
resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
- '@babel/runtime@7.24.1':
- resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==}
+ '@babel/runtime@7.24.4':
+ resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==}
engines: {node: '>=6.9.0'}
'@babel/template@7.24.0':
@@ -1482,8 +1513,11 @@ packages:
'@mui/core-downloads-tracker@5.15.14':
resolution: {integrity: sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==}
- '@mui/icons-material@5.15.14':
- resolution: {integrity: sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==}
+ '@mui/core-downloads-tracker@5.15.15':
+ resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==}
+
+ '@mui/icons-material@5.15.15':
+ resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@mui/material': ^5.0.0
@@ -1510,8 +1544,8 @@ packages:
'@types/react':
optional: true
- '@mui/material@5.15.14':
- resolution: {integrity: sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==}
+ '@mui/material@5.15.15':
+ resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -1566,6 +1600,22 @@ packages:
'@types/react':
optional: true
+ '@mui/system@5.15.15':
+ resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ '@emotion/react': ^11.5.0
+ '@emotion/styled': ^11.3.0
+ '@types/react': ^17.0.0 || ^18.0.0
+ react: ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@emotion/react':
+ optional: true
+ '@emotion/styled':
+ optional: true
+ '@types/react':
+ optional: true
+
'@mui/types@7.2.14':
resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==}
peerDependencies:
@@ -1922,8 +1972,8 @@ packages:
'@types/ms@0.7.34':
resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
- '@types/node@20.12.3':
- resolution: {integrity: sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==}
+ '@types/node@20.12.5':
+ resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==}
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -1937,8 +1987,8 @@ packages:
'@types/prop-types@15.7.11':
resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
- '@types/react-dom@18.2.23':
- resolution: {integrity: sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==}
+ '@types/react-dom@18.2.24':
+ resolution: {integrity: sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==}
'@types/react-transition-group@4.4.10':
resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==}
@@ -2116,11 +2166,11 @@ packages:
webpack-dev-server:
optional: true
- '@wixc3/board-core@2.4.1':
- resolution: {integrity: sha512-ARqNpMTLToWk3ToZANFEjsuq1tPXyPchAuwWjw10mubQHXpXXWjNoqXBF++1H0dW8Fef2+0Km2R/UQiU8FWVQw==}
+ '@wixc3/board-core@2.5.0':
+ resolution: {integrity: sha512-kCAHGdZJuXg7+k2bY7LSylx3FM8BpLNV6CWsI6Oz05i+hazQ5F7L38M8M658jxXVtC/g+82THQ9l3N04WwsG7Q==}
- '@wixc3/react-board@2.4.1':
- resolution: {integrity: sha512-oF+z9L5Mpt7Miq6xIIwrSgYsA853d72FhpPStCwbKyvXn4y3oiLDgUrGYFGWqWzXE0/VBUjyV50TbFS2f7DHrg==}
+ '@wixc3/react-board@2.5.0':
+ resolution: {integrity: sha512-JoNmGu1Pw75FdNMbwl2OXT4qQNhvMJtVUhiprEXCiFRSg0HmnWaTr9Q4hsXLpPzFA153uPWMWoeNizZOHEo5Bw==}
peerDependencies:
react: ^16.0.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
@@ -3146,8 +3196,8 @@ packages:
electron-to-chromium@1.4.710:
resolution: {integrity: sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA==}
- electron@30.0.0-beta.5:
- resolution: {integrity: sha512-UULJwVGP4yKq4X6C1F0QITPiaEN4YJOIl8GUNLu2lGttuHGkItYV+3DopDYqhD8Qg9KFOXkSESfmQNVK5JBV5Q==}
+ electron@30.0.0-beta.7:
+ resolution: {integrity: sha512-m0BdLfjZ5A047itqs/9pzO/3xg4iN10njsQs6f9J8PHpPqehH5zd7WazmvLF+LrtWspy56fvV5pAvOtFfGybEA==}
engines: {node: '>= 12.20.55'}
hasBin: true
@@ -5834,8 +5884,8 @@ packages:
webpack:
optional: true
- sass@1.72.0:
- resolution: {integrity: sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==}
+ sass@1.74.1:
+ resolution: {integrity: sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==}
engines: {node: '>=14.0.0'}
hasBin: true
@@ -5982,14 +6032,16 @@ packages:
resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==}
engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
- sofill@1.1.4:
- resolution: {integrity: sha512-eowy89UHjTz0h1ieFoUsI3YTheXLNmuNQKjp6UeX+aUxPNe5iucF9zM87JS1IHeAoQFOlB0Q+GH2zO5qdZ5/gw==}
+ sofill@1.1.8:
+ resolution: {integrity: sha512-vqBrvHMSt59IhfgcVvXJr9HthyX2n42i5907DXeXH4OZqTelTHvcflBnApMXlGtwBmHn6AWXgQ95+hBIP+O0Rg==}
peerDependencies:
'@sillot/bridge': ^0.0.3
- localforage: ^1.10.0
+ idb: ^8.0.0
typescript: '>=3.7.0'
peerDependenciesMeta:
- localforage:
+ idb:
+ optional: true
+ typescript:
optional: true
sortablejs@1.15.2:
@@ -6408,8 +6460,8 @@ packages:
typedarray-to-buffer@3.1.5:
resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
- typescript@5.4.3:
- resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==}
+ typescript@5.4.4:
+ resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==}
engines: {node: '>=14.17'}
hasBin: true
@@ -6737,15 +6789,18 @@ snapshots:
'@babel/compat-data@7.24.1':
dev: true
- '@babel/core@7.24.3':
+ '@babel/compat-data@7.24.4':
+ dev: true
+
+ '@babel/core@7.24.4':
dependencies:
'@ampproject/remapping': 2.3.0
'@babel/code-frame': 7.24.2
- '@babel/generator': 7.24.1
+ '@babel/generator': 7.24.4
'@babel/helper-compilation-targets': 7.23.6
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
- '@babel/helpers': 7.24.1
- '@babel/parser': 7.24.1
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4)
+ '@babel/helpers': 7.24.4
+ '@babel/parser': 7.24.4
'@babel/template': 7.24.0
'@babel/traverse': 7.24.1
'@babel/types': 7.24.0
@@ -6766,6 +6821,14 @@ snapshots:
jsesc: 2.5.2
dev: true
+ '@babel/generator@7.24.4':
+ dependencies:
+ '@babel/types': 7.24.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 2.5.2
+ dev: true
+
'@babel/helper-annotate-as-pure@7.22.5':
dependencies:
'@babel/types': 7.24.0
@@ -6785,31 +6848,45 @@ snapshots:
semver: 6.3.1
dev: true
- '@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3)':
+ '@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.4)':
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-member-expression-to-functions': 7.23.0
+ '@babel/helper-optimise-call-expression': 7.22.5
+ '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ semver: 6.3.1
+ dev: true
+
+ '@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-function-name': 7.23.0
'@babel/helper-member-expression-to-functions': 7.23.0
'@babel/helper-optimise-call-expression': 7.22.5
- '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3)
+ '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4)
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
'@babel/helper-split-export-declaration': 7.22.6
semver: 6.3.1
dev: true
- '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.3)':
+ '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-annotate-as-pure': 7.22.5
regexpu-core: 5.3.2
semver: 6.3.1
dev: true
- '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.3)':
+ '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-compilation-targets': 7.23.6
'@babel/helper-plugin-utils': 7.24.0
debug: 4.3.4
@@ -6848,9 +6925,9 @@ snapshots:
'@babel/types': 7.24.0
dev: true
- '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)':
+ '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-module-imports': 7.24.1
'@babel/helper-simple-access': 7.22.5
@@ -6866,17 +6943,17 @@ snapshots:
'@babel/helper-plugin-utils@7.24.0':
dev: true
- '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.3)':
+ '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-wrap-function': 7.22.20
dev: true
- '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3)':
+ '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-member-expression-to-functions': 7.23.0
'@babel/helper-optimise-call-expression': 7.22.5
@@ -6913,7 +6990,7 @@ snapshots:
'@babel/types': 7.24.0
dev: true
- '@babel/helpers@7.24.1':
+ '@babel/helpers@7.24.4':
dependencies:
'@babel/template': 7.24.0
'@babel/traverse': 7.24.1
@@ -6943,684 +7020,697 @@ snapshots:
'@babel/types': 7.24.0
dev: true
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.3)':
+ '@babel/parser@7.24.4':
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4)':
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3)
+ '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4)
dev: true
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.3)':
+ '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4)
dev: true
- '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.3)':
+ '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4)
dev: true
- '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3)':
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
dev: true
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.3)':
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.3)':
+ '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-plugin-utils': 7.24.0
- '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3)
+ '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4)
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-module-imports': 7.24.1
+ '@babel/core': 7.24.4
+ '@babel/helper-module-imports': 7.24.3
'@babel/helper-plugin-utils': 7.24.0
- '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3)
+ '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-compilation-targets': 7.23.6
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-function-name': 7.23.0
'@babel/helper-plugin-utils': 7.24.0
- '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3)
+ '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4)
'@babel/helper-split-export-declaration': 7.22.6
globals: 11.12.0
dev: true
- '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/template': 7.24.0
dev: true
- '@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
dev: true
- '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-compilation-targets': 7.23.6
'@babel/helper-function-name': 7.23.0
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-simple-access': 7.22.5
dev: true
- '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-validator-identifier': 7.22.20
dev: true
- '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.3)':
+ '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-compilation-targets': 7.23.6
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3)
+ '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3)
+ '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.3)':
+ '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3)':
+ '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-module-imports': 7.24.1
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3)
+ '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4)
'@babel/types': 7.24.0
dev: true
- '@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
regenerator-transform: 0.15.2
dev: true
- '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.3)':
+ '@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-module-imports': 7.24.3
'@babel/helper-plugin-utils': 7.24.0
- babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3)
- babel-plugin-polyfill-corejs3: 0.10.1(@babel/core@7.24.3)
- babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3)
+ babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4)
+ babel-plugin-polyfill-corejs3: 0.10.1(@babel/core@7.24.4)
+ babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4)
semver: 6.3.1
transitivePeerDependencies:
- supports-color
dev: true
- '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
dev: true
- '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3)
+ '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3)
+ '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4)
dev: true
- '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.3)':
+ '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4)
'@babel/helper-plugin-utils': 7.24.0
dev: true
- '@babel/preset-env@7.24.3(@babel/core@7.24.3)':
+ '@babel/preset-env@7.24.4(@babel/core@7.24.4)':
dependencies:
- '@babel/compat-data': 7.24.1
- '@babel/core': 7.24.3
+ '@babel/compat-data': 7.24.4
+ '@babel/core': 7.24.4
'@babel/helper-compilation-targets': 7.23.6
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-validator-option': 7.23.5
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3)
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3)
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3)
- '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.3)
- '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.3)
- '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3)
- '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.3)
- '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.3)
- babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3)
- babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3)
- babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3)
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4)
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4)
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4)
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.4)
+ '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4)
+ '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4)
+ '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4)
+ '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4)
+ '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.4)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.4)
+ babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4)
+ babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4)
+ babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4)
core-js-compat: 3.36.1
semver: 6.3.1
transitivePeerDependencies:
- supports-color
dev: true
- '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.3)':
+ '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/types': 7.24.0
esutils: 2.0.3
dev: true
- '@babel/preset-react@7.24.1(@babel/core@7.24.3)':
+ '@babel/preset-react@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-validator-option': 7.23.5
- '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3)
- '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3)
- '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.24.3)
+ '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4)
+ '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.4)
+ '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.24.4)
dev: true
- '@babel/preset-typescript@7.24.1(@babel/core@7.24.3)':
+ '@babel/preset-typescript@7.24.1(@babel/core@7.24.4)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-plugin-utils': 7.24.0
'@babel/helper-validator-option': 7.23.5
- '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3)
+ '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.4)
dev: true
'@babel/regjsgen@0.8.0':
dev: true
- '@babel/runtime@7.24.1':
+ '@babel/runtime@7.24.4':
dependencies:
regenerator-runtime: 0.14.1
dev: true
@@ -7959,9 +8049,9 @@ snapshots:
- supports-color
dev: true
- '@electron/remote@2.1.2(electron@30.0.0-beta.5)':
+ '@electron/remote@2.1.2(electron@30.0.0-beta.7)':
dependencies:
- electron: 30.0.0-beta.5
+ electron: 30.0.0-beta.7
dev: false
'@electron/universal@1.5.1':
@@ -8004,7 +8094,7 @@ snapshots:
'@emotion/babel-plugin@11.11.0':
dependencies:
'@babel/helper-module-imports': 7.24.1
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@emotion/hash': 0.9.1
'@emotion/memoize': 0.8.1
'@emotion/serialize': 1.1.3
@@ -8038,7 +8128,7 @@ snapshots:
'@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@emotion/babel-plugin': 11.11.0
'@emotion/cache': 11.11.0
'@emotion/serialize': 1.1.3
@@ -8073,7 +8163,7 @@ snapshots:
'@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@emotion/babel-plugin': 11.11.0
'@emotion/is-prop-valid': 1.2.2
'@emotion/react': 11.11.4(@types/react@18.2.74)(react@18.2.0)
@@ -8281,7 +8371,7 @@ snapshots:
'@jest/console@29.7.0':
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
chalk: 4.1.2
jest-message-util: 29.7.0
jest-util: 29.7.0
@@ -8295,14 +8385,14 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
ansi-escapes: 4.3.2
chalk: 4.1.2
ci-info: 3.9.0
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@20.12.3)
+ jest-config: 29.7.0(@types/node@20.12.5)
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -8328,7 +8418,7 @@ snapshots:
dependencies:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
jest-mock: 29.7.0
dev: true
@@ -8349,7 +8439,7 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -8373,7 +8463,7 @@ snapshots:
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
'@jridgewell/trace-mapping': 0.3.25
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
chalk: 4.1.2
collect-v8-coverage: 1.0.2
exit: 0.1.2
@@ -8425,7 +8515,7 @@ snapshots:
'@jest/transform@29.7.0':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@jest/types': 29.6.3
'@jridgewell/trace-mapping': 0.3.25
babel-plugin-istanbul: 6.1.1
@@ -8449,7 +8539,7 @@ snapshots:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
'@types/yargs': 17.0.32
chalk: 4.1.2
dev: true
@@ -8515,7 +8605,7 @@ snapshots:
'@mui/base@5.0.0-alpha.127(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@emotion/is-prop-valid': 1.2.2
'@mui/types': 7.2.14(@types/react@18.2.74)
'@mui/utils': 5.15.14(@types/react@18.2.74)(react@18.2.0)
@@ -8530,7 +8620,7 @@ snapshots:
'@mui/base@5.0.0-beta.40(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@mui/types': 7.2.14(@types/react@18.2.74)
'@mui/utils': 5.15.14(@types/react@18.2.74)(react@18.2.0)
@@ -8545,17 +8635,20 @@ snapshots:
'@mui/core-downloads-tracker@5.15.14':
dev: true
- '@mui/icons-material@5.15.14(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)':
+ '@mui/core-downloads-tracker@5.15.15':
+ dev: true
+
+ '@mui/icons-material@5.15.15(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
- '@mui/material': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@babel/runtime': 7.24.4
+ '@mui/material': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@types/react': 18.2.74
react: 18.2.0
dev: true
'@mui/joy@5.0.0-alpha.77(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@emotion/react': 11.11.4(@types/react@18.2.74)(react@18.2.0)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
'@mui/base': 5.0.0-alpha.127(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -8572,14 +8665,14 @@ snapshots:
react-is: 18.2.0
dev: true
- '@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@emotion/react': 11.11.4(@types/react@18.2.74)(react@18.2.0)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
'@mui/base': 5.0.0-beta.40(@types/react@18.2.74)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- '@mui/core-downloads-tracker': 5.15.14
- '@mui/system': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
+ '@mui/core-downloads-tracker': 5.15.15
+ '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
'@mui/types': 7.2.14(@types/react@18.2.74)
'@mui/utils': 5.15.14(@types/react@18.2.74)(react@18.2.0)
'@types/react': 18.2.74
@@ -8595,7 +8688,7 @@ snapshots:
'@mui/private-theming@5.15.14(@types/react@18.2.74)(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@mui/utils': 5.15.14(@types/react@18.2.74)(react@18.2.0)
'@types/react': 18.2.74
prop-types: 15.8.1
@@ -8604,7 +8697,7 @@ snapshots:
'@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@emotion/cache': 11.11.0
'@emotion/react': 11.11.4(@types/react@18.2.74)(react@18.2.0)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
@@ -8615,7 +8708,23 @@ snapshots:
'@mui/system@5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
+ '@emotion/react': 11.11.4(@types/react@18.2.74)(react@18.2.0)
+ '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
+ '@mui/private-theming': 5.15.14(@types/react@18.2.74)(react@18.2.0)
+ '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(react@18.2.0)
+ '@mui/types': 7.2.14(@types/react@18.2.74)
+ '@mui/utils': 5.15.14(@types/react@18.2.74)(react@18.2.0)
+ '@types/react': 18.2.74
+ clsx: 2.1.0
+ csstype: 3.1.3
+ prop-types: 15.8.1
+ react: 18.2.0
+ dev: true
+
+ '@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)':
+ dependencies:
+ '@babel/runtime': 7.24.4
'@emotion/react': 11.11.4(@types/react@18.2.74)(react@18.2.0)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.74)(react@18.2.0))(@types/react@18.2.74)(react@18.2.0)
'@mui/private-theming': 5.15.14(@types/react@18.2.74)(react@18.2.0)
@@ -8636,7 +8745,7 @@ snapshots:
'@mui/utils@5.15.14(@types/react@18.2.74)(react@18.2.0)':
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
'@types/prop-types': 15.7.11
'@types/react': 18.2.74
prop-types: 15.8.1
@@ -8686,9 +8795,9 @@ snapshots:
react: 18.2.0
dev: true
- '@rollup/plugin-babel@6.0.4(@babel/core@7.24.3)(rollup@4.14.0)':
+ '@rollup/plugin-babel@6.0.4(@babel/core@7.24.4)(rollup@4.14.0)':
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/helper-module-imports': 7.24.1
'@rollup/pluginutils': 5.1.0(rollup@4.14.0)
rollup: 4.14.0
@@ -8903,7 +9012,7 @@ snapshots:
dependencies:
'@types/http-cache-semantics': 4.0.4
'@types/keyv': 3.1.4
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
'@types/responselike': 1.0.3
'@types/cookie@0.4.1':
@@ -8911,7 +9020,7 @@ snapshots:
'@types/cors@2.8.17':
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
dev: true
'@types/debug@4.1.12':
@@ -8936,18 +9045,18 @@ snapshots:
'@types/fs-extra@9.0.13':
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
dev: true
'@types/glob@7.2.0':
dependencies:
'@types/minimatch': 5.1.2
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
dev: true
'@types/graceful-fs@4.1.9':
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
dev: true
'@types/html-minifier-terser@6.1.0':
@@ -8979,7 +9088,7 @@ snapshots:
'@types/keyv@3.1.4':
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
'@types/lodash@4.17.0':
dev: true
@@ -8996,7 +9105,7 @@ snapshots:
'@types/ms@0.7.34':
dev: true
- '@types/node@20.12.3':
+ '@types/node@20.12.5':
dependencies:
undici-types: 5.26.5
@@ -9008,7 +9117,7 @@ snapshots:
'@types/plist@3.0.5':
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
xmlbuilder: 15.1.1
dev: true
optional: true
@@ -9016,7 +9125,7 @@ snapshots:
'@types/prop-types@15.7.11':
dev: true
- '@types/react-dom@18.2.23':
+ '@types/react-dom@18.2.24':
dependencies:
'@types/react': 18.2.74
dev: true
@@ -9037,7 +9146,7 @@ snapshots:
'@types/responselike@1.0.3':
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
'@types/semver@7.5.8':
dev: true
@@ -9059,16 +9168,16 @@ snapshots:
'@types/yauzl@2.10.3':
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
optional: true
- '@typescript-eslint/eslint-plugin@7.5.0(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.4.3))(eslint@8.57.0)(typescript@5.4.3)':
+ '@typescript-eslint/eslint-plugin@7.5.0(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.4.4))(eslint@8.57.0)(typescript@5.4.4)':
dependencies:
'@eslint-community/regexpp': 4.10.0
- '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.4.3)
+ '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.4.4)
'@typescript-eslint/scope-manager': 7.5.0
- '@typescript-eslint/type-utils': 7.5.0(eslint@8.57.0)(typescript@5.4.3)
- '@typescript-eslint/utils': 7.5.0(eslint@8.57.0)(typescript@5.4.3)
+ '@typescript-eslint/type-utils': 7.5.0(eslint@8.57.0)(typescript@5.4.4)
+ '@typescript-eslint/utils': 7.5.0(eslint@8.57.0)(typescript@5.4.4)
'@typescript-eslint/visitor-keys': 7.5.0
debug: 4.3.4
eslint: 8.57.0
@@ -9076,21 +9185,21 @@ snapshots:
ignore: 5.3.1
natural-compare: 1.4.0
semver: 7.6.0
- ts-api-utils: 1.3.0(typescript@5.4.3)
- typescript: 5.4.3
+ ts-api-utils: 1.3.0(typescript@5.4.4)
+ typescript: 5.4.4
transitivePeerDependencies:
- supports-color
dev: true
- '@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.4.3)':
+ '@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.4.4)':
dependencies:
'@typescript-eslint/scope-manager': 7.5.0
'@typescript-eslint/types': 7.5.0
- '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.3)
+ '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.4)
'@typescript-eslint/visitor-keys': 7.5.0
debug: 4.3.4
eslint: 8.57.0
- typescript: 5.4.3
+ typescript: 5.4.4
transitivePeerDependencies:
- supports-color
dev: true
@@ -9101,14 +9210,14 @@ snapshots:
'@typescript-eslint/visitor-keys': 7.5.0
dev: true
- '@typescript-eslint/type-utils@7.5.0(eslint@8.57.0)(typescript@5.4.3)':
+ '@typescript-eslint/type-utils@7.5.0(eslint@8.57.0)(typescript@5.4.4)':
dependencies:
- '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.3)
- '@typescript-eslint/utils': 7.5.0(eslint@8.57.0)(typescript@5.4.3)
+ '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.4)
+ '@typescript-eslint/utils': 7.5.0(eslint@8.57.0)(typescript@5.4.4)
debug: 4.3.4
eslint: 8.57.0
- ts-api-utils: 1.3.0(typescript@5.4.3)
- typescript: 5.4.3
+ ts-api-utils: 1.3.0(typescript@5.4.4)
+ typescript: 5.4.4
transitivePeerDependencies:
- supports-color
dev: true
@@ -9116,7 +9225,7 @@ snapshots:
'@typescript-eslint/types@7.5.0':
dev: true
- '@typescript-eslint/typescript-estree@7.5.0(typescript@5.4.3)':
+ '@typescript-eslint/typescript-estree@7.5.0(typescript@5.4.4)':
dependencies:
'@typescript-eslint/types': 7.5.0
'@typescript-eslint/visitor-keys': 7.5.0
@@ -9125,20 +9234,20 @@ snapshots:
is-glob: 4.0.3
minimatch: 9.0.3
semver: 7.6.0
- ts-api-utils: 1.3.0(typescript@5.4.3)
- typescript: 5.4.3
+ ts-api-utils: 1.3.0(typescript@5.4.4)
+ typescript: 5.4.4
transitivePeerDependencies:
- supports-color
dev: true
- '@typescript-eslint/utils@7.5.0(eslint@8.57.0)(typescript@5.4.3)':
+ '@typescript-eslint/utils@7.5.0(eslint@8.57.0)(typescript@5.4.4)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@types/json-schema': 7.0.15
'@types/semver': 7.5.8
'@typescript-eslint/scope-manager': 7.5.0
'@typescript-eslint/types': 7.5.0
- '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.3)
+ '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.4)
eslint: 8.57.0
semver: 7.6.0
transitivePeerDependencies:
@@ -9301,12 +9410,12 @@ snapshots:
webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.1)(webpack@5.91.0)
dev: true
- '@wixc3/board-core@2.4.1':
+ '@wixc3/board-core@2.5.0':
dev: true
- '@wixc3/react-board@2.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@wixc3/react-board@2.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@wixc3/board-core': 2.4.1
+ '@wixc3/board-core': 2.5.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: true
@@ -9647,13 +9756,13 @@ snapshots:
possible-typed-array-names: 1.0.0
dev: true
- babel-jest@29.7.0(@babel/core@7.24.3):
+ babel-jest@29.7.0(@babel/core@7.24.4):
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@jest/transform': 29.7.0
'@types/babel__core': 7.20.5
babel-plugin-istanbul: 6.1.1
- babel-preset-jest: 29.6.3(@babel/core@7.24.3)
+ babel-preset-jest: 29.6.3(@babel/core@7.24.4)
chalk: 4.1.2
graceful-fs: 4.2.11
slash: 3.0.0
@@ -9661,9 +9770,9 @@ snapshots:
- supports-color
dev: true
- babel-loader@9.1.3(@babel/core@7.24.3)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)):
+ babel-loader@9.1.3(@babel/core@7.24.4)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)):
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
find-cache-dir: 4.0.0
schema-utils: 4.2.0
webpack: 5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)
@@ -9690,69 +9799,69 @@ snapshots:
babel-plugin-macros@3.1.0:
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
cosmiconfig: 7.1.0
resolve: 1.22.8
dev: true
- babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.3):
+ babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.4):
dependencies:
'@babel/compat-data': 7.24.1
- '@babel/core': 7.24.3
- '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4)
semver: 6.3.1
transitivePeerDependencies:
- supports-color
dev: true
- babel-plugin-polyfill-corejs3@0.10.1(@babel/core@7.24.3):
+ babel-plugin-polyfill-corejs3@0.10.1(@babel/core@7.24.4):
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4)
core-js-compat: 3.36.1
transitivePeerDependencies:
- supports-color
dev: true
- babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.3):
+ babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.4):
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4)
core-js-compat: 3.36.1
transitivePeerDependencies:
- supports-color
dev: true
- babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.3):
+ babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.4):
dependencies:
- '@babel/core': 7.24.3
- '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4)
transitivePeerDependencies:
- supports-color
dev: true
- babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3):
+ babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.4):
dependencies:
- '@babel/core': 7.24.3
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3)
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3)
+ '@babel/core': 7.24.4
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4)
dev: true
- babel-preset-jest@29.6.3(@babel/core@7.24.3):
+ babel-preset-jest@29.6.3(@babel/core@7.24.4):
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
babel-plugin-jest-hoist: 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3)
+ babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4)
dev: true
balanced-match@1.0.2:
@@ -10234,7 +10343,7 @@ snapshots:
config-file-ts@0.2.6:
dependencies:
glob: 10.3.10
- typescript: 5.4.3
+ typescript: 5.4.4
dev: true
configstore@5.0.1:
@@ -10310,13 +10419,13 @@ snapshots:
dev: true
optional: true
- create-jest@29.7.0(@types/node@20.12.3):
+ create-jest@29.7.0(@types/node@20.12.5):
dependencies:
'@jest/types': 29.6.3
chalk: 4.1.2
exit: 0.1.2
graceful-fs: 4.2.11
- jest-config: 29.7.0(@types/node@20.12.3)
+ jest-config: 29.7.0(@types/node@20.12.5)
jest-util: 29.7.0
prompts: 2.4.2
transitivePeerDependencies:
@@ -10472,7 +10581,7 @@ snapshots:
date-fns@2.30.0:
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
dev: true
date-fns@3.6.0:
@@ -10681,7 +10790,7 @@ snapshots:
dom-helpers@5.2.1:
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
csstype: 3.1.3
dev: true
@@ -10814,10 +10923,10 @@ snapshots:
electron-to-chromium@1.4.710:
dev: true
- electron@30.0.0-beta.5:
+ electron@30.0.0-beta.7:
dependencies:
'@electron/get': 2.0.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
extract-zip: 2.0.1
transitivePeerDependencies:
- supports-color
@@ -10852,7 +10961,7 @@ snapshots:
dependencies:
'@types/cookie': 0.4.1
'@types/cors': 2.8.17
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
accepts: 1.3.8
base64id: 2.0.0
cookie: 0.4.2
@@ -12300,7 +12409,7 @@ snapshots:
istanbul-lib-instrument@5.2.1:
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/parser': 7.24.1
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
@@ -12311,7 +12420,7 @@ snapshots:
istanbul-lib-instrument@6.0.2:
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/parser': 7.24.1
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
@@ -12379,7 +12488,7 @@ snapshots:
'@jest/expect': 29.7.0
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
chalk: 4.1.2
co: 4.6.0
dedent: 1.5.1
@@ -12400,16 +12509,16 @@ snapshots:
- supports-color
dev: true
- jest-cli@29.7.0(@types/node@20.12.3):
+ jest-cli@29.7.0(@types/node@20.12.5):
dependencies:
'@jest/core': 29.7.0
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
chalk: 4.1.2
- create-jest: 29.7.0(@types/node@20.12.3)
+ create-jest: 29.7.0(@types/node@20.12.5)
exit: 0.1.2
import-local: 3.1.0
- jest-config: 29.7.0(@types/node@20.12.3)
+ jest-config: 29.7.0(@types/node@20.12.5)
jest-util: 29.7.0
jest-validate: 29.7.0
yargs: 17.7.2
@@ -12420,13 +12529,13 @@ snapshots:
- ts-node
dev: true
- jest-config@29.7.0(@types/node@20.12.3):
+ jest-config@29.7.0(@types/node@20.12.5):
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@jest/test-sequencer': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.12.3
- babel-jest: 29.7.0(@babel/core@7.24.3)
+ '@types/node': 20.12.5
+ babel-jest: 29.7.0(@babel/core@7.24.4)
chalk: 4.1.2
ci-info: 3.9.0
deepmerge: 4.3.1
@@ -12477,7 +12586,7 @@ snapshots:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
jest-mock: 29.7.0
jest-util: 29.7.0
dev: true
@@ -12489,7 +12598,7 @@ snapshots:
dependencies:
'@jest/types': 29.6.3
'@types/graceful-fs': 4.1.9
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
@@ -12532,7 +12641,7 @@ snapshots:
jest-mock@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
jest-util: 29.7.0
dev: true
@@ -12572,7 +12681,7 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
chalk: 4.1.2
emittery: 0.13.1
graceful-fs: 4.2.11
@@ -12601,7 +12710,7 @@ snapshots:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
chalk: 4.1.2
cjs-module-lexer: 1.2.3
collect-v8-coverage: 1.0.2
@@ -12622,15 +12731,15 @@ snapshots:
jest-snapshot@29.7.0:
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
'@babel/generator': 7.24.1
- '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3)
- '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3)
+ '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4)
'@babel/types': 7.24.0
'@jest/expect-utils': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3)
+ babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4)
chalk: 4.1.2
expect: 29.7.0
graceful-fs: 4.2.11
@@ -12649,7 +12758,7 @@ snapshots:
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
@@ -12670,7 +12779,7 @@ snapshots:
dependencies:
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.13.1
@@ -12680,25 +12789,25 @@ snapshots:
jest-worker@27.5.1:
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
merge-stream: 2.0.0
supports-color: 8.1.1
dev: true
jest-worker@29.7.0:
dependencies:
- '@types/node': 20.12.3
+ '@types/node': 20.12.5
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
dev: true
- jest@29.7.0(@types/node@20.12.3):
+ jest@29.7.0(@types/node@20.12.5):
dependencies:
'@jest/core': 29.7.0
'@jest/types': 29.6.3
import-local: 3.1.0
- jest-cli: 29.7.0(@types/node@20.12.3)
+ jest-cli: 29.7.0(@types/node@20.12.5)
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
@@ -14058,7 +14167,7 @@ snapshots:
rc-align@4.0.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
classnames: 2.5.1
dom-align: 1.12.4
rc-util: 5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -14079,7 +14188,7 @@ snapshots:
rc-motion@2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
classnames: 2.5.1
rc-util: 5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
@@ -14088,7 +14197,7 @@ snapshots:
rc-slider@9.7.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
classnames: 2.5.1
rc-tooltip: 5.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-util: 5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -14099,7 +14208,7 @@ snapshots:
rc-switch@3.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
classnames: 2.5.1
rc-util: 5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
@@ -14108,7 +14217,7 @@ snapshots:
rc-tooltip@5.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
classnames: 2.5.1
rc-trigger: 5.3.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
@@ -14117,7 +14226,7 @@ snapshots:
rc-trigger@5.3.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
classnames: 2.5.1
rc-align: 4.0.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
rc-motion: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -14128,7 +14237,7 @@ snapshots:
rc-util@5.39.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-is: 18.2.0
@@ -14215,7 +14324,7 @@ snapshots:
react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
@@ -14341,7 +14450,7 @@ snapshots:
regenerator-transform@0.15.2:
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
dev: true
regexp.prototype.flags@1.5.2:
@@ -14609,14 +14718,14 @@ snapshots:
truncate-utf8-bytes: 1.0.2
dev: true
- sass-loader@14.1.1(sass@1.72.0)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)):
+ sass-loader@14.1.1(sass@1.74.1)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)):
dependencies:
neo-async: 2.6.2
- sass: 1.72.0
+ sass: 1.74.1
webpack: 5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)
dev: true
- sass@1.72.0:
+ sass@1.74.1:
dependencies:
chokidar: 3.6.0
immutable: 4.3.5
@@ -14827,10 +14936,10 @@ snapshots:
smart-buffer: 4.2.0
dev: true
- sofill@1.1.4(@sillot/bridge@0.0.3)(typescript@5.4.3):
+ sofill@1.1.8(@sillot/bridge@0.0.3)(typescript@5.4.4):
dependencies:
'@sillot/bridge': 0.0.3
- typescript: 5.4.3
+ typescript: 5.4.4
dev: true
sortablejs@1.15.2:
@@ -15225,38 +15334,38 @@ snapshots:
utf8-byte-length: 1.0.4
dev: true
- ts-api-utils@1.3.0(typescript@5.4.3):
+ ts-api-utils@1.3.0(typescript@5.4.4):
dependencies:
- typescript: 5.4.3
+ typescript: 5.4.4
dev: true
ts-interface-checker@0.1.13:
dev: true
- ts-jest@29.1.2(@babel/core@7.24.3)(esbuild@0.20.2)(jest@29.7.0(@types/node@20.12.3))(typescript@5.4.3):
+ ts-jest@29.1.2(@babel/core@7.24.4)(esbuild@0.20.2)(jest@29.7.0(@types/node@20.12.5))(typescript@5.4.4):
dependencies:
- '@babel/core': 7.24.3
+ '@babel/core': 7.24.4
bs-logger: 0.2.6
esbuild: 0.20.2
fast-json-stable-stringify: 2.1.0
- jest: 29.7.0(@types/node@20.12.3)
+ jest: 29.7.0(@types/node@20.12.5)
jest-util: 29.7.0
json5: 2.2.3
lodash.memoize: 4.1.2
make-error: 1.3.6
semver: 7.6.0
- typescript: 5.4.3
+ typescript: 5.4.4
yargs-parser: 21.1.1
dev: true
- ts-loader@9.5.1(typescript@5.4.3)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)):
+ ts-loader@9.5.1(typescript@5.4.4)(webpack@5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)):
dependencies:
chalk: 4.1.2
enhanced-resolve: 5.16.0
micromatch: 4.0.5
semver: 7.6.0
source-map: 0.7.4
- typescript: 5.4.3
+ typescript: 5.4.4
webpack: 5.91.0(esbuild@0.20.2)(webpack-cli@5.1.4)
dev: true
@@ -15336,7 +15445,7 @@ snapshots:
is-typedarray: 1.0.0
dev: true
- typescript@5.4.3:
+ typescript@5.4.4:
dev: true
unbox-primitive@1.0.2:
@@ -15451,7 +15560,7 @@ snapshots:
vconsole@3.15.1:
dependencies:
- '@babel/runtime': 7.24.1
+ '@babel/runtime': 7.24.4
copy-text-to-clipboard: 3.2.0
core-js: 3.36.1
mutation-observer: 1.0.3
diff --git a/app/src/SConst.ts b/app/src/SConst.ts
index cf34bf1790..657bbd2814 100644
--- a/app/src/SConst.ts
+++ b/app/src/SConst.ts
@@ -2,9 +2,8 @@ export abstract class SConst {
public static readonly Themes = {
BuiltinThemeLight: "daylight", // 思源默认主题
BuiltinThemeDark: "midnight", // 思源默认主题
- DefaultThemeLight: "sillon", // 汐洛默认主题
- DefaultThemeDark: "sillou", //汐洛默认主题
- lnco: "Sofill+",
+ DefaultThemeLight: "lnco",
+ DefaultThemeDark: "lnco",
};
// 渲染进程调主进程
diff --git a/app/src/ai/actions.ts b/app/src/ai/actions.ts
index 19622fdde7..0eab9da998 100644
--- a/app/src/ai/actions.ts
+++ b/app/src/ai/actions.ts
@@ -15,6 +15,7 @@ import {Menu} from "../plugin/Menu";
import {upDownHint} from "../util/upDownHint";
export const fillContent = (protyle: IProtyle, data: string, elements: Element[]) => {
+ window.sout.tracker("invoked");
if (!data) {
return;
}
@@ -27,6 +28,7 @@ export const fillContent = (protyle: IProtyle, data: string, elements: Element[]
};
const editDialog = (customName: string, customMemo: string) => {
+ window.sout.tracker("invoked");
const dialog = new Dialog({
title: window.siyuan.languages.update,
content: `
@@ -84,6 +86,7 @@ const editDialog = (customName: string, customMemo: string) => {
};
const customDialog = (protyle: IProtyle, ids: string[], elements: Element[]) => {
+ window.sout.tracker("invoked");
const dialog = new Dialog({
title: window.siyuan.languages.aiCustomAction,
content: `
@@ -137,6 +140,7 @@ const customDialog = (protyle: IProtyle, ids: string[], elements: Element[]) =>
};
const filterAI = (element: HTMLElement, inputElement: HTMLInputElement) => {
+ window.sout.tracker("invoked");
element.querySelectorAll(".b3-list-item").forEach(item => {
if (item.textContent.indexOf(inputElement.value) > -1) {
item.classList.remove("fn__none");
@@ -156,6 +160,7 @@ const filterAI = (element: HTMLElement, inputElement: HTMLInputElement) => {
};
export const AIActions = (elements: Element[], protyle: IProtyle) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
const ids: string[] = [];
elements.forEach(item => {
diff --git a/app/src/asset/anno.ts b/app/src/asset/anno.ts
index a48bbf41b1..57c9a596a8 100644
--- a/app/src/asset/anno.ts
+++ b/app/src/asset/anno.ts
@@ -9,6 +9,7 @@ import {Dialog} from "../dialog";
import {showMessage} from "../dialog/message";
export const initAnno = (element: HTMLElement, pdf: any, pdfConfig: any) => {
+ window.sout.tracker("invoked");
getConfig(pdf);
const rectAnnoElement = pdfConfig.toolbar.rectAnno;
rectAnnoElement.addEventListener("click", () => {
@@ -274,6 +275,7 @@ export const initAnno = (element: HTMLElement, pdf: any, pdfConfig: any) => {
};
const getRelationHTML = (ids: string[]) => {
+ window.sout.tracker("invoked");
if (!ids) {
return `
${window.siyuan.languages.emptyContent}`;
}
@@ -361,11 +363,13 @@ const setRelation = (pdf: any) => {
};
const hideToolbar = (element: HTMLElement) => {
+ window.sout.tracker("invoked");
element.querySelector(".pdf__util").classList.add("fn__none");
};
let rectElement: HTMLElement;
const showToolbar = (element: HTMLElement, range: Range, target?: HTMLElement) => {
+ window.sout.tracker("invoked");
if (target) {
// 阻止 popover
target.setAttribute("prevent-popover", "true");
@@ -392,6 +396,7 @@ const showToolbar = (element: HTMLElement, range: Range, target?: HTMLElement) =
};
const getHightlightCoordsByRange = (pdf: any, color: string) => {
+ window.sout.tracker("invoked");
const range = window.getSelection().getRangeAt(0);
const startPageElement = hasClosestByClassName(range.startContainer, "page");
if (!startPageElement) {
@@ -502,6 +507,7 @@ const getHightlightCoordsByRange = (pdf: any, color: string) => {
};
const getHightlightCoordsByRect = (pdf: any, color: string, rectResizeElement: HTMLElement, type: string) => {
+ window.sout.tracker("invoked");
const rect = rectResizeElement.getBoundingClientRect();
const startPageElement = hasClosestByClassName(document.elementFromPoint(rect.left, rect.top - 1), "page");
@@ -582,6 +588,7 @@ const getHightlightCoordsByRect = (pdf: any, color: string, rectResizeElement: H
};
const mergeRects = (range: Range) => {
+ window.sout.tracker("invoked");
const rects = range.getClientRects();
const mergedRects: { left: number, top: number, right: number, bottom: number }[] = [];
let lastTop: number = undefined;
@@ -600,6 +607,7 @@ const mergeRects = (range: Range) => {
};
export const getPdfInstance = (element: HTMLElement) => {
+ window.sout.tracker("invoked");
let pdfInstance;
getAllModels().asset.find(item => {
if (item.pdfObject && element && item.element && typeof item.element.contains !== "undefined" && item.element.contains(element)) {
@@ -611,6 +619,7 @@ export const getPdfInstance = (element: HTMLElement) => {
};
export const getHighlight = (element: HTMLElement) => {
+ window.sout.tracker("invoked");
const pdfInstance: any = getPdfInstance(element);
if (!pdfInstance) {
return;
@@ -642,6 +651,7 @@ export const getHighlight = (element: HTMLElement) => {
};
const showHighlight = (selected: IPdfAnno, pdf: any, hl?: boolean) => {
+ window.sout.tracker("invoked");
const pageIndex = selected.index;
const page = pdf.pdfViewer.getPageView(pageIndex);
let textLayerElement = page.textLayer.div;
@@ -680,6 +690,7 @@ const showHighlight = (selected: IPdfAnno, pdf: any, hl?: boolean) => {
};
export const hlPDFRect = (element: HTMLElement, id: string) => {
+ window.sout.tracker("invoked");
const currentElement = element.querySelector(`.pdf__rect[data-node-id="${id}"]`);
if (currentElement?.firstElementChild) {
const scrollElement = hasClosestByAttribute(currentElement, "id",
@@ -706,6 +717,7 @@ export const hlPDFRect = (element: HTMLElement, id: string) => {
};
const copyAnno = (idPath: string, fileName: string, pdf: any) => {
+ window.sout.tracker("invoked");
const mode = rectElement.getAttribute("data-mode");
const content = rectElement.getAttribute("data-content");
setTimeout(() => {
@@ -733,6 +745,7 @@ const copyAnno = (idPath: string, fileName: string, pdf: any) => {
};
const getCaptureCanvas = async (pdfObj: any, pageNumber: number) => {
+ window.sout.tracker("invoked");
const pdfPage = await pdfObj.pdfDocument.getPage(pageNumber);
const viewport = pdfPage.getViewport({scale: 1.5 * pdfObj.pdfViewer.currentScale * window.pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS});
const canvas = document.createElement("canvas");
@@ -748,6 +761,7 @@ const getCaptureCanvas = async (pdfObj: any, pageNumber: number) => {
};
async function getRectImgData(pdfObj: any) {
+ window.sout.tracker("invoked");
const pageElement = hasClosestByClassName(rectElement, "page");
if (!pageElement) {
return;
@@ -772,6 +786,7 @@ async function getRectImgData(pdfObj: any) {
}
const setConfig = (pdf: any, id: string, data: IPdfAnno) => {
+ window.sout.tracker("invoked");
const config = getConfig(pdf);
config[id] = data;
fetchPost("/api/asset/setFileAnnotation", {
@@ -781,6 +796,7 @@ const setConfig = (pdf: any, id: string, data: IPdfAnno) => {
};
const getConfig = (pdf: any) => {
+ window.sout.tracker("invoked");
if (pdf.appConfig.config) {
return pdf.appConfig.config;
}
diff --git a/app/src/asset/index.ts b/app/src/asset/index.ts
index e831f6ebd8..e2a0a26184 100644
--- a/app/src/asset/index.ts
+++ b/app/src/asset/index.ts
@@ -14,6 +14,7 @@ import {webViewerPageNumberChanged} from "./pdf/app";
import {fetchPost} from "../util/fetch";
import {setStorageVal, updateHotkeyTip} from "../protyle/util/compatibility";
import {App} from "../index";
+import {clearOBG} from "../layout/dock/util";
export class Asset extends Model {
public path: string;
@@ -31,6 +32,7 @@ export class Asset extends Model {
this.path = options.path;
this.pdfId = options.page;
this.element.addEventListener("click", (event) => {
+ clearOBG();
setPanelFocus(this.element.parentElement.parentElement);
this.app.plugins.forEach(item => {
item.eventBus.emit("click-pdf", {event});
diff --git a/app/src/asset/renderAssets.ts b/app/src/asset/renderAssets.ts
index fe7c21e79e..64bdc4f21c 100644
--- a/app/src/asset/renderAssets.ts
+++ b/app/src/asset/renderAssets.ts
@@ -7,6 +7,7 @@ import {pathPosix} from "../util/pathName";
import {formatDate} from "sofill/mid";
export const renderAssetsPreview = (pathString: string) => {
+ window.sout.tracker("invoked");
if (!pathString) {
return "";
}
@@ -24,6 +25,7 @@ export const renderAssetsPreview = (pathString: string) => {
export const pdfResize = () => {
/// #if !MOBILE
+ window.sout.tracker("invoked");
getAllModels().asset.forEach(item => {
const pdfInstance = item.pdfObject;
if (!pdfInstance) {
@@ -61,6 +63,7 @@ export const pdfResize = () => {
};
export const genAssetHTML = (type: string, pathString: string, imgName: string, linkName: string) => {
+ window.sout.tracker("invoked");
let html = "";
if (Constants.SIYUAN_ASSETS_AUDIO.includes(type)) {
html = `
`;
diff --git a/app/src/assets/scss/business/_av.scss b/app/src/assets/scss/business/_av.scss
index 2698076b86..80a458ab15 100644
--- a/app/src/assets/scss/business/_av.scss
+++ b/app/src/assets/scss/business/_av.scss
@@ -10,6 +10,7 @@
&__container {
overflow: auto;
+ cursor: auto;
}
&__pulse {
@@ -41,6 +42,10 @@
.layout-tab-bar {
background-color: transparent;
font-size: 87.5%;
+
+ .item__text {
+ padding-left: 5px;
+ }
}
}
@@ -267,7 +272,7 @@
}
&--header {
- padding: 5px;
+ padding: 5px 8px;
display: flex;
align-items: center;
transition: background 20ms ease-in 0s;
@@ -455,6 +460,11 @@
&__item {
transition: margin .2s cubic-bezier(0, 0, .2, 1) 0ms;
+
+ &[disabled] {
+ opacity: .38;
+ cursor: not-allowed;
+ }
}
&__item:hover .b3-menu__action {
diff --git a/app/src/assets/scss/sillot/_mobile_menu.scss b/app/src/assets/scss/sillot/_mobile_menu.scss
index 8daf74e89d..291c147586 100644
--- a/app/src/assets/scss/sillot/_mobile_menu.scss
+++ b/app/src/assets/scss/sillot/_mobile_menu.scss
@@ -1,3 +1,35 @@
.b3s-mobile-height-menu__item {
padding: 5px 8px !important;
-}
\ No newline at end of file
+}
+
+body.body--mobile {
+ #commonMenu:not(.b3-menu--fullscreen) { // 权宜之计,先凑合吧 https://github.com/Hi-Windom/Sillot/issues/611
+ bottom: 0 !important;
+ left: 0 !important;
+ width: 100% !important;
+ top: auto !important;
+ padding-bottom: 58px !important;
+
+ .b3-menu__item {
+ line-height: 33px;
+
+ .b3-menu__icon {
+ width: 18px;
+ height: 18px;
+ }
+ .b3-menu__label {
+ letter-spacing: .58px;
+ font-size: 120%;
+ }
+ .b3-text-field {
+ width: 100% !important;
+ }
+
+ &.b3-menu__item--show {
+ .b3-menu__submenu {
+ display: contents;
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/block/popover.ts b/app/src/block/popover.ts
index 9b3c6e1144..705ba23b41 100644
--- a/app/src/block/popover.ts
+++ b/app/src/block/popover.ts
@@ -1,9 +1,5 @@
import {BlockPanel} from "./Panel";
-import {
- hasClosestBlock,
- hasClosestByAttribute,
- hasClosestByClassName,
-} from "../protyle/util/hasClosest";
+import {hasClosestBlock, hasClosestByAttribute, hasClosestByClassName,} from "../protyle/util/hasClosest";
import {fetchPost, fetchSyncPost} from "../util/fetch";
import {hideTooltip, showTooltip} from "../dialog/tooltip";
import {getIdFromSYProtocol, isLocalPath} from "../util/pathName";
@@ -14,6 +10,7 @@ import {isPadAppMode} from "sofill/env";
let popoverTargetElement: HTMLElement;
export const initBlockPopover = (app: App) => {
+ window.sout.tracker("invoked");
let timeout: number;
let timeoutHide: number;
// 编辑器内容块引用/backlinks/tag/bookmark/套娃中使用
@@ -128,6 +125,7 @@ export const initBlockPopover = (app: App) => {
};
const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
// pad 端点击后 event.target 不会更新。
const target = document.elementFromPoint(event.clientX, event.clientY);
if (!target) {
@@ -178,7 +176,7 @@ const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => {
if (!popoverTargetElement && linkElement && linkElement.getAttribute("data-href")?.startsWith("siyuan://blocks")) {
popoverTargetElement = linkElement;
}
- if (!popoverTargetElement) {
+ if (!popoverTargetElement || (popoverTargetElement && window.siyuan.menus.menu.data?.isSameNode(popoverTargetElement))) {
// 移动到弹窗的 loading 元素上,但经过 settimeout 后 loading 已经被移除了
// https://ld246.com/article/1673596577519/comment/1673767749885#comments
let targetElement = target;
@@ -233,6 +231,7 @@ const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => {
};
const getTarget = (event: MouseEvent & { target: HTMLElement }, aElement: false | HTMLElement) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
if (window.siyuan.config.editor.floatWindowMode === 2 || hasClosestByClassName(event.target, "history__repo", true)) {
return false;
}
@@ -270,7 +269,8 @@ const getTarget = (event: MouseEvent & { target: HTMLElement }, aElement: false
};
export const showPopover = async (app: App, showRef = false) => {
- if (!popoverTargetElement) {
+ window.sout.tracker("invoked");
+ if (!popoverTargetElement || window.siyuan.menus.menu.data?.isSameNode(popoverTargetElement)) {
return;
}
let ids: string[];
diff --git a/app/src/block/util.ts b/app/src/block/util.ts
index 8908f27400..a054f4bd35 100644
--- a/app/src/block/util.ts
+++ b/app/src/block/util.ts
@@ -11,6 +11,7 @@ import {fetchPost} from "../util/fetch";
import {zoomOut} from "../menus/protyle";
export const cancelSB = (protyle: IProtyle, nodeElement: Element) => {
+ window.sout.tracker("invoked");
const doOperations: IOperation[] = [];
const undoOperations: IOperation[] = [];
let previousId = nodeElement.previousElementSibling ? nodeElement.previousElementSibling.getAttribute("data-node-id") : undefined;
@@ -65,6 +66,7 @@ export const cancelSB = (protyle: IProtyle, nodeElement: Element) => {
};
export const genSBElement = (layout: string, id?: string, attrHTML?: string) => {
+ window.sout.tracker("invoked");
const sbElement = document.createElement("div");
sbElement.setAttribute("data-node-id", id || Lute.NewNodeID());
sbElement.setAttribute("data-type", "NodeSuperBlock");
@@ -75,6 +77,7 @@ export const genSBElement = (layout: string, id?: string, attrHTML?: string) =>
};
export const jumpToParentNext = (protyle: IProtyle, nodeElement: Element) => {
+ window.sout.tracker("invoked");
const topElement = getTopAloneElement(nodeElement);
if (topElement) {
const topParentElement = hasClosestByClassName(topElement, "list") || hasClosestByClassName(topElement, "bq") || hasClosestByClassName(topElement, "sb") || topElement;
@@ -96,6 +99,7 @@ export const jumpToParentNext = (protyle: IProtyle, nodeElement: Element) => {
};
export const insertEmptyBlock = (protyle: IProtyle, position: InsertPosition, id?: string) => {
+ window.sout.tracker("invoked");
const range = getEditorRange(protyle.wysiwyg.element);
let blockElement: Element;
if (id) {
@@ -157,6 +161,7 @@ export const insertEmptyBlock = (protyle: IProtyle, position: InsertPosition, id
};
export const genEmptyBlock = (zwsp = true, wbr = true, string?: string) => {
+ window.sout.tracker("invoked");
let html = "";
if (zwsp) {
html = Constants.ZWSP;
@@ -171,6 +176,7 @@ export const genEmptyBlock = (zwsp = true, wbr = true, string?: string) => {
};
export const genEmptyElement = (zwsp = true, wbr = true, id?: string) => {
+ window.sout.tracker("invoked");
const element = document.createElement("div");
element.setAttribute("data-node-id", id || Lute.NewNodeID());
element.setAttribute("data-type", "NodeParagraph");
diff --git a/app/src/boot/globalEvent/click.ts b/app/src/boot/globalEvent/click.ts
index 6ba8c45207..767f0058ef 100644
--- a/app/src/boot/globalEvent/click.ts
+++ b/app/src/boot/globalEvent/click.ts
@@ -1,18 +1,23 @@
import {getAllModels} from "../../layout/getAll";
-import {hasClosestByAttribute, hasClosestByClassName, hasTopClosestByClassName} from "../../protyle/util/hasClosest";
+import {
+ hasClosestByAttribute,
+ hasClosestByClassName,
+ hasTopClosestByClassName
+} from "../../protyle/util/hasClosest";
import {hideAllElements} from "../../protyle/ui/hideElements";
import {isWindow} from "../../util/functions";
import {writeText} from "../../protyle/util/compatibility";
import {showMessage} from "../../dialog/message";
export const globalClick = (event: MouseEvent & { target: HTMLElement }) => {
- const ghostElement = document.getElementById("dragGhost")
+ window.sout.tracker("invoked");
+ const ghostElement = document.getElementById("dragGhost");
if (ghostElement) {
- const startElement = ghostElement.parentElement.querySelector(`[data-node-id="${ghostElement.getAttribute("data-node-id")}"]`) as HTMLElement
- startElement ? startElement.style.opacity = "" : ""
+ const startElement = ghostElement.parentElement.querySelector(`[data-node-id="${ghostElement.getAttribute("data-node-id")}"]`) as HTMLElement;
+ startElement ? startElement.style.opacity = "" : "";
ghostElement.parentElement.querySelectorAll(".dragover__top, .dragover__bottom, .dragover").forEach((item: HTMLElement) => {
item.classList.remove("dragover__top", "dragover__bottom", "dragover");
- item.style.opacity = ""
+ item.style.opacity = "";
});
ghostElement.remove();
}
@@ -44,6 +49,13 @@ export const globalClick = (event: MouseEvent & { target: HTMLElement }) => {
window.siyuan.layout.rightDock.hideDock();
}
+ const protyleElement = hasClosestByClassName(event.target, "protyle", true);
+ if (protyleElement) {
+ const wysiwygElement = protyleElement.querySelector(".protyle-wysiwyg");
+ if (wysiwygElement.getAttribute("data-readonly") === "true" || !wysiwygElement.contains(event.target)) {
+ wysiwygElement.dispatchEvent(new Event("focusin"));
+ }
+ }
const copyElement = hasTopClosestByClassName(event.target, "protyle-action__copy");
if (copyElement) {
let text = copyElement.parentElement.nextElementSibling.textContent.trimEnd();
diff --git a/app/src/boot/globalEvent/event.ts b/app/src/boot/globalEvent/event.ts
index a613b975df..d69f891033 100644
--- a/app/src/boot/globalEvent/event.ts
+++ b/app/src/boot/globalEvent/event.ts
@@ -17,6 +17,7 @@ import {openFileById} from "../../editor/util";
import {checkFold} from "../../util/noRelyPCFunction";
export const initWindowEvent = (app: App) => {
+ window.sout.tracker("invoked");
document.body.addEventListener("mouseleave", () => {
if (window.siyuan.layout.leftDock) {
window.siyuan.layout.leftDock.hideDock();
diff --git a/app/src/boot/globalEvent/keydown.ts b/app/src/boot/globalEvent/keydown.ts
index df617e89a4..a246f58ea1 100644
--- a/app/src/boot/globalEvent/keydown.ts
+++ b/app/src/boot/globalEvent/keydown.ts
@@ -80,6 +80,7 @@ import {formatDate} from "sofill/mid";
import {getPlainText} from "../../protyle/util/paste";
const switchDialogEvent = (app: App, event: MouseEvent) => {
+ window.sout.tracker("invoked");
event.preventDefault();
let target = event.target as HTMLElement;
while (!target.isSameNode(switchDialog.element)) {
@@ -110,6 +111,7 @@ const switchDialogEvent = (app: App, event: MouseEvent) => {
};
const dialogArrow = (app: App, element: HTMLElement, event: KeyboardEvent) => {
+ window.sout.tracker("invoked");
let currentLiElement = element.querySelector(".b3-list-item--focus");
if (currentLiElement) {
currentLiElement.classList.remove("b3-list-item--focus");
@@ -178,6 +180,7 @@ const dialogArrow = (app: App, element: HTMLElement, event: KeyboardEvent) => {
};
const editKeydown = (app: App, event: KeyboardEvent) => {
+ window.sout.tracker("invoked");
let protyle: IProtyle;
let range: Range;
if (getSelection().rangeCount > 0) {
@@ -581,6 +584,7 @@ const editKeydown = (app: App, event: KeyboardEvent) => {
};
const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
+ window.sout.tracker("invoked");
const dockFile = getDockByType("file");
if (!dockFile) {
return false;
@@ -931,6 +935,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
};
const panelTreeKeydown = (app: App, event: KeyboardEvent) => {
+ window.sout.tracker("invoked");
// 面板折叠展开操作
const target = event.target as HTMLElement;
if (["INPUT", "TEXTAREA"].includes(target.tagName) ||
@@ -1134,6 +1139,7 @@ const panelTreeKeydown = (app: App, event: KeyboardEvent) => {
let switchDialog: Dialog;
export const windowKeyDown = (app: App, event: KeyboardEvent) => {
+ window.sout.tracker("invoked");
// https://github.com/siyuan-note/siyuan/issues/9848 忘记为什么要阻止了 .av__mask 的情况,测了下没问题就先移除
if (document.getElementById("progress") || document.getElementById("errorLog") || event.isComposing) {
return;
@@ -1793,6 +1799,7 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
export const sendGlobalShortcut = (app: App) => {
/// #if !BROWSER
+ window.sout.tracker("invoked");
const hotkeys = [window.siyuan.config.keymap.general.toggleWin.custom];
app.plugins.forEach(plugin => {
plugin.commands.forEach(command => {
diff --git a/app/src/boot/globalEvent/keyup.ts b/app/src/boot/globalEvent/keyup.ts
index de7cda8b0c..dd3681abd2 100644
--- a/app/src/boot/globalEvent/keyup.ts
+++ b/app/src/boot/globalEvent/keyup.ts
@@ -8,6 +8,7 @@ import {Constants} from "../../constants";
import {matchHotKey} from "../../protyle/util/hotKey";
export const windowKeyUp = (app: App, event: KeyboardEvent) => {
+ window.sout.tracker("invoked");
window.siyuan.ctrlIsPressed = false;
window.siyuan.shiftIsPressed = false;
window.siyuan.altIsPressed = false;
diff --git a/app/src/boot/globalEvent/mousemove.ts b/app/src/boot/globalEvent/mousemove.ts
index b676644a80..3c18a5948d 100644
--- a/app/src/boot/globalEvent/mousemove.ts
+++ b/app/src/boot/globalEvent/mousemove.ts
@@ -4,6 +4,7 @@ import {hasClosestBlock, hasClosestByClassName, hasClosestByMatchTag} from "../.
import {getColIndex} from "../../protyle/util/table";
const getRightBlock = (element: HTMLElement, x: number, y: number) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
let index = 1;
let nodeElement = element;
while (nodeElement && (nodeElement.classList.contains("list") || nodeElement.classList.contains("li"))) {
@@ -15,6 +16,7 @@ const getRightBlock = (element: HTMLElement, x: number, y: number) => {
};
export const windowMouseMove = (event: MouseEvent & { target: HTMLElement }, mouseIsEnter: boolean) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
if (document.body.classList.contains("body--blur")) {
// 非激活状态下不执行 https://ld246.com/article/1693474547631
return;
diff --git a/app/src/boot/globalEvent/searchKeydown.ts b/app/src/boot/globalEvent/searchKeydown.ts
index 43770bdb3a..fa0f4ece5a 100644
--- a/app/src/boot/globalEvent/searchKeydown.ts
+++ b/app/src/boot/globalEvent/searchKeydown.ts
@@ -19,6 +19,7 @@ import {checkFold} from "../../util/noRelyPCFunction";
import {getUnRefList} from "../../search/unRef";
export const searchKeydown = (app: App, event: KeyboardEvent) => {
+ window.sout.tracker("invoked");
if (getSelection().rangeCount === 0) {
return false;
}
diff --git a/app/src/boot/globalEvent/touch.ts b/app/src/boot/globalEvent/touch.ts
index 836b69b376..cc3175ec96 100644
--- a/app/src/boot/globalEvent/touch.ts
+++ b/app/src/boot/globalEvent/touch.ts
@@ -13,6 +13,7 @@ import {Editor} from "../../editor";
import {hideTooltip} from "../../dialog/tooltip";
export const globalTouchStart = (event: TouchEvent) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
// 文档背景位置调整
const target = event.target as HTMLElement;
const backgroundElement = hasClosestByClassName(target, "protyle-background");
@@ -48,6 +49,7 @@ export const globalTouchStart = (event: TouchEvent) => {
};
export const globalTouchEnd = (event: TouchEvent, yDiff: number, time: number, app: App) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
const target = event.target as HTMLElement;
const isIPadBoolean = isIPad();
if (typeof yDiff === "undefined" && new Date().getTime() - time > 900) {
diff --git a/app/src/business/openRecentDocs.ts b/app/src/business/openRecentDocs.ts
index a3809e2d77..4ac98d6c1c 100644
--- a/app/src/business/openRecentDocs.ts
+++ b/app/src/business/openRecentDocs.ts
@@ -11,6 +11,7 @@ import {hasClosestByClassName} from "../protyle/util/hasClosest";
import {hideElements} from "../protyle/ui/hideElements";
const getHTML = async (data: { rootID: string, icon: string, title: string }[], element: Element, key?: string) => {
+ window.sout.tracker("invoked");
let tabHtml = "";
let index = 0;
data.forEach((item) => {
@@ -68,6 +69,7 @@ ${unicode2Emoji(item.icon || Constants.SIYUAN_IMAGE_FILE, "b3-list-item__graphic
};
export const openRecentDocs = () => {
+ window.sout.tracker("invoked");
const openRecentDocsDialog = window.siyuan.dialogs.find(item => {
if (item.element.getAttribute("data-key") === Constants.DIALOG_RECENTDOCS) {
return true;
diff --git a/app/src/card/makeCard.ts b/app/src/card/makeCard.ts
index 3fc13b19e8..4c742aacd9 100644
--- a/app/src/card/makeCard.ts
+++ b/app/src/card/makeCard.ts
@@ -11,6 +11,7 @@ import {transaction} from "../protyle/wysiwyg/transaction";
import {App} from "../index";
export const genCardItem = (item: ICardPackage) => {
+ window.sout.tracker("invoked");
return `
${escapeHtml(item.name)}
@@ -36,6 +37,7 @@ export const genCardItem = (item: ICardPackage) => {
};
export const makeCard = (app: App, ids: string[]) => {
+ window.sout.tracker("invoked");
window.siyuan.dialogs.find(item => {
if (item.element.getAttribute("data-key") === Constants.DIALOG_MAKECARD) {
hideElements(["dialog"]);
@@ -176,6 +178,7 @@ export const makeCard = (app: App, ids: string[]) => {
};
export const quickMakeCard = (protyle: IProtyle, nodeElement: Element[]) => {
+ window.sout.tracker("invoked");
let isRemove = true;
const ids: string[] = [];
nodeElement.forEach(item => {
diff --git a/app/src/card/newCardTab.ts b/app/src/card/newCardTab.ts
index d5d0adcb0f..dceecd72bd 100644
--- a/app/src/card/newCardTab.ts
+++ b/app/src/card/newCardTab.ts
@@ -5,6 +5,7 @@ import {fetchPost} from "../util/fetch";
import {Protyle} from "../protyle";
import {setPanelFocus} from "../layout/util";
import {App} from "../index";
+import {clearOBG} from "../layout/dock/util";
export const newCardModel = (options: {
app: App,
@@ -17,6 +18,7 @@ export const newCardModel = (options: {
index?: number,
}
}) => {
+ window.sout.tracker("invoked");
let editor: Protyle;
const customObj = new Custom({
app: options.app,
@@ -108,6 +110,7 @@ export const newCardModel = (options: {
}
});
customObj.element.addEventListener("click", () => {
+ clearOBG();
setPanelFocus(customObj.element.parentElement.parentElement);
});
return customObj;
diff --git a/app/src/card/openCard.ts b/app/src/card/openCard.ts
index 2adf72f04f..e2ed073c0b 100644
--- a/app/src/card/openCard.ts
+++ b/app/src/card/openCard.ts
@@ -29,6 +29,7 @@ import {Menu} from "../plugin/Menu";
import {transaction} from "../protyle/wysiwyg/transaction";
const genCardCount = (cardsData: ICardData, allIndex = 0) => {
+ window.sout.tracker("invoked");
let newIndex = 0;
let oldIndex = 0;
cardsData.cards.forEach((item, index) => {
@@ -58,6 +59,7 @@ export const genCardHTML = (options: {
cardsData: ICardData,
isTab: boolean
}) => {
+ window.sout.tracker("invoked");
let iconsHTML: string;
/// #if MOBILE
iconsHTML = `
diff --git a/app/src/config/index.ts b/app/src/config/index.ts
index eb911eff31..2f46846a1a 100644
--- a/app/src/config/index.ts
+++ b/app/src/config/index.ts
@@ -18,6 +18,7 @@ import {isHuawei} from "../protyle/util/compatibility";
import {Constants} from "../constants";
export const genItemPanel = (type: string, containerElement: Element, app: App) => {
+ window.sout.tracker("invoked");
switch (type) {
case "filetree":
containerElement.innerHTML = fileTree.genHTML();
@@ -85,6 +86,7 @@ export const genItemPanel = (type: string, containerElement: Element, app: App)
};
export const openSetting = (app: App) => {
+ window.sout.tracker("invoked");
const exitDialog = window.siyuan.dialogs.find((item) => {
if (item.element.querySelector(".config__tab-container")) {
item.destroy();
diff --git a/app/src/config/repos.ts b/app/src/config/repos.ts
index 776e526026..7336668836 100644
--- a/app/src/config/repos.ts
+++ b/app/src/config/repos.ts
@@ -8,6 +8,7 @@ import {openByMobile} from "../protyle/util/compatibility";
import {confirmDialog} from "../dialog/confirmDialog";
const renderProvider = (provider: number) => {
+ window.sout.tracker("invoked");
if (provider === 0) {
if (needSubscribe("")) {
return `${window.siyuan.config.system.container === "ios" ? window.siyuan.languages._kernel[122] : window.siyuan.languages._kernel[29].replace("${url}", getCloudURL("subscribe/siyuan"))}
@@ -63,6 +64,7 @@ const renderProvider = (provider: number) => {
};
const bindProviderEvent = () => {
+ window.sout.tracker("invoked");
const importElement = repos.element.querySelector("#importData") as HTMLInputElement;
if (importElement) {
importElement.addEventListener("change", () => {
@@ -267,8 +269,11 @@ export const repos = {
-
${window.siyuan.languages.cloudSyncDir}
-
+
+ ${window.siyuan.languages.cloudSyncDir}
+
${window.siyuan.languages.cloudSyncDirTip}
+
+
diff --git a/app/src/config/search.ts b/app/src/config/search.ts
index 4512fd3545..106f872225 100644
--- a/app/src/config/search.ts
+++ b/app/src/config/search.ts
@@ -12,6 +12,7 @@ const getLang = (keys: string[]) => {
};
export const initConfigSearch = (element: HTMLElement, app: App) => {
+ window.sout.tracker("invoked");
const configIndex = [
// 编辑器
getLang(["config", "fullWidth", "md7", "md8", "md37", "md38",
diff --git a/app/src/config/util/about.ts b/app/src/config/util/about.ts
index 78df773439..316605aba9 100644
--- a/app/src/config/util/about.ts
+++ b/app/src/config/util/about.ts
@@ -4,6 +4,7 @@ import {fetchPost} from "../../util/fetch";
import {Constants} from "../../constants";
export const setAccessAuthCode = () => {
+ window.sout.tracker("invoked");
const dialog = new Dialog({
title: window.siyuan.languages.about5,
content: `
@@ -33,11 +34,13 @@ export const setAccessAuthCode = () => {
};
export const getCloudURL = (key: string) => {
+ window.sout.tracker("invoked");
const origin = window.siyuan.config.cloudRegion === 0 ? "https://ld246.com" : "https://liuyun.io";
return `${origin}/${key}`;
};
export const getIndexURL = (key: string) => {
+ window.sout.tracker("invoked");
const lang = "zh_CN" === window.siyuan.config.lang ? "" : "/en";
return "https://b3log.org/siyuan" + `${lang}/${key}`;
};
diff --git a/app/src/config/util/snippets.ts b/app/src/config/util/snippets.ts
index e365eea62b..e6fd76c2f9 100644
--- a/app/src/config/util/snippets.ts
+++ b/app/src/config/util/snippets.ts
@@ -5,6 +5,7 @@ import {confirmDialog} from "../../dialog/confirmDialog";
import {Constants} from "../../constants";
export const renderSnippet = () => {
+ window.sout.tracker("invoked");
fetchPost("/api/snippet/getSnippet", {type: "all", enabled: 2}, (response) => {
response.data.snippets.forEach((item: ISnippet) => {
const id = `snippet${item.type === "css" ? "CSS" : "JS"}${item.id}`;
@@ -42,6 +43,7 @@ export const renderSnippet = () => {
};
export const openSnippets = () => {
+ window.sout.tracker("invoked");
fetchPost("/api/snippet/getSnippet", {type: "all", enabled: 2}, (response) => {
let cssHTML = "";
let jsHTML = "";
@@ -185,6 +187,7 @@ export const openSnippets = () => {
};
const genSnippet = (options: ISnippet) => {
+ window.sout.tracker("invoked");
return `
@@ -204,6 +207,7 @@ const genSnippet = (options: ISnippet) => {
};
const setSnippetPost = (dialog: Dialog, snippets: ISnippet[], removeIds: string[]) => {
+ window.sout.tracker("invoked");
fetchPost("/api/snippet/setSnippet", {snippets}, () => {
removeIds.forEach(item => {
const rmElement = document.querySelector(item);
@@ -220,6 +224,7 @@ const setSnippetPost = (dialog: Dialog, snippets: ISnippet[], removeIds: string[
};
const setSnippet = (dialog: Dialog, oldSnippets: ISnippet[], removeIds: string[], confirm = false) => {
+ window.sout.tracker("invoked");
const snippets: ISnippet[] = [];
dialog.element.querySelectorAll("[data-id]").forEach((item) => {
snippets.push({
diff --git a/app/src/constants.ts b/app/src/constants.ts
index 112c496604..e260787b34 100644
--- a/app/src/constants.ts
+++ b/app/src/constants.ts
@@ -195,6 +195,7 @@ export abstract class Constants extends SConst { // Sillot extend
zh_CN: "20210808180117-czj9bvb",
en_US: "20210808180117-6v0mkxr",
fr_FR: "20210808180117-6v0mkxr",
+ es_ES: "20210808180117-6v0mkxr",
};
public static readonly QUICK_DECK_ID = "20230218211946-2kw8jgx";
diff --git a/app/src/dialog/confirmDialog.ts b/app/src/dialog/confirmDialog.ts
index 98cc3eb2be..e50b429e8b 100644
--- a/app/src/dialog/confirmDialog.ts
+++ b/app/src/dialog/confirmDialog.ts
@@ -2,6 +2,7 @@ import {isMobile} from "../util/functions";
import {Dialog} from "./index";
export const confirmDialog = (title: string, text: string, confirm?: (dialog?: Dialog) => void, cancel?: (dialog: Dialog) => void) => {
+ window.sout.tracker("invoked");
if (!text && !title) {
confirm();
return;
diff --git a/app/src/dialog/message.ts b/app/src/dialog/message.ts
index 069773ddbb..a3bb2eacb1 100644
--- a/app/src/dialog/message.ts
+++ b/app/src/dialog/message.ts
@@ -2,6 +2,7 @@ import {genUUID} from "../util/genID";
import {Constants} from "../constants";
export const initMessage = () => {
+ window.sout.tracker("invoked");
const messageElement = document.getElementById("message");
messageElement.innerHTML = `
`;
@@ -34,6 +35,7 @@ export const initMessage = () => {
// type: info/error; timeout: 0 手动关闭;-1 用不关闭
export const showMessage = (message: string, timeout = 6000, type = "info", messageId?: string) => {
+ window.sout.tracker("invoked");
const messagesElement = document.getElementById("message").firstElementChild;
if (!messagesElement) {
alert(message);
@@ -86,6 +88,7 @@ export const showMessage = (message: string, timeout = 6000, type = "info", mess
};
export const hideMessage = (id?: string) => {
+ window.sout.tracker("invoked");
const messagesElement = document.getElementById("message").firstElementChild;
if (!messagesElement) {
return;
diff --git a/app/src/dialog/moveResize.ts b/app/src/dialog/moveResize.ts
index f89956bb63..946e9bfd23 100644
--- a/app/src/dialog/moveResize.ts
+++ b/app/src/dialog/moveResize.ts
@@ -4,6 +4,7 @@ import {hideAllElements} from "../protyle/ui/hideElements";
import {setStorageVal} from "../protyle/util/compatibility";
export const moveResize = (element: HTMLElement, afterCB?: (type: string) => void) => {
+ window.sout.tracker("invoked");
element.addEventListener("mousedown", (event: MouseEvent & { target: HTMLElement }) => {
// https://github.com/siyuan-note/siyuan/issues/8746
if (hasClosestByClassName(event.target, "protyle-util") && !element.classList.contains("protyle-util")) {
diff --git a/app/src/dialog/processSystem.ts b/app/src/dialog/processSystem.ts
index 561cf8bea5..f2fc2852f5 100644
--- a/app/src/dialog/processSystem.ts
+++ b/app/src/dialog/processSystem.ts
@@ -26,6 +26,7 @@ import {isInAndroid, isInIOS, setStorageVal} from "../protyle/util/compatibility
import {Plugin} from "../plugin";
const updateTitle = (rootID: string, tab: Tab, protyle?: IProtyle) => {
+ window.sout.tracker("invoked");
fetchPost("/api/block/getDocInfo", {
id: rootID
}, (response) => {
@@ -37,6 +38,7 @@ const updateTitle = (rootID: string, tab: Tab, protyle?: IProtyle) => {
};
export const reloadSync = (app: App, data: { upsertRootIDs: string[], removeRootIDs: string[] }, hideMsg = true) => {
+ window.sout.tracker("invoked");
if (hideMsg) {
hideMessage();
}
@@ -134,6 +136,7 @@ export const reloadSync = (app: App, data: { upsertRootIDs: string[], removeRoot
};
export const lockScreen = (app: App) => {
+ window.sout.tracker("invoked");
if (window.siyuan.config.readonly) {
return;
}
@@ -151,6 +154,7 @@ export const lockScreen = (app: App) => {
};
export const kernelError = () => {
+ window.sout.tracker("invoked");
if (document.querySelector("#errorLog")) {
return;
}
@@ -188,6 +192,7 @@ export const kernelError = () => {
export const exitSiYuan = () => {
+ window.sout.tracker("invoked");
const overlay = document.querySelector('#SillotOverlay') as HTMLElement;
overlay.style.display = "block";
exportIDB().then(() => {
@@ -257,6 +262,7 @@ export const exitSiYuan = () => {
};
export const transactionError = () => {
+ window.sout.tracker("invoked");
if (document.getElementById("transactionError")) {
return;
}
@@ -291,6 +297,7 @@ export const transactionError = () => {
};
export const progressStatus = (data: IWebSocketData) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
const statusElement = document.querySelector("#status") as HTMLElement;
if (!statusElement) {
return;
@@ -311,6 +318,7 @@ export const progressStatus = (data: IWebSocketData) => {
};
export const progressLoading = (data: IWebSocketData) => {
+ window.sout.tracker("invoked");
let progressElement = document.getElementById("progress");
if (!progressElement) {
document.body.insertAdjacentHTML("beforeend", `
`);
@@ -342,6 +350,7 @@ export const progressLoading = (data: IWebSocketData) => {
};
export const progressBackgroundTask = (tasks: { action: string }[]) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
const backgroundTaskElement = document.querySelector(".status__backgroundtask");
if (!backgroundTaskElement) {
return;
@@ -360,6 +369,7 @@ export const progressBackgroundTask = (tasks: { action: string }[]) => {
};
export const bootSync = () => {
+ window.sout.tracker("invoked");
fetchPost("/api/sync/getBootSync", {}, response => {
if (response.code === 1) {
const dialog = new Dialog({
@@ -393,6 +403,7 @@ export const bootSync = () => {
};
export const setTitle = (title: string) => {
+ window.sout.tracker("invoked");
const dragElement = document.getElementById("drag");
const workspaceName = getWorkspaceName();
if (title === window.siyuan.languages.siyuanNote) {
@@ -414,6 +425,7 @@ export const setTitle = (title: string) => {
};
export const downloadProgress = (data: { id: string, percent: number }) => {
+ window.sout.tracker("invoked");
const bazzarSideElement = document.querySelector("#configBazaarReadme .item__side");
if (!bazzarSideElement) {
return;
@@ -436,6 +448,7 @@ export const downloadProgress = (data: { id: string, percent: number }) => {
};
export const processSync = (data?: IWebSocketData, plugins?: Plugin[]) => {
+ window.sout.tracker("invoked");
/// #if MOBILE
const menuSyncUseElement = document.querySelector("#menuSyncNow use");
const barSyncUseElement = document.querySelector("#toolbarSync use");
diff --git a/app/src/editor/deleteFile.ts b/app/src/editor/deleteFile.ts
index 1832cc5ff6..178bfb14ea 100644
--- a/app/src/editor/deleteFile.ts
+++ b/app/src/editor/deleteFile.ts
@@ -7,6 +7,7 @@ import {showMessage} from "../dialog/message";
import {escapeHtml} from "../util/escape";
export const deleteFile = (notebookId: string, pathString: string) => {
+ window.sout.tracker("invoked");
if (window.siyuan.config.fileTree.removeDocWithoutConfirm) {
fetchPost("/api/filetree/removeDoc", {
notebook: notebookId,
@@ -32,6 +33,7 @@ export const deleteFile = (notebookId: string, pathString: string) => {
};
export const deleteFiles = (liElements: Element[]) => {
+ window.sout.tracker("invoked");
if (liElements.length === 1) {
const itemTopULElement = hasTopClosestByTag(liElements[0], "UL");
if (itemTopULElement) {
diff --git a/app/src/editor/getIcon.ts b/app/src/editor/getIcon.ts
index a2dedeff96..13c9fc015d 100644
--- a/app/src/editor/getIcon.ts
+++ b/app/src/editor/getIcon.ts
@@ -1,4 +1,5 @@
export const getIconByType = (type: string, sub?: string) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
let iconName = "";
switch (type) {
case "NodeDocument":
diff --git a/app/src/editor/rename.ts b/app/src/editor/rename.ts
index 2a77c1af9f..3e4ba8b788 100644
--- a/app/src/editor/rename.ts
+++ b/app/src/editor/rename.ts
@@ -10,6 +10,7 @@ import {Constants} from "../constants";
import {showTooltip} from "../dialog/tooltip";
export const validateName = (name: string, targetElement?: HTMLElement) => {
+ window.sout.tracker("invoked");
if (/\r\n|\r|\n|\u2028|\u2029|\t|\//.test(name)) {
if (targetElement) {
showTooltip(window.siyuan.languages.fileNameRule, targetElement, true);
@@ -30,10 +31,12 @@ export const validateName = (name: string, targetElement?: HTMLElement) => {
};
export const replaceFileName = (name: string) => {
+ window.sout.tracker("invoked");
return name.replace(/\r\n|\r|\n|\u2028|\u2029|\t|\//g, "").substring(0, Constants.SIZE_TITLE);
};
export const replaceLocalPath = (name: string) => {
+ window.sout.tracker("invoked");
return name.replace(/\\\\|\/|"|:|\*|\?|\\|'|<|>|\|/g, "");
};
@@ -44,6 +47,7 @@ export const rename = (options: {
type: "notebook" | "file"
range?: Range,
}) => {
+ window.sout.tracker("invoked");
if (window.siyuan.config.readonly) {
return;
}
@@ -105,6 +109,7 @@ export const rename = (options: {
};
export const renameAsset = (assetPath: string) => {
+ window.sout.tracker("invoked");
const dialog = new Dialog({
title: window.siyuan.languages.rename,
content: `
@@ -137,6 +142,7 @@ export const renameAsset = (assetPath: string) => {
};
export const newFileContentBySelect = (protyle: IProtyle) => {
+ window.sout.tracker("invoked");
if (getSelection().rangeCount === 0) {
return;
}
diff --git a/app/src/editor/util.ts b/app/src/editor/util.ts
index f8e641576e..e4a8273824 100644
--- a/app/src/editor/util.ts
+++ b/app/src/editor/util.ts
@@ -28,6 +28,7 @@ import {Search} from "../search";
import {App} from "../index";
import {newCardModel} from "../card/newCardTab";
import {preventScroll} from "../protyle/scroll/preventScroll";
+import {clearOBG} from "../layout/dock/util";
export const openFileById = async (options: {
app: App,
@@ -40,6 +41,7 @@ export const openFileById = async (options: {
removeCurrentTab?: boolean
afterOpen?: () => void
}) => {
+ window.sout.tracker("invoked");
const response = await fetchSyncPost("/api/block/getBlockInfo", {id: options.id});
if (response.code === -1) {
return;
@@ -65,6 +67,7 @@ export const openFileById = async (options: {
};
export const openAsset = (app: App, assetPath: string, page: number | string, position?: string) => {
+ window.sout.tracker("invoked");
const suffix = pathPosix().extname(assetPath.split("?page")[0]);
if (!Constants.SIYUAN_ASSETS_EXTS.includes(suffix)) {
return;
@@ -79,6 +82,7 @@ export const openAsset = (app: App, assetPath: string, page: number | string, po
};
export const openFile = async (options: IOpenFileOptions) => {
+ window.sout.tracker("invoked");
if (typeof options.removeCurrentTab === "undefined") {
options.removeCurrentTab = true;
}
@@ -86,9 +90,14 @@ export const openFile = async (options: IOpenFileOptions) => {
document.querySelectorAll(".av__panel, .av__mask").forEach(item => {
item.remove();
});
+ // 打开 PDF 时移除文档光标
+ if (document.activeElement instanceof HTMLElement) {
+ document.activeElement.blur();
+ }
const allModels = getAllModels();
// 文档已打开
if (options.assetPath) {
+ clearOBG();
const asset = allModels.asset.find((item) => {
if (item.path === options.assetPath) {
if (!pdfIsLoading(item.parent.parent.element)) {
@@ -106,6 +115,7 @@ export const openFile = async (options: IOpenFileOptions) => {
return asset.parent;
}
} else if (options.custom) {
+ clearOBG();
const custom = allModels.custom.find((item) => {
if (objEquals(item.data, options.custom.data) && (!options.custom.id || options.custom.id === item.type)) {
if (!pdfIsLoading(item.parent.parent.element)) {
@@ -129,6 +139,7 @@ export const openFile = async (options: IOpenFileOptions) => {
return hasModel;
}
} else if (options.searchData) {
+ clearOBG();
const search = allModels.search.find((item) => {
if (objEquals(item.config, options.searchData)) {
if (!pdfIsLoading(item.parent.parent.element)) {
@@ -298,6 +309,7 @@ export const openFile = async (options: IOpenFileOptions) => {
// 没有初始化的页签无法检测到
const getUnInitTab = (options: IOpenFileOptions) => {
+ window.sout.tracker("invoked");
return getAllTabs().find(item => {
const initData = item.headElement?.getAttribute("data-initdata");
if (initData) {
@@ -323,6 +335,7 @@ const getUnInitTab = (options: IOpenFileOptions) => {
};
const switchEditor = (editor: Editor, options: IOpenFileOptions, allModels: IModels) => {
+ window.sout.tracker("invoked");
if (options.keepCursor) {
editor.parent.headElement.setAttribute("keep-cursor", options.id);
return true;
@@ -385,6 +398,7 @@ const switchEditor = (editor: Editor, options: IOpenFileOptions, allModels: IMod
};
const newTab = (options: IOpenFileOptions) => {
+ window.sout.tracker("invoked");
let tab: Tab;
if (options.assetPath) {
const suffix = pathPosix().extname(options.assetPath.split("?page")[0]);
@@ -496,6 +510,7 @@ export const updatePanelByEditor = (options: {
reload: boolean,
resize: boolean
}) => {
+ window.sout.tracker("invoked");
if (options.protyle && options.protyle.path) {
// https://ld246.com/article/1637636106054/comment/1641485541929#comments
if (options.protyle.element.classList.contains("fn__none") ||
@@ -543,21 +558,23 @@ export const updatePanelByEditor = (options: {
};
export const isCurrentEditor = (blockId: string) => {
+ window.sout.tracker("invoked");
const activeElement = document.querySelector(".layout__wnd--active > .fn__flex > .layout-tab-bar > .item--focus");
if (activeElement) {
const tab = getInstanceById(activeElement.getAttribute("data-id"));
if (tab instanceof Tab && tab.model instanceof Editor) {
- if (tab.model.editor.protyle.block.rootID !== blockId &&
- tab.model.editor.protyle.block.parentID !== blockId && // updateBacklinkGraph 时会传入 parentID
- tab.model.editor.protyle.block.id !== blockId) {
- return false;
+ if (tab.model.editor.protyle.block.rootID === blockId ||
+ tab.model.editor.protyle.block.parentID === blockId || // updateBacklinkGraph 时会传入 parentID
+ tab.model.editor.protyle.block.id === blockId) {
+ return true;
}
}
}
- return true;
+ return false;
};
export const updateOutline = (models: IModels, protyle: IProtyle, reload = false) => {
+ window.sout.tracker("invoked");
models.outline.find(item => {
if (reload || (item.type === "pin" && (!protyle || item.blockId !== protyle.block?.rootID))) {
let blockId = "";
@@ -599,6 +616,7 @@ export const updateOutline = (models: IModels, protyle: IProtyle, reload = false
};
export const updateBacklinkGraph = (models: IModels, protyle: IProtyle) => {
+ window.sout.tracker("invoked");
// https://ld246.com/article/1637636106054/comment/1641485541929#comments
if (protyle?.element.classList.contains("fn__none") ||
(protyle && !hasClosestByClassName(protyle.element, "layout__wnd--active") &&
@@ -653,6 +671,7 @@ export const updateBacklinkGraph = (models: IModels, protyle: IProtyle) => {
};
export const openBy = (url: string, type: "folder" | "app") => {
+ window.sout.tracker("invoked");
/// #if !BROWSER
if (url.startsWith("assets/")) {
fetchPost("/api/asset/resolveAssetPath", {path: url.replace(/\.pdf\?page=\d{1,}$/, ".pdf")}, (response) => {
diff --git a/app/src/emoji/index.ts b/app/src/emoji/index.ts
index 57f51fcd15..6eb8bf2b80 100644
--- a/app/src/emoji/index.ts
+++ b/app/src/emoji/index.ts
@@ -12,6 +12,7 @@ import {Dialog} from "../dialog";
import {setPosition} from "../util/setPosition";
export const getRandomEmoji = () => {
+ window.sout.tracker("invoked");
const emojis = window.siyuan.emojis[getRandom(0, window.siyuan.emojis.length - 1)];
if (typeof emojis.items[getRandom(0, emojis.items.length - 1)] === "undefined") {
return "1f600";
@@ -20,6 +21,7 @@ export const getRandomEmoji = () => {
};
export const unicode2Emoji = (unicode: string, className = "", needSpan = false, lazy = false) => {
+ window.sout.tracker("invoked");
if (!unicode) {
return "";
}
@@ -47,6 +49,7 @@ export const unicode2Emoji = (unicode: string, className = "", needSpan = false,
};
export const lazyLoadEmoji = (element: HTMLElement) => {
+ window.sout.tracker("invoked");
const emojiIntersectionObserver = new IntersectionObserver((entries) => {
entries.forEach((entrie: IntersectionObserverEntry & { target: HTMLImageElement }) => {
const index = entrie.target.getAttribute("data-index");
@@ -67,6 +70,7 @@ ${unicode2Emoji(emoji.unicode)}`;
};
export const lazyLoadEmojiImg = (element: Element) => {
+ window.sout.tracker("invoked");
const emojiIntersectionObserver = new IntersectionObserver((entries) => {
entries.forEach((entrie: IntersectionObserverEntry & { target: HTMLImageElement }) => {
const src = entrie.target.getAttribute("data-src");
@@ -82,6 +86,7 @@ export const lazyLoadEmojiImg = (element: Element) => {
};
export const filterEmoji = (key = "", max?: number) => {
+ window.sout.tracker("invoked");
let html = "";
const recentEmojis: {
unicode: string,
@@ -182,6 +187,7 @@ ${unicode2Emoji(emoji[0].unicode, undefined, false, true)}
};
export const addEmoji = (unicode: string) => {
+ window.sout.tracker("invoked");
window.siyuan.config.editor.emoji.unshift(unicode);
if (window.siyuan.config.editor.emoji.length > Constants.SIZE_UNDO) {
window.siyuan.config.editor.emoji.pop();
@@ -192,6 +198,7 @@ export const addEmoji = (unicode: string) => {
};
export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", position: IPosition, avCB?: (emoji: string) => void) => {
+ window.sout.tracker("invoked");
if (type !== "av") {
window.siyuan.menus.menu.remove();
} else {
@@ -474,6 +481,7 @@ ${unicode2Emoji(emoji.unicode)}`;
};
export const updateOutlineEmoji = (unicode: string, id: string) => {
+ window.sout.tracker("invoked");
/// #if !MOBILE
getAllModels().outline.forEach(model => {
if (model.blockId === id) {
@@ -484,6 +492,7 @@ export const updateOutlineEmoji = (unicode: string, id: string) => {
};
export const updateFileTreeEmoji = (unicode: string, id: string, icon = "iconFile") => {
+ window.sout.tracker("invoked");
let emojiElement;
/// #if MOBILE
emojiElement = document.querySelector(`#sidebar [data-type="sidebar-file"] [data-node-id="${id}"] .b3-list-item__icon`);
diff --git a/app/src/history/diff.ts b/app/src/history/diff.ts
index dba832b689..5690fda880 100644
--- a/app/src/history/diff.ts
+++ b/app/src/history/diff.ts
@@ -139,6 +139,7 @@ const renderCompare = (app: App, element: HTMLElement) => {
};
export const showDiff = (app: App, data: { id: string, time: string }[]) => {
+ window.sout.tracker("invoked");
if (data.length !== 2) {
return;
}
@@ -207,6 +208,7 @@ export const showDiff = (app: App, data: { id: string, time: string }[]) => {
};
const genHTML = (left: string, right: string, dialog: Dialog, direct: string) => {
+ window.sout.tracker("invoked");
leftEditor = undefined;
rightEditor = undefined;
const isPhone = isMobile();
diff --git a/app/src/history/doc.ts b/app/src/history/doc.ts
index 983ad0fbe8..5385c598cc 100644
--- a/app/src/history/doc.ts
+++ b/app/src/history/doc.ts
@@ -12,6 +12,7 @@ let historyEditor: Protyle;
let isLoading = false;
const renderDoc = (element: HTMLElement, currentPage: number, id: string) => {
+ window.sout.tracker("invoked");
const previousElement = element.querySelector('[data-type="docprevious"]');
const nextElement = element.querySelector('[data-type="docnext"]');
element.setAttribute("data-page", currentPage.toString());
@@ -60,6 +61,7 @@ export const openDocHistory = (options: {
notebookId: string,
pathString: string
}) => {
+ window.sout.tracker("invoked");
const contentHTML = `
${isMobile() ? "" : options.pathString}
@@ -182,6 +184,7 @@ export const openDocHistory = (options: {
};
const getHistoryPath = (target: Element, op: string, id: string, cb: (path: string) => void) => {
+ window.sout.tracker("invoked");
isLoading = true;
const path = target.getAttribute("data-path");
if (path) {
diff --git a/app/src/history/history.ts b/app/src/history/history.ts
index 8b48f63421..c427019ce5 100644
--- a/app/src/history/history.ts
+++ b/app/src/history/history.ts
@@ -19,6 +19,7 @@ import {App} from "../index";
let historyEditor: Protyle;
const renderDoc = (element: HTMLElement, currentPage: number) => {
+ window.sout.tracker("invoked");
const previousElement = element.querySelector('[data-type="docprevious"]');
const nextElement = element.querySelector('[data-type="docnext"]');
element.setAttribute("data-page", currentPage.toString());
@@ -78,6 +79,7 @@ const renderDoc = (element: HTMLElement, currentPage: number) => {
};
const renderRepoItem = (response: IWebSocketData, element: Element, type: string) => {
+ window.sout.tracker("invoked");
if (response.data.snapshots.length === 0) {
element.lastElementChild.innerHTML = `
${window.siyuan.languages.emptyContent}`;
return;
@@ -220,6 +222,7 @@ ${actionHTML}
};
const renderRepo = (element: Element, currentPage: number) => {
+ window.sout.tracker("invoked");
const selectValue = (element.querySelector(".b3-select") as HTMLSelectElement).value;
element.lastElementChild.innerHTML = '
';
const previousElement = element.querySelector('[data-type="previous"]');
@@ -257,6 +260,7 @@ const renderRepo = (element: Element, currentPage: number) => {
};
const renderRmNotebook = (element: HTMLElement) => {
+ window.sout.tracker("invoked");
element.setAttribute("data-init", "true");
fetchPost("/api/history/getNotebookHistory", {}, (response) => {
if (response.data.histories.length === 0) {
@@ -291,6 +295,7 @@ const renderRmNotebook = (element: HTMLElement) => {
};
export const openHistory = (app: App) => {
+ window.sout.tracker("invoked");
if (window.siyuan.config.readonly) {
return;
}
@@ -433,6 +438,7 @@ export const openHistory = (app: App) => {
};
const bindEvent = (app: App, element: Element, dialog?: Dialog) => {
+ window.sout.tracker("invoked");
const firstPanelElement = element.querySelector("#historyContainer [data-type=doc]") as HTMLElement;
firstPanelElement.querySelectorAll(".b3-select").forEach((itemElement) => {
itemElement.addEventListener("change", () => {
diff --git a/app/src/history/keydown.ts b/app/src/history/keydown.ts
index 5d9d374751..00702f65fc 100644
--- a/app/src/history/keydown.ts
+++ b/app/src/history/keydown.ts
@@ -1,6 +1,7 @@
import {Dialog} from "../dialog";
export const historyKeydown = (event: KeyboardEvent, dialog: Dialog) => {
+ window.sout.tracker("invoked");
let currentItem = dialog.element.querySelector(".history__diff .b3-list-item--focus");
const items = Array.from(dialog.element.querySelectorAll(".history__diff .b3-list-item[data-id]"));
if (items.length < 2) {
diff --git a/app/src/index.ts b/app/src/index.ts
index 9b3efbdca3..a127c2308f 100644
--- a/app/src/index.ts
+++ b/app/src/index.ts
@@ -177,7 +177,6 @@ export class App {
importIDB(r.data).then(() => {
window.Sillot.status.IDBloaded = true;
});});
- await loadPlugins(this);
getLocalStorage(() => {
fetchGet(`/appearance/langs/${window.siyuan.config.appearance.lang}.json?v=${Constants.SIYUAN_VERSION}`, (lauguages: IObject) => {
window.siyuan.languages = lauguages;
@@ -195,6 +194,7 @@ export class App {
});
setNoteBook();
initBlockPopover(this);
+ loadPlugins(this);
}
}
diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts
index a45e842136..0c68bcac6f 100644
--- a/app/src/layout/Wnd.ts
+++ b/app/src/layout/Wnd.ts
@@ -40,6 +40,7 @@ import {newCenterEmptyTab, resizeTabs} from "./tabUtil";
import {fullscreen} from "../protyle/breadcrumb/action";
import {setPadding} from "../protyle/ui/initUI";
import {setPosition} from "../util/setPosition";
+import {clearOBG} from "./dock/util";
export class Wnd {
private app: App;
@@ -497,13 +498,7 @@ export class Wnd {
setPadding(currentTab.model.editor.protyle);
}
} else {
- updatePanelByEditor({
- protyle: undefined,
- focus: false,
- pushBackStack: false,
- reload: false,
- resize,
- });
+ clearOBG();
}
if (isSaveLayout) {
saveLayout();
@@ -721,13 +716,7 @@ export class Wnd {
// 关闭分屏页签后光标消失
const editors = getAllModels().editor;
if (editors.length === 0) {
- updatePanelByEditor({
- protyle: undefined,
- focus: true,
- pushBackStack: false,
- reload: false,
- resize: true,
- });
+ clearOBG();
} else {
editors.forEach(item => {
if (!item.element.classList.contains("fn__none")) {
diff --git a/app/src/layout/dock/Graph.ts b/app/src/layout/dock/Graph.ts
index d1150f35f4..a65ec26172 100644
--- a/app/src/layout/dock/Graph.ts
+++ b/app/src/layout/dock/Graph.ts
@@ -551,6 +551,13 @@ export class Graph extends Model {
clearTimeout(this.timeout);
addScript(`${Constants.PROTYLE_CDN}/js/vis/vis-network.min.js?v=9.1.2`, "protyleVisScript").then(() => {
this.timeout = window.setTimeout(() => {
+ if (!this.graphData || !this.graphData.nodes || this.graphData.nodes.length === 0) {
+ if (this.network) {
+ this.network.destroy();
+ }
+ this.graphElement.firstElementChild.classList.add("fn__none");
+ return;
+ }
this.graphElement.firstElementChild.classList.remove("fn__none");
this.graphElement.firstElementChild.firstElementChild.setAttribute("style", "width:3%");
const config = window.siyuan.config.graph[this.type === "global" ? "global" : "local"];
diff --git a/app/src/layout/dock/Outline.ts b/app/src/layout/dock/Outline.ts
index 05a330d749..352dad3958 100644
--- a/app/src/layout/dock/Outline.ts
+++ b/app/src/layout/dock/Outline.ts
@@ -48,7 +48,7 @@ export class Outline extends Model {
msgCallback(data) {
if (data) {
switch (data.cmd) {
- case "transactions":
+ case "savedoc":
this.onTransaction(data);
break;
case "rename":
@@ -234,10 +234,17 @@ export class Outline extends Model {
}
const documentSelf = document;
documentSelf.ondragstart = () => false;
- let ghostElement: HTMLElement
+ let ghostElement: HTMLElement;
let selectItem: HTMLElement;
+ let editor: IProtyle;
+ getAllModels().editor.find(editItem => {
+ if (editItem.editor.protyle.block.rootID === this.blockId) {
+ editor = editItem.editor.protyle;
+ return true;
+ }
+ });
documentSelf.onmousemove = (moveEvent: MouseEvent) => {
- if (moveEvent.clientY === event.clientY && moveEvent.clientX === event.clientX) {
+ if (!editor || editor.disabled || moveEvent.clientY === event.clientY && moveEvent.clientX === event.clientX || this.element.getAttribute("data-loading") === "true") {
return;
}
moveEvent.preventDefault();
@@ -275,55 +282,52 @@ export class Outline extends Model {
documentSelf.ondragstart = null;
documentSelf.onselectstart = null;
documentSelf.onselect = null;
- ghostElement.remove();
+ ghostElement?.remove();
item.style.opacity = "";
if (!selectItem) {
selectItem = this.element.querySelector(".dragover__top, .dragover__bottom, .dragover");
}
- if (selectItem && selectItem.className.indexOf("dragover") > -1) {
- getAllModels().editor.find(editItem => {
- if (editItem.editor.protyle.block.rootID === this.blockId) {
- let previousID;
- let parentID;
- const undoPreviousID = (item.previousElementSibling && item.previousElementSibling.tagName === "UL") ? item.previousElementSibling.previousElementSibling.getAttribute("data-node-id") : item.previousElementSibling?.getAttribute("data-node-id");
- const undoParentID = item.parentElement.previousElementSibling?.getAttribute("data-node-id");
- if (selectItem.classList.contains("dragover")) {
- parentID = selectItem.getAttribute("data-node-id");
- if (selectItem.nextElementSibling && selectItem.nextElementSibling.tagName === "UL") {
- selectItem.nextElementSibling.insertAdjacentElement("afterbegin", item);
- } else {
- selectItem.insertAdjacentHTML("afterend", `
`);
- item.remove();
- }
- } else if (selectItem.classList.contains("dragover__top")) {
- parentID = selectItem.parentElement.previousElementSibling?.getAttribute("data-node-id");
- if (selectItem.previousElementSibling && selectItem.previousElementSibling.tagName === "UL") {
- previousID = selectItem.previousElementSibling.previousElementSibling.getAttribute("data-node-id");
- } else {
- previousID = selectItem.previousElementSibling?.getAttribute("data-node-id");
- }
- if (previousID === item.dataset.nodeId || parentID === item.dataset.nodeId) {
- return true;
- }
- selectItem.before(item);
- } else if (selectItem.classList.contains("dragover__bottom")) {
- previousID = selectItem.getAttribute("data-node-id");
- selectItem.after(item);
- }
- transaction(editItem.editor.protyle, [{
- action: "moveOutlineHeading",
- id: item.dataset.nodeId,
- previousID,
- parentID,
- }], [{
- action: "moveOutlineHeading",
- id: item.dataset.nodeId,
- previousID: undoPreviousID,
- parentID: undoParentID,
- }]);
+ if (selectItem && selectItem.className.indexOf("dragover") > -1 && editor) {
+ let previousID;
+ let parentID;
+ const undoPreviousID = (item.previousElementSibling && item.previousElementSibling.tagName === "UL") ? item.previousElementSibling.previousElementSibling.getAttribute("data-node-id") : item.previousElementSibling?.getAttribute("data-node-id");
+ const undoParentID = item.parentElement.previousElementSibling?.getAttribute("data-node-id");
+ if (selectItem.classList.contains("dragover")) {
+ parentID = selectItem.getAttribute("data-node-id");
+ if (selectItem.nextElementSibling && selectItem.nextElementSibling.tagName === "UL") {
+ selectItem.nextElementSibling.insertAdjacentElement("afterbegin", item);
+ } else {
+ selectItem.insertAdjacentHTML("afterend", `
`);
+ item.remove();
+ }
+ } else if (selectItem.classList.contains("dragover__top")) {
+ parentID = selectItem.parentElement.previousElementSibling?.getAttribute("data-node-id");
+ if (selectItem.previousElementSibling && selectItem.previousElementSibling.tagName === "UL") {
+ previousID = selectItem.previousElementSibling.previousElementSibling.getAttribute("data-node-id");
+ } else {
+ previousID = selectItem.previousElementSibling?.getAttribute("data-node-id");
+ }
+ if (previousID === item.dataset.nodeId || parentID === item.dataset.nodeId) {
return true;
}
- });
+ selectItem.before(item);
+ } else if (selectItem.classList.contains("dragover__bottom")) {
+ previousID = selectItem.getAttribute("data-node-id");
+ selectItem.after(item);
+ }
+ this.element.setAttribute("data-loading", "true");
+ transaction(editor, [{
+ action: "moveOutlineHeading",
+ id: item.dataset.nodeId,
+ previousID,
+ parentID,
+ }], [{
+ action: "moveOutlineHeading",
+ id: item.dataset.nodeId,
+ previousID: undoPreviousID,
+ parentID: undoParentID,
+ }]);
+ return true;
}
this.element.querySelectorAll(".dragover__top, .dragover__bottom, .dragover").forEach(item => {
item.classList.remove("dragover__top", "dragover__bottom", "dragover");
@@ -353,11 +357,12 @@ export class Outline extends Model {
}
private onTransaction(data: IWebSocketData) {
- if (this.isPreview) {
+ if (this.isPreview || data.data.rootID !== this.blockId) {
return;
}
let needReload = false;
- data.data[0].doOperations.forEach((item: IOperation) => {
+ const ops = data.data.sources[0];
+ ops.doOperations.forEach((item: IOperation) => {
if ((item.action === "update" || item.action === "insert") &&
(item.data.indexOf('data-type="NodeHeading"') > -1 || item.data.indexOf(`
`) > -1)) {
needReload = true;
@@ -365,8 +370,8 @@ export class Outline extends Model {
needReload = true;
}
});
- if (data.data[0].undoOperations) {
- data.data[0].undoOperations.forEach((item: IOperation) => {
+ if (ops.undoOperations) {
+ ops.undoOperations.forEach((item: IOperation) => {
if (item.action === "update" && item.data.indexOf('data-type="NodeHeading"') > -1) {
needReload = true;
}
@@ -469,5 +474,6 @@ export class Outline extends Model {
currentElement.classList.add("b3-list-item--focus");
}
}
+ this.element.removeAttribute("data-loading");
}
}
diff --git a/app/src/layout/dock/util.ts b/app/src/layout/dock/util.ts
index 91669de4f3..9a78d86836 100644
--- a/app/src/layout/dock/util.ts
+++ b/app/src/layout/dock/util.ts
@@ -16,6 +16,7 @@ export const openBacklink = async (options: {
title?: string,
useBlockId?: boolean,
}) => {
+ window.sout.tracker("invoked");
const backlink = getAllModels().backlink.find(item => {
if (item.blockId === options.blockId && item.type === "local") {
item.parent.parent.removeTab(item.parent.id);
@@ -72,6 +73,7 @@ export const openGraph = async (options: {
title?: string,
useBlockId?: boolean,
}) => {
+ window.sout.tracker("invoked");
const graph = getAllModels().graph.find(item => {
if (item.blockId === options.blockId && item.type === "local") {
item.parent.parent.removeTab(item.parent.id);
@@ -121,6 +123,7 @@ export const openGraph = async (options: {
};
export const openOutline = async (protyle: IProtyle) => {
+ window.sout.tracker("invoked");
const outlinePanel = getAllModels().outline.find(item => {
if (item.blockId === protyle.block.rootID && item.type === "local") {
item.parent.parent.removeTab(item.parent.id);
@@ -167,6 +170,7 @@ export const openOutline = async (protyle: IProtyle) => {
};
export const resetFloatDockSize = () => {
+ window.sout.tracker("invoked");
if (!window.siyuan.layout.leftDock.pin && window.siyuan.layout.leftDock.layout.element.style.opacity === "1") {
window.siyuan.layout.leftDock.showDock(true);
}
@@ -179,6 +183,7 @@ export const resetFloatDockSize = () => {
};
export const toggleDockBar = (useElement: Element) => {
+ window.sout.tracker("invoked");
const dockIsShow = useElement.getAttribute("xlink:href") === "#iconHideDock";
if (dockIsShow) {
useElement.setAttribute("xlink:href", "#iconDock");
@@ -196,3 +201,41 @@ export const toggleDockBar = (useElement: Element) => {
resizeTabs();
resetFloatDockSize();
};
+
+export const clearOBG = () => {
+ const models = getAllModels();
+ models.outline.find(item => {
+ if (item.type === "pin") {
+ if ("" === item.blockId) {
+ return;
+ }
+ item.isPreview = false;
+ item.update({data: [], msg: "", code: 0}, "");
+ item.updateDocTitle();
+ }
+ });
+ models.graph.forEach(item => {
+ if (item.type !== "global") {
+ if (item.type === "local") {
+ return;
+ }
+ if ("" === item.blockId) {
+ return;
+ }
+ item.blockId = "";
+ item.graphData = undefined;
+ item.onGraph(false);
+ }
+ });
+ models.backlink.forEach(item => {
+ if (item.type === "local") {
+ return;
+ }
+ if ("" === item.blockId) {
+ return;
+ }
+ item.saveStatus();
+ item.blockId = "";
+ item.render(undefined);
+ });
+};
diff --git a/app/src/layout/getAll.ts b/app/src/layout/getAll.ts
index ef51f90368..c7e69a712f 100644
--- a/app/src/layout/getAll.ts
+++ b/app/src/layout/getAll.ts
@@ -14,6 +14,7 @@ import {Protyle} from "../protyle";
import {Wnd} from "./Wnd";
export const getAllEditor = () => {
+ window.sout.tracker("invoked");
const models = getAllModels();
const editors: Protyle[] = [];
models.editor.forEach(item => {
@@ -49,6 +50,7 @@ export const getAllEditor = () => {
};
export const getAllModels = () => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
const models: IModels = {
editor: [],
graph: [],
@@ -101,6 +103,7 @@ export const getAllModels = () => {
};
export const getAllWnds = (layout: Layout, wnds: Wnd[]) => {
+ window.sout.tracker("invoked");
for (let i = 0; i < layout.children.length; i++) {
const item = layout.children[i];
if (item instanceof Wnd) {
@@ -112,6 +115,7 @@ export const getAllWnds = (layout: Layout, wnds: Wnd[]) => {
};
export const getAllTabs = () => {
+ window.sout.tracker("invoked");
const tabs: Tab[] = [];
const getTabs = (layout: Layout) => {
for (let i = 0; i < layout.children.length; i++) {
@@ -131,6 +135,7 @@ export const getAllTabs = () => {
};
export const getAllDocks = () => {
+ window.sout.tracker("invoked");
const docks: Config.IUILayoutDockTab[] = [];
window.siyuan.config.uiLayout.left.data.forEach((item) => {
item.forEach((dock) => {
diff --git a/app/src/layout/status.ts b/app/src/layout/status.ts
index f43f1608a7..394b2644e3 100644
--- a/app/src/layout/status.ts
+++ b/app/src/layout/status.ts
@@ -12,8 +12,10 @@ import {Constants} from "../constants";
import {toggleDockBar} from "./dock/util";
import SillotDrawer from "./SillotDrawer";
import {updateHotkeyTip} from "../protyle/util/compatibility";
+import {isPadAppMode} from "sofill/env"
export const initStatus = (isWindow = false) => {
+ window.sout.tracker("invoked");
/// #if !MOBILE
let barDockHTML = "";
if (!isWindow) {
@@ -73,7 +75,7 @@ export const initStatus = (isWindow = false) => {
window.siyuan.menus.menu.remove();
window.siyuan.menus.menu.element.setAttribute("data-name", "statusHelp");
window.siyuan.menus.menu.append(new MenuItem({
- label: window.siyuan.languages.help,
+ label: window.siyuan.languages.userGuide,
icon: "iconHelp",
click: () => {
mountHelp();
@@ -83,10 +85,12 @@ export const initStatus = (isWindow = false) => {
label: window.siyuan.languages.feedback,
icon: "iconFeedback",
click: () => {
- if ("zh_CN" === window.siyuan.config.lang || "zh_CHT" === window.siyuan.config.lang) {
- window.open("https://ld246.com/article/1649901726096");
+ if (isPadAppMode()) {
+ window.open('siyuan://androidFeedback', '_blank');
+ } else if ("zh_CN" === window.siyuan.config.lang || "zh_CHT" === window.siyuan.config.lang) {
+ window.open("https://ld246.com/member/soltus");
} else {
- window.open("https://liuyun.io/article/1686530886208");
+ window.open("https://liuyun.io/member/soltus");
}
}
}).element);
@@ -143,6 +147,7 @@ export const initStatus = (isWindow = false) => {
let countRootId: string;
let countTimeout: number;
export const countSelectWord = (range: Range, rootID?: string) => {
+ window.sout.tracker("invoked");
/// #if !MOBILE
if (document.getElementById("status").classList.contains("fn__none")) {
return;
@@ -166,6 +171,7 @@ export const countSelectWord = (range: Range, rootID?: string) => {
};
export const countBlockWord = (ids: string[], rootID?: string, clearCache = false) => {
+ window.sout.tracker("invoked");
/// #if !MOBILE
if (document.getElementById("status").classList.contains("fn__none")) {
return;
@@ -191,6 +197,7 @@ export const countBlockWord = (ids: string[], rootID?: string, clearCache = fals
};
export const clearCounter = () => {
+ window.sout.tracker("invoked");
countRootId = "";
document.querySelector("#status .status__counter").innerHTML = "";
clearTimeout(countTimeout);
@@ -203,6 +210,7 @@ export const renderStatusbarCounter = (stat: {
imageCount: number,
refCount: number
}) => {
+ window.sout.tracker("invoked");
if(!stat) {
return;
}
diff --git a/app/src/layout/tabUtil.ts b/app/src/layout/tabUtil.ts
index 796c79bbdd..4c247ad2ac 100644
--- a/app/src/layout/tabUtil.ts
+++ b/app/src/layout/tabUtil.ts
@@ -25,6 +25,7 @@ import {mountHelp, newNotebook} from "../util/mount";
import {Constants} from "../constants";
export const getActiveTab = (wndActive = true) => {
+ window.sout.tracker("invoked");
const activeTabElement = document.querySelector(".layout__wnd--active .item--focus");
let tab;
if (activeTabElement) {
@@ -41,6 +42,7 @@ export const getActiveTab = (wndActive = true) => {
};
export const switchTabByIndex = (index: number) => {
+ window.sout.tracker("invoked");
const activeDockIcoElement = document.querySelector(".dock .dock__item--activefocus");
if (activeDockIcoElement) {
let indexElement = activeDockIcoElement.parentElement.children[index];
@@ -100,6 +102,7 @@ export const switchTabByIndex = (index: number) => {
let resizeTimeout: number;
export const resizeTabs = (isSaveLayout = true) => {
+ window.sout.tracker("invoked");
clearTimeout(resizeTimeout);
// .layout .fn__flex-shrink {width .15s cubic-bezier(0, 0, .2, 1) 0ms} 时需要再次计算 padding
// PDF 避免分屏多次调用后,页码跳转到1 https://github.com/siyuan-note/siyuan/issues/5646
@@ -143,6 +146,7 @@ export const resizeTabs = (isSaveLayout = true) => {
};
export const getDockByType = (type: string) => {
+ window.sout.tracker("invoked");
if (!window.siyuan.layout.leftDock) {
return undefined;
}
@@ -158,6 +162,7 @@ export const getDockByType = (type: string) => {
};
export const newCenterEmptyTab = (app: App) => {
+ window.sout.tracker("invoked");
return new Tab({
panel: `
@@ -194,7 +199,7 @@ export const newCenterEmptyTab = (app: App) => {
- ${window.siyuan.languages.help}
+ ${window.siyuan.languages.userGuide}
`,
callback(tab: Tab) {
@@ -246,6 +251,7 @@ export const newCenterEmptyTab = (app: App) => {
};
export const copyTab = (app: App, tab: Tab) => {
+ window.sout.tracker("invoked");
return new Tab({
icon: tab.icon,
docIcon: tab.docIcon,
@@ -335,6 +341,7 @@ export const copyTab = (app: App, tab: Tab) => {
};
export const closeTabByType = async (tab: Tab, type: "closeOthers" | "closeAll" | "other", tabs?: Tab[]) => {
+ window.sout.tracker("invoked");
if (type === "closeOthers") {
for (let index = 0; index < tab.parent.children.length; index++) {
if (tab.parent.children[index].id !== tab.id && !tab.parent.children[index].headElement.classList.contains("item--pin")) {
diff --git a/app/src/layout/topBar.ts b/app/src/layout/topBar.ts
index 4e3ea3b028..8222017b5a 100644
--- a/app/src/layout/topBar.ts
+++ b/app/src/layout/topBar.ts
@@ -22,6 +22,7 @@ import {commandPanel} from "../plugin/commandPanel";
import {exportLayout} from "./util";
export const initBar = (app: App) => {
+ window.sout.tracker("invoked");
const toolbarElement = document.getElementById("toolbar");
toolbarElement.innerHTML = `
@@ -254,6 +255,7 @@ export const initBar = (app: App) => {
};
export const setZoom = (type: "zoomIn" | "zoomOut" | "restore") => {
+ window.sout.tracker("invoked");
/// #if !BROWSER
const isTabWindow = isWindow();
let zoom = 1;
@@ -293,6 +295,7 @@ export const setZoom = (type: "zoomIn" | "zoomOut" | "restore") => {
};
const openPlugin = (app: App, target: Element) => {
+ window.sout.tracker("invoked");
const menu = new Menu("topBarPlugin");
if (!isHuawei()) {
menu.addItem({
diff --git a/app/src/layout/util.ts b/app/src/layout/util.ts
index 036ba3fc2a..0cc1dbdd4b 100644
--- a/app/src/layout/util.ts
+++ b/app/src/layout/util.ts
@@ -36,6 +36,7 @@ import { newCenterEmptyTab, resizeTabs } from "./tabUtil";
import { setStorageVal } from "../protyle/util/compatibility";
export const setPanelFocus = (element: Element) => {
+ window.sout.tracker("invoked");
if (element.getAttribute("data-type") === "wnd") {
setTitle(element.querySelector('.layout-tab-bar .item--focus[data-type="tab-header"] .item__text')?.textContent || window.siyuan.languages.siyuanNote);
}
@@ -72,6 +73,7 @@ export const setPanelFocus = (element: Element) => {
};
export const switchWnd = (newWnd: Wnd, targetWnd: Wnd) => {
+ window.sout.tracker("invoked");
// DOM 移动后 range 会变化
const rangeDatas: {
id: string,
@@ -123,6 +125,7 @@ export const switchWnd = (newWnd: Wnd, targetWnd: Wnd) => {
};
export const getWndByLayout: (layout: Layout) => Wnd = (layout: Layout) => {
+ window.sout.tracker("invoked");
for (let i = 0; i < layout.children.length; i++) {
const item = layout.children[i];
if (item instanceof Wnd) {
@@ -134,6 +137,7 @@ export const getWndByLayout: (layout: Layout) => Wnd = (layout: Layout) => {
};
const dockToJSON = (dock: Dock) => {
+ window.sout.tracker("invoked");
const json = [];
const subDockToJSON = (index: number) => {
const data: Config.IUILayoutDockTab[] = [];
@@ -169,6 +173,7 @@ const dockToJSON = (dock: Dock) => {
};
export const resetLayout = () => {
+ window.sout.tracker("invoked");
fetchPost("/api/system/setUILayout", { layout: {} }, () => {
window.siyuan.storage[Constants.LOCAL_FILEPOSITION] = {};
setStorageVal(Constants.LOCAL_FILEPOSITION, window.siyuan.storage[Constants.LOCAL_FILEPOSITION]);
@@ -180,6 +185,7 @@ export const resetLayout = () => {
let saveCount = 0;
export const saveLayout = () => {
+ window.sout.tracker("invoked");
const breakObj = {};
let layoutJSON: any = {};
if (isWindow()) {
@@ -223,6 +229,7 @@ export const exportLayout = (options: {
cb: () => void,
errorExit: boolean
}) => {
+ window.sout.tracker("invoked");
if (isWindow()) {
const layoutJSON: any = {
layout: {},
@@ -259,6 +266,7 @@ export const exportLayout = (options: {
};
export const getAllLayout = () => {
+ window.sout.tracker("invoked");
const layoutJSON: any = {
hideDock: document.querySelector("#barDock use").getAttribute("xlink:href") === "#iconDock",
layout: {},
@@ -271,6 +279,7 @@ export const getAllLayout = () => {
};
const initInternalDock = (dockItem: Config.IUILayoutDockTab[]) => {
+ window.sout.tracker("invoked");
dockItem.forEach((existSubItem) => {
if (existSubItem.hotkeyLangId) {
existSubItem.title = window.siyuan.languages[existSubItem.hotkeyLangId];
@@ -280,6 +289,7 @@ const initInternalDock = (dockItem: Config.IUILayoutDockTab[]) => {
};
const JSONToDock = (json: any, app: App) => {
+ window.sout.tracker("invoked");
json.left.data.forEach((existItem: Config.IUILayoutDockTab[]) => {
initInternalDock(existItem);
});
@@ -300,6 +310,7 @@ export const JSONToCenter = (
json: Config.TUILayoutItem,
layout?: Layout | Wnd | Tab | Model,
) => {
+ window.sout.tracker("invoked");
let child: Layout | Wnd | Tab | Model;
if (json.instance === "Layout") {
if (!layout) {
@@ -424,6 +435,7 @@ export const JSONToCenter = (
};
export const JSONToLayout = (app: App, isStart: boolean) => {
+ window.sout.tracker("invoked");
JSONToCenter(app, window.siyuan.config.uiLayout.layout, undefined);
JSONToDock(window.siyuan.config.uiLayout, app);
// 启动时不打开页签,需要移除没有钉住的页签
@@ -494,6 +506,7 @@ export const JSONToLayout = (app: App, isStart: boolean) => {
};
export const layoutToJSON = (layout: Layout | Wnd | Tab | Model, json: any, breakObj?: IObject) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
if (layout instanceof Layout) {
json.direction = layout.direction;
if (layout.parent) {
@@ -629,6 +642,7 @@ export const layoutToJSON = (layout: Layout | Wnd | Tab | Model, json: any, brea
};
export const resizeTopBar = () => {
+ window.sout.tracker("invoked");
const toolbarElement = document.querySelector("#toolbar");
if (!toolbarElement) {
return;
@@ -689,6 +703,7 @@ export const resizeTopBar = () => {
};
export const newModelByInitData = (app: App, tab: Tab, json: any) => {
+ window.sout.tracker("invoked");
let model: Model;
if (json.instance === "Custom") {
if (json.customModelType === "siyuan-card") {
@@ -722,6 +737,7 @@ export const newModelByInitData = (app: App, tab: Tab, json: any) => {
};
export const pdfIsLoading = (element: HTMLElement) => {
+ window.sout.tracker("invoked");
const isLoading = element.querySelector('.layout-tab-container > [data-loading="true"]') ? true : false;
if (isLoading) {
showMessage(window.siyuan.languages.pdfIsLoading);
@@ -730,6 +746,7 @@ export const pdfIsLoading = (element: HTMLElement) => {
};
export const getInstanceById = (id: string, layout = window.siyuan.layout.centerLayout) => {
+ window.sout.tracker("invoked");
const _getInstanceById = (item: Layout | Wnd, id: string) => {
if (item.id === id) {
return item;
@@ -749,6 +766,7 @@ export const getInstanceById = (id: string, layout = window.siyuan.layout.center
};
export const addResize = (obj: Layout | Wnd) => {
+ window.sout.tracker("invoked");
if (!obj.resize) {
return;
}
@@ -875,6 +893,7 @@ export const addResize = (obj: Layout | Wnd) => {
};
export const adjustLayout = (layout: Layout = window.siyuan.layout.centerLayout.parent) => {
+ window.sout.tracker("invoked");
layout.children.forEach((item: Layout | Wnd) => {
item.element.style.maxWidth = "";
if (!item.element.style.width && !item.element.classList.contains("layout__center")) {
diff --git a/app/src/menus/Menu.ts b/app/src/menus/Menu.ts
index bf434f5b02..461c92f4e1 100644
--- a/app/src/menus/Menu.ts
+++ b/app/src/menus/Menu.ts
@@ -6,6 +6,7 @@ import {Constants} from "../constants";
export class Menu {
public element: HTMLElement;
+ public data: any; // 用于记录当前菜单的数据
public removeCB: () => void;
private wheelEvent: string;
@@ -111,6 +112,7 @@ export class Menu {
this.element.removeAttribute("style"); // zIndex
window.siyuan.menus.menu.element.removeAttribute("data-name"); // 标识再次点击不消失
window.siyuan.menus.menu.element.removeAttribute("data-from"); // 标识是否在浮窗内打开
+ window.siyuan.menus.menu.data = undefined; // 移除数据
}
public append(element?: HTMLElement, index?: number) {
diff --git a/app/src/menus/block.ts b/app/src/menus/block.ts
index e8dd19ec87..ce5c097058 100644
--- a/app/src/menus/block.ts
+++ b/app/src/menus/block.ts
@@ -5,6 +5,7 @@ import {fetchPost} from "../util/fetch";
import {Constants} from "../constants";
export const transferBlockRef = (id: string) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.transferBlockRef,
icon: "iconScrollHoriz",
diff --git a/app/src/menus/bookmark.ts b/app/src/menus/bookmark.ts
index e16ad77982..2801dc1409 100644
--- a/app/src/menus/bookmark.ts
+++ b/app/src/menus/bookmark.ts
@@ -10,6 +10,7 @@ import {MobileBookmarks} from "../mobile/dock/MobileBookmarks";
import {Constants} from "../constants";
export const openBookmarkMenu = (element: HTMLElement, event: MouseEvent, bookmarkObj: Bookmark | MobileBookmarks) => {
+ window.sout.tracker("invoked");
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
window.siyuan.menus.menu.element.getAttribute("data-name") === "bookmarkMenu") {
window.siyuan.menus.menu.remove();
diff --git a/app/src/menus/commonMenuItem.ts b/app/src/menus/commonMenuItem.ts
index 8400866e01..278bfb12c2 100644
--- a/app/src/menus/commonMenuItem.ts
+++ b/app/src/menus/commonMenuItem.ts
@@ -33,6 +33,7 @@ const bindAttrInput = (inputElement: HTMLInputElement, id: string) => {
};
export const openWechatNotify = (nodeElement: Element) => {
+ window.sout.tracker("invoked");
const id = nodeElement.getAttribute("data-node-id");
const range = getEditorRange(nodeElement);
const reminder = nodeElement.getAttribute(Constants.CUSTOM_REMINDER_WECHAT);
@@ -98,6 +99,7 @@ export const openWechatNotify = (nodeElement: Element) => {
};
export const openFileWechatNotify = (protyle: IProtyle) => {
+ window.sout.tracker("invoked");
fetchPost("/api/block/getDocInfo", {
id: protyle.block.rootID
}, (response) => {
@@ -154,6 +156,7 @@ export const openFileWechatNotify = (protyle: IProtyle) => {
};
export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: IProtyle) => {
+ window.sout.tracker("invoked");
let customHTML = "";
let notifyHTML = "";
let hasAV = false;
@@ -177,7 +180,7 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
-
+
`;
}
});
@@ -210,22 +213,22 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
-
+
${notifyHTML}
@@ -307,7 +310,7 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
} else if (type === "addCustom") {
const addDialog = new Dialog({
title: window.siyuan.languages.attrName,
- content: `
+ content: `
@@ -336,7 +339,7 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
-
+
`);
const valueElement = target.parentElement.previousElementSibling.querySelector(".b3-text-field") as HTMLInputElement;
valueElement.focus();
@@ -362,6 +365,7 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
};
export const openAttr = (nodeElement: Element, focusName = "bookmark", protyle?: IProtyle) => {
+ window.sout.tracker("invoked");
if (nodeElement.getAttribute("data-type") === "NodeThematicBreak") {
return;
}
@@ -372,6 +376,7 @@ export const openAttr = (nodeElement: Element, focusName = "bookmark", protyle?:
};
export const copySubMenu = (id: string, accelerator = true, focusElement?: Element) => {
+ window.sout.tracker("invoked");
return [{
icon: "iconRef",
accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyBlockRef.custom : undefined,
@@ -438,6 +443,7 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme
};
export const exportMd = (id: string) => {
+ window.sout.tracker("invoked");
return new MenuItem({
label: window.siyuan.languages.export,
type: "submenu",
@@ -680,6 +686,7 @@ export const exportMd = (id: string) => {
};
export const openMenu = (app: App, src: string, onlyMenu: boolean, showAccelerator: boolean) => {
+ window.sout.tracker("invoked");
const submenu = [];
/// #if MOBILE
submenu.push({
@@ -784,7 +791,7 @@ export const openMenu = (app: App, src: string, onlyMenu: boolean, showAccelerat
accelerator: showAccelerator ? "Click" : "",
click: () => {
const uri = src.startsWith("/") ? "" : "/" + src;
- console.log(uri);
+ window.sout.log(uri);
openByMobile(uri);
}
});
@@ -807,6 +814,7 @@ export const renameMenu = (options: {
name: string,
type: "notebook" | "file"
}) => {
+ window.sout.tracker("invoked");
return new MenuItem({
accelerator: window.siyuan.config.keymap.editor.general.rename.custom,
icon: "iconEdit",
@@ -818,6 +826,7 @@ export const renameMenu = (options: {
};
export const movePathToMenu = (paths: string[]) => {
+ window.sout.tracker("invoked");
return new MenuItem({
label: window.siyuan.languages.move,
icon: "iconMove",
diff --git a/app/src/menus/dock.ts b/app/src/menus/dock.ts
index 844903966d..e2d7b6a6e1 100644
--- a/app/src/menus/dock.ts
+++ b/app/src/menus/dock.ts
@@ -2,6 +2,7 @@ import {MenuItem} from "./Menu";
import {saveLayout} from "../layout/util";
const moveMenuItem = (label: string, target: Element) => {
+ window.sout.tracker("invoked");
return new MenuItem({
label: window.siyuan.languages[label],
icon: label.replace("moveTo", "icon"),
@@ -19,6 +20,7 @@ const moveMenuItem = (label: string, target: Element) => {
};
export const initDockMenu = (target: Element) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
window.siyuan.menus.menu.append(moveMenuItem("moveToLeftTop", target).element);
window.siyuan.menus.menu.append(moveMenuItem("moveToLeftBottom", target).element);
diff --git a/app/src/menus/navigation.ts b/app/src/menus/navigation.ts
index 5eb1904bb4..9dd3808a96 100644
--- a/app/src/menus/navigation.ts
+++ b/app/src/menus/navigation.ts
@@ -31,6 +31,7 @@ import {emitOpenMenu} from "../plugin/EventBus";
import {openByMobile} from "../protyle/util/compatibility";
const initMultiMenu = (selectItemElements: NodeListOf
, app: App) => {
+ window.sout.tracker("invoked");
const fileItemElement = Array.from(selectItemElements).find(item => {
if (item.getAttribute("data-type") === "navigation-file") {
return true;
@@ -79,7 +80,7 @@ const initMultiMenu = (selectItemElements: NodeListOf, app: App) => {
}
}, {
iconHTML: "",
- label: `${window.siyuan.languages.cancel} ${window.siyuan.languages.quickMakeCard}`,
+ label: window.siyuan.languages.removeCard,
click: () => {
transaction(undefined, [{
action: "removeFlashcards",
@@ -121,6 +122,7 @@ const initMultiMenu = (selectItemElements: NodeListOf, app: App) => {
};
export const initNavigationMenu = (app: App, liElement: HTMLElement) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
const fileElement = hasClosestByTag(liElement, "DIV");
if (!fileElement) {
@@ -355,6 +357,7 @@ export const initNavigationMenu = (app: App, liElement: HTMLElement) => {
};
export const initFileMenu = (app: App, notebookId: string, pathString: string, liElement: Element) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
const fileElement = hasClosestByTag(liElement, "DIV");
if (!fileElement) {
@@ -509,7 +512,7 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l
}
}, {
iconHTML: "",
- label: `${window.siyuan.languages.cancel} ${window.siyuan.languages.quickMakeCard}`,
+ label: window.siyuan.languages.removeCard,
click: () => {
transaction(undefined, [{
action: "removeFlashcards",
@@ -638,6 +641,7 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l
};
export const genImportMenu = (notebookId: string, pathString: string) => {
+ window.sout.tracker("invoked");
if (window.siyuan.config.readonly) {
return;
}
@@ -716,6 +720,7 @@ export const genImportMenu = (notebookId: string, pathString: string) => {
};
export const sortMenu = (type: "notebooks" | "notebook", sortMode: number, clickEvent: (sort: number) => void) => {
+ window.sout.tracker("invoked");
const sortMenu: IMenu[] = [{
icon: sortMode === 0 ? "iconSelect" : undefined,
label: window.siyuan.languages.fileNameASC,
diff --git a/app/src/menus/onGetnotebookconf.ts b/app/src/menus/onGetnotebookconf.ts
index 01112e0f5c..57beaa6ee7 100644
--- a/app/src/menus/onGetnotebookconf.ts
+++ b/app/src/menus/onGetnotebookconf.ts
@@ -19,6 +19,7 @@ declare interface INotebookConf {
}
export const onGetnotebookconf = (data: INotebookConf) => {
+ window.sout.tracker("invoked");
const titleHTML = `${escapeHtml(data.name)}
`;
@@ -69,6 +70,7 @@ export const onGetnotebookconf = (data: INotebookConf) => {
};
const bindSettingEvent = (contentElement: Element, data: INotebookConf) => {
+ window.sout.tracker("invoked");
contentElement.querySelector(".b3-button--small").addEventListener("click", () => {
writeText(data.box);
showMessage(window.siyuan.languages.copied);
diff --git a/app/src/menus/protyle.ts b/app/src/menus/protyle.ts
index 17a2c1cda0..a46a490506 100644
--- a/app/src/menus/protyle.ts
+++ b/app/src/menus/protyle.ts
@@ -58,6 +58,7 @@ import {Menu} from "../plugin/Menu";
import {getFirstBlock} from "../protyle/wysiwyg/getBlock";
const renderAssetList = (element: Element, k: string, position: IPosition, exts: string[] = []) => {
+ window.sout.tracker("invoked");
fetchPost("/api/search/searchAsset", {
k,
exts
@@ -88,6 +89,7 @@ const renderAssetList = (element: Element, k: string, position: IPosition, exts:
};
export const assetMenu = (protyle: IProtyle, position: IPosition, callback?: (url: string, name: string) => void, exts?: string[]) => {
+ window.sout.tracker("invoked");
const menu = new Menu("background-asset");
if (menu.isOpen) {
return;
@@ -199,6 +201,7 @@ export const assetMenu = (protyle: IProtyle, position: IPosition, callback?: (ur
};
export const fileAnnotationRefMenu = (protyle: IProtyle, refElement: HTMLElement) => {
+ window.sout.tracker("invoked");
const nodeElement = hasClosestBlock(refElement);
if (!nodeElement) {
return;
@@ -314,6 +317,7 @@ export const fileAnnotationRefMenu = (protyle: IProtyle, refElement: HTMLElement
};
export const refMenu = (protyle: IProtyle, element: HTMLElement) => {
+ window.sout.tracker("invoked");
const nodeElement = hasClosestBlock(element);
if (!nodeElement) {
return;
@@ -604,6 +608,7 @@ export const refMenu = (protyle: IProtyle, element: HTMLElement) => {
h: 26
});
const popoverElement = hasTopClosestByClassName(protyle.element, "block__popover", true);
+ window.siyuan.menus.menu.data = element;
window.siyuan.menus.menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app");
if (!protyle.disabled) {
window.siyuan.menus.menu.element.querySelector("input").select();
@@ -623,6 +628,7 @@ export const refMenu = (protyle: IProtyle, element: HTMLElement) => {
};
export const contentMenu = (protyle: IProtyle, nodeElement: Element) => {
+ window.sout.tracker("invoked");
const range = getEditorRange(nodeElement);
window.siyuan.menus.menu.remove();
/// #if MOBILE
@@ -756,6 +762,7 @@ export const contentMenu = (protyle: IProtyle, nodeElement: Element) => {
};
export const enterBack = (protyle: IProtyle, id: string) => {
+ window.sout.tracker("invoked");
if (!protyle.block.showAll) {
const ids = protyle.path.split("/");
if (ids.length > 2) {
@@ -782,6 +789,7 @@ export const zoomOut = (options: {
callback?: () => void,
reload?: boolean
}) => {
+ window.sout.tracker("invoked");
if (options.protyle.options.backlinkData) {
return;
}
@@ -886,6 +894,7 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme
clientX: number,
clientY: number
}) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
const nodeElement = hasClosestBlock(assetElement);
if (!nodeElement) {
@@ -1115,6 +1124,7 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme
};
export const linkMenu = (protyle: IProtyle, linkElement: HTMLElement, focusText = false) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
const nodeElement = hasClosestBlock(linkElement);
if (!nodeElement) {
@@ -1322,6 +1332,7 @@ export const linkMenu = (protyle: IProtyle, linkElement: HTMLElement, focusText
};
export const tagMenu = (protyle: IProtyle, tagElement: HTMLElement) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
const nodeElement = hasClosestBlock(tagElement);
if (!nodeElement) {
@@ -1437,6 +1448,7 @@ export const tagMenu = (protyle: IProtyle, tagElement: HTMLElement) => {
};
const genImageWidthMenu = (label: string, assetElement: HTMLElement, imgElement: HTMLElement, protyle: IProtyle, id: string, nodeElement: HTMLElement, html: string) => {
+ window.sout.tracker("invoked");
return {
iconHTML: "",
label,
@@ -1460,6 +1472,7 @@ const genImageWidthMenu = (label: string, assetElement: HTMLElement, imgElement:
};
export const iframeMenu = (protyle: IProtyle, nodeElement: Element) => {
+ window.sout.tracker("invoked");
const id = nodeElement.getAttribute("data-node-id");
const iframeElement = nodeElement.querySelector("iframe");
let html = nodeElement.outerHTML;
@@ -1530,6 +1543,7 @@ export const iframeMenu = (protyle: IProtyle, nodeElement: Element) => {
};
export const videoMenu = (protyle: IProtyle, nodeElement: Element, type: string) => {
+ window.sout.tracker("invoked");
const id = nodeElement.getAttribute("data-node-id");
const videoElement = nodeElement.querySelector(type === "NodeVideo" ? "video" : "audio");
let html = nodeElement.outerHTML;
@@ -1575,6 +1589,7 @@ export const videoMenu = (protyle: IProtyle, nodeElement: Element, type: string)
};
export const tableMenu = (protyle: IProtyle, nodeElement: Element, cellElement: HTMLTableCellElement, range: Range) => {
+ window.sout.tracker("invoked");
const menus: IMenu[] = [];
const colIndex = getColIndex(cellElement);
if (cellElement.rowSpan > 1 || cellElement.colSpan > 1) {
@@ -1875,6 +1890,7 @@ export const tableMenu = (protyle: IProtyle, nodeElement: Element, cellElement:
};
export const setFold = (protyle: IProtyle, nodeElement: Element, isOpen?: boolean, isRemove?: boolean) => {
+ window.sout.tracker("invoked");
if (nodeElement.getAttribute("data-type") === "NodeListItem" && nodeElement.childElementCount < 4) {
// 没有子列表或多个块的列表项不进行折叠
return -1;
diff --git a/app/src/menus/search.ts b/app/src/menus/search.ts
index 1f0eab4b55..17281dfc50 100644
--- a/app/src/menus/search.ts
+++ b/app/src/menus/search.ts
@@ -2,6 +2,7 @@ import {MenuItem} from "./Menu";
import {copySubMenu} from "./commonMenuItem";
export const initSearchMenu = (id: string) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.copy,
diff --git a/app/src/menus/tab.ts b/app/src/menus/tab.ts
index d21b696652..f0148cc3f0 100644
--- a/app/src/menus/tab.ts
+++ b/app/src/menus/tab.ts
@@ -12,6 +12,7 @@ import {Wnd} from "../layout/Wnd";
import {getAllWnds} from "../layout/getAll";
const closeMenu = (tab: Tab) => {
+ window.sout.tracker("invoked");
const unmodifiedTabs: Tab[] = [];
const leftTabs: Tab[] = [];
const rightTabs: Tab[] = [];
@@ -86,6 +87,7 @@ const closeMenu = (tab: Tab) => {
};
const splitSubMenu = (app: App, tab: Tab) => {
+ window.sout.tracker("invoked");
const subMenus: IMenu[] = [{
icon: "iconSplitLR",
accelerator: window.siyuan.config.keymap.general.splitLR.custom,
@@ -163,6 +165,7 @@ const splitSubMenu = (app: App, tab: Tab) => {
};
export const initTabMenu = (app: App, tab: Tab) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
closeMenu(tab);
window.siyuan.menus.menu.append(new MenuItem({
@@ -221,6 +224,7 @@ export const initTabMenu = (app: App, tab: Tab) => {
};
const unsplitWnd = (target: Wnd | Layout, layout: Layout, onlyWnd: boolean) => {
+ window.sout.tracker("invoked");
let wnd: Wnd = target as Wnd;
while (wnd instanceof Layout) {
wnd = wnd.children[0] as Wnd;
diff --git a/app/src/menus/tag.ts b/app/src/menus/tag.ts
index b5bb1b3979..44bd4cd808 100644
--- a/app/src/menus/tag.ts
+++ b/app/src/menus/tag.ts
@@ -5,6 +5,7 @@ import {escapeHtml} from "../util/escape";
import {renameTag} from "../util/noRelyPCFunction";
export const openTagMenu = (element: HTMLElement, event: MouseEvent, labelName: string) => {
+ window.sout.tracker("invoked");
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
window.siyuan.menus.menu.element.getAttribute("data-name") === "tagMenu") {
window.siyuan.menus.menu.remove();
diff --git a/app/src/menus/util.ts b/app/src/menus/util.ts
index ba2bf0d625..dc6202b0ea 100644
--- a/app/src/menus/util.ts
+++ b/app/src/menus/util.ts
@@ -13,6 +13,7 @@ import {isInAndroid, updateHotkeyTip} from "../protyle/util/compatibility";
import {checkFold} from "../util/noRelyPCFunction";
export const exportAsset = (src: string) => {
+ window.sout.tracker("invoked");
/// #if !BROWSER
return {
label: window.siyuan.languages.export,
@@ -33,6 +34,7 @@ export const exportAsset = (src: string) => {
export const openEditorTab = (app: App, id: string, notebookId?: string, pathString?: string) => {
+ window.sout.tracker("invoked");
/// #if !MOBILE
const openSubmenus: IMenu[] = [{
icon: "iconLayoutRight",
@@ -141,6 +143,7 @@ export const openEditorTab = (app: App, id: string, notebookId?: string, pathStr
};
export const copyPNG = (imgElement: HTMLImageElement) => {
+ window.sout.tracker("invoked");
if (isInAndroid()) {
window.JSAndroid.writeImageClipboard(imgElement.getAttribute("src"));
return;
diff --git a/app/src/menus/workspace.ts b/app/src/menus/workspace.ts
index b89b5dfdad..68c4b94b4f 100644
--- a/app/src/menus/workspace.ts
+++ b/app/src/menus/workspace.ts
@@ -25,6 +25,7 @@ import {confirmDialog} from "../dialog/confirmDialog";
import {App} from "../index";
import {isBrowser} from "../util/functions";
import {openRecentDocs} from "../business/openRecentDocs";
+import {isPadAppMode} from "sofill/env"
const editLayout = (layoutName?: string) => {
const dialog = new Dialog({
@@ -127,6 +128,7 @@ const togglePinDock = (dock: Dock, icon: string) => {
};
export const workspaceMenu = (app: App, rect: DOMRect) => {
+ window.sout.tracker("invoked");
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
window.siyuan.menus.menu.element.getAttribute("data-name") === "barWorkspace") {
window.siyuan.menus.menu.remove();
@@ -430,7 +432,7 @@ export const workspaceMenu = (app: App, rect: DOMRect) => {
window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element);
}
window.siyuan.menus.menu.append(new MenuItem({
- label: window.siyuan.languages.help,
+ label: window.siyuan.languages.userGuide,
icon: "iconHelp",
click: () => {
mountHelp();
@@ -440,10 +442,12 @@ export const workspaceMenu = (app: App, rect: DOMRect) => {
label: window.siyuan.languages.feedback,
icon: "iconFeedback",
click: () => {
- if ("zh_CN" === window.siyuan.config.lang || "zh_CHT" === window.siyuan.config.lang) {
- window.open("https://ld246.com/article/1649901726096");
+ if (isPadAppMode()) {
+ window.open('siyuan://androidFeedback', '_blank');
+ } else if ("zh_CN" === window.siyuan.config.lang || "zh_CHT" === window.siyuan.config.lang) {
+ window.open("https://ld246.com/member/soltus");
} else {
- window.open("https://liuyun.io/article/1686530886208");
+ window.open("https://liuyun.io/member/soltus");
}
}
}).element);
@@ -481,6 +485,7 @@ export const workspaceMenu = (app: App, rect: DOMRect) => {
};
const openWorkspace = (workspace: string) => {
+ window.sout.tracker("invoked");
/// #if !BROWSER
if (workspace === window.siyuan.config.system.workspaceDir) {
return;
@@ -497,6 +502,7 @@ const openWorkspace = (workspace: string) => {
};
const workspaceItem = (item: IWorkspace) => {
+ window.sout.tracker("invoked");
/// #if !BROWSER
return {
label: `
diff --git a/app/src/mobile/editor.ts b/app/src/mobile/editor.ts
index f2d70e6611..9f252a840c 100644
--- a/app/src/mobile/editor.ts
+++ b/app/src/mobile/editor.ts
@@ -20,6 +20,7 @@ export const getCurrentEditor = () => {
};
export const openMobileFileById = (app: App, id: string, action = [Constants.CB_GET_HL]) => {
+ window.sout.tracker("invoked");
window.siyuan.storage[Constants.LOCAL_DOCINFO] = {id};
setStorageVal(Constants.LOCAL_DOCINFO, window.siyuan.storage[Constants.LOCAL_DOCINFO]);
if (window.siyuan.mobile.editor) {
diff --git a/app/src/mobile/index.ts b/app/src/mobile/index.ts
index 11add753a1..cbfaa61575 100644
--- a/app/src/mobile/index.ts
+++ b/app/src/mobile/index.ts
@@ -117,9 +117,9 @@ class App {
window.siyuan.emojis = emojiResponse.data as IEmoji[];
setNoteBook(() => {
initRightMenu(this); // 前置避免 initFramework crash 影响
- console.log("initRightMenu() resolved");
+ window.sout.tracker("initRightMenu() resolved");
initFramework(this, confResponse.data.start);
- console.log("initFramework() resolved");
+ window.sout.tracker("initFramework() resolved");
openChangelog();
});
});
diff --git a/app/src/mobile/menu/getRecentDocs.ts b/app/src/mobile/menu/getRecentDocs.ts
index bde4ebb549..d70ac00ed6 100644
--- a/app/src/mobile/menu/getRecentDocs.ts
+++ b/app/src/mobile/menu/getRecentDocs.ts
@@ -8,6 +8,7 @@ import {openMobileFileById} from "../editor";
import {App} from "../../index";
export const getRecentDocs = (app: App) => {
+ window.sout.tracker("invoked");
fetchPost("/api/storage/getRecentDocs", {}, (response) => {
let html = "";
response.data.forEach((item: any, index: number) => {
diff --git a/app/src/mobile/menu/index.ts b/app/src/mobile/menu/index.ts
index 17a4a7823e..5684e69018 100644
--- a/app/src/mobile/menu/index.ts
+++ b/app/src/mobile/menu/index.ts
@@ -23,12 +23,14 @@ import {Menu} from "../../plugin/Menu";
import {commandPanel} from "../../plugin/commandPanel";
export const popMenu = () => {
+ window.sout.tracker("invoked");
activeBlur();
hideKeyboardToolbar();
document.getElementById("menu").style.transform = "translateX(0px)";
};
export const initRightMenu = (app: App) => {
+ window.sout.tracker("invoked");
const menuElement = document.getElementById("menu");
let accountHTML = "";
if (window.siyuan.user && !window.siyuan.config.readonly) {
@@ -110,9 +112,9 @@ export const initRightMenu = (app: App) => {
-
@@ -228,6 +230,11 @@ export const initRightMenu = (app: App) => {
event.preventDefault();
event.stopPropagation();
break;
+ } else if (target.id === "androidFeedback") {
+ window.open('siyuan://androidFeedback', '_blank');
+ event.preventDefault();
+ event.stopPropagation();
+ break;
} else if (target.id === "menuLock") {
lockScreen(app);
event.preventDefault();
diff --git a/app/src/mobile/menu/model.ts b/app/src/mobile/menu/model.ts
index 3870ed0c13..f7648109d6 100644
--- a/app/src/mobile/menu/model.ts
+++ b/app/src/mobile/menu/model.ts
@@ -4,6 +4,7 @@ export const openModel = (obj: {
title: string,
bindEvent: (element: HTMLElement) => void
}) => {
+ window.sout.tracker("invoked");
const modelElement = document.getElementById("model");
modelElement.style.transform = "translateY(0px)";
modelElement.querySelector(".toolbar__icon use").setAttribute("xlink:href", "#" + obj.icon);
diff --git a/app/src/mobile/menu/search.ts b/app/src/mobile/menu/search.ts
index 108740a411..83e8d6c82d 100644
--- a/app/src/mobile/menu/search.ts
+++ b/app/src/mobile/menu/search.ts
@@ -28,6 +28,7 @@ import {checkFold} from "../../util/noRelyPCFunction";
import {getDefaultType} from "../../search/getDefault";
const replace = (element: Element, config: Config.IUILayoutTabSearchConfig, isAll: boolean) => {
+ window.sout.tracker("invoked");
if (config.method === 1 || config.method === 2) {
showMessage(window.siyuan.languages._kernel[132]);
return;
@@ -107,6 +108,7 @@ const replace = (element: Element, config: Config.IUILayoutTabSearchConfig, isAl
};
const updateConfig = (element: Element, newConfig: Config.IUILayoutTabSearchConfig, config: Config.IUILayoutTabSearchConfig) => {
+ window.sout.tracker("invoked");
if (config.hasReplace !== newConfig.hasReplace) {
if (newConfig.hasReplace) {
element.querySelector('[data-type="toggle-replace"]').classList.add("toolbar__icon--active");
@@ -163,6 +165,7 @@ const updateConfig = (element: Element, newConfig: Config.IUILayoutTabSearchConf
};
const onRecentBlocks = (data: IBlock[], config: Config.IUILayoutTabSearchConfig, response?: IWebSocketData) => {
+ window.sout.tracker("invoked");
const listElement = document.querySelector("#searchList");
let resultHTML = "";
data.forEach((item: IBlock, index: number) => {
@@ -213,6 +216,7 @@ ${unicode2Emoji(childItem.ial.icon, "b3-list-item__graphic", true)}
let toolbarSearchTimeout = 0;
export const updateSearchResult = (config: Config.IUILayoutTabSearchConfig, element: Element, rmCurrentCriteria = false) => {
+ window.sout.tracker("invoked");
clearTimeout(toolbarSearchTimeout);
toolbarSearchTimeout = window.setTimeout(() => {
if (rmCurrentCriteria) {
@@ -261,6 +265,7 @@ export const updateSearchResult = (config: Config.IUILayoutTabSearchConfig, elem
};
const initSearchEvent = (app: App, element: Element, config: Config.IUILayoutTabSearchConfig) => {
+ window.sout.tracker("invoked");
const searchInputElement = document.getElementById("toolbarSearch") as HTMLInputElement;
searchInputElement.value = config.k || "";
searchInputElement.addEventListener("compositionend", (event: InputEvent) => {
@@ -617,6 +622,7 @@ const initSearchEvent = (app: App, element: Element, config: Config.IUILayoutTab
};
export const popSearch = (app: App, config = window.siyuan.storage[Constants.LOCAL_SEARCHDATA] as Config.IUILayoutTabSearchConfig) => {
+ window.sout.tracker("invoked");
activeBlur();
hideKeyboardToolbar();
let includeChild = true;
@@ -726,6 +732,7 @@ export const popSearch = (app: App, config = window.siyuan.storage[Constants.LOC
};
const goAsset = () => {
+ window.sout.tracker("invoked");
const assetsElement = document.querySelector("#searchAssetsPanel");
assetsElement.classList.remove("fn__none");
const listElement = assetsElement.querySelector("#searchAssetList");
@@ -758,6 +765,7 @@ const goAsset = () => {
};
export const goUnRef = () => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
const unRefElement = document.querySelector("#searchUnRefPanel");
unRefElement.classList.remove("fn__none");
@@ -769,6 +777,7 @@ export const goUnRef = () => {
};
const getUnRefListMobile = (element: Element, page = 1) => {
+ window.sout.tracker("invoked");
const previousElement = element.querySelector('[data-type="unRefPrevious"]');
if (page > 1) {
previousElement.removeAttribute("disabled");
diff --git a/app/src/mobile/settings/about.ts b/app/src/mobile/settings/about.ts
index 272e732856..1b5151c5af 100644
--- a/app/src/mobile/settings/about.ts
+++ b/app/src/mobile/settings/about.ts
@@ -13,6 +13,7 @@ import {isBrowser} from "../../util/functions";
import {isAppMode} from "sofill/env"
export const initAbout = () => {
+ window.sout.tracker("invoked");
if (!window.siyuan.config.localIPs || window.siyuan.config.localIPs.length === 0 ||
(window.siyuan.config.localIPs.length === 1 && window.siyuan.config.localIPs[0] === "")) {
window.siyuan.config.localIPs = ["127.0.0.1"];
@@ -399,6 +400,7 @@ ${
};
const genWorkspace = (workspaceDirElement: Element) => {
+ window.sout.tracker("invoked");
fetchPost("/api/system/getWorkspaces", {}, (response) => {
let html = "";
response.data.forEach((item: IWorkspace) => {
diff --git a/app/src/mobile/settings/account.ts b/app/src/mobile/settings/account.ts
index c9b0e3560c..9a393bce48 100644
--- a/app/src/mobile/settings/account.ts
+++ b/app/src/mobile/settings/account.ts
@@ -13,6 +13,7 @@ import {hideElements} from "../../protyle/ui/hideElements";
import {Constants} from "../../constants";
export const showAccountInfo = () => {
+ window.sout.tracker("invoked");
const payHTML = `
${window.siyuan.languages[window.siyuan.user?.userSiYuanOneTimePayStatus === 1 ? "account4" : "account1"]}
@@ -147,6 +148,7 @@ ${renewHTML}`;
};
const getLoginHTML = (deactivate = false) => {
+ window.sout.tracker("invoked");
let confirmHTML: string;
if (deactivate) {
confirmHTML = `
@@ -209,6 +211,7 @@ const getLoginHTML = (deactivate = false) => {
};
const afterLogin = (response: IWebSocketData, deactive = false) => {
+ window.sout.tracker("invoked");
if (deactive) {
hideElements(["dialog"]);
confirmDialog("⚠️ " + window.siyuan.languages.deactivateUser, window.siyuan.languages.deactivateUserTip, () => {
@@ -233,6 +236,7 @@ const afterLogin = (response: IWebSocketData, deactive = false) => {
};
const bindLoginEvent = (modelMainElement: HTMLElement, deactive = false) => {
+ window.sout.tracker("invoked");
const agreeLoginElement = modelMainElement.querySelector("#agreeLogin") as HTMLInputElement;
const userNameElement = modelMainElement.querySelector("#userName") as HTMLInputElement;
const userPasswordElement = modelMainElement.querySelector("#userPassword") as HTMLInputElement;
@@ -309,6 +313,7 @@ const bindLoginEvent = (modelMainElement: HTMLElement, deactive = false) => {
};
export const login = () => {
+ window.sout.tracker("invoked");
openModel({
title: window.siyuan.languages.login,
icon: "iconAccount",
diff --git a/app/src/mobile/settings/ai.ts b/app/src/mobile/settings/ai.ts
index 9b9cebe804..fef915ba3b 100644
--- a/app/src/mobile/settings/ai.ts
+++ b/app/src/mobile/settings/ai.ts
@@ -2,6 +2,7 @@ import {openModel} from "../menu/model";
import {ai} from "../../config/ai";
export const initAI = () => {
+ window.sout.tracker("invoked");
openModel({
title: "AI",
icon: "iconSparkles",
diff --git a/app/src/mobile/settings/appearance.ts b/app/src/mobile/settings/appearance.ts
index 33dd49b6ba..1a1342064f 100644
--- a/app/src/mobile/settings/appearance.ts
+++ b/app/src/mobile/settings/appearance.ts
@@ -3,6 +3,7 @@ import {genOptions} from "../../util/genOptions";
import {openModel} from "../menu/model";
export const initAppearance = () => {
+ window.sout.tracker("invoked");
openModel({
title: window.siyuan.languages.appearance,
icon:"iconTheme",
diff --git a/app/src/mobile/settings/editor.ts b/app/src/mobile/settings/editor.ts
index 4e5d805210..84fade5db2 100644
--- a/app/src/mobile/settings/editor.ts
+++ b/app/src/mobile/settings/editor.ts
@@ -5,6 +5,7 @@ import {setInlineStyle} from "../../util/assets";
import {confirmDialog} from "../../dialog/confirmDialog";
const setEditor = (modelMainElement: Element) => {
+ window.sout.tracker("invoked");
let dynamicLoadBlocks = parseInt((modelMainElement.querySelector("#dynamicLoadBlocks") as HTMLInputElement).value);
if (48 > dynamicLoadBlocks) {
dynamicLoadBlocks = 48;
@@ -48,6 +49,7 @@ const setEditor = (modelMainElement: Element) => {
};
export const initEditor = () => {
+ window.sout.tracker("invoked");
openModel({
title: window.siyuan.languages.editor,
icon: "iconEdit",
diff --git a/app/src/mobile/settings/riffCard.ts b/app/src/mobile/settings/riffCard.ts
index 6f325a5cb0..3a0716da1d 100644
--- a/app/src/mobile/settings/riffCard.ts
+++ b/app/src/mobile/settings/riffCard.ts
@@ -2,6 +2,7 @@ import {openModel} from "../menu/model";
import {flashcard} from "../../config/flashcard";
export const initRiffCard = () => {
+ window.sout.tracker("invoked");
openModel({
title: window.siyuan.languages.riffCard,
icon: "iconRiffCard",
diff --git a/app/src/mobile/util/MobileBackFoward.ts b/app/src/mobile/util/MobileBackFoward.ts
index e47ffe06f0..7100e41f0d 100644
--- a/app/src/mobile/util/MobileBackFoward.ts
+++ b/app/src/mobile/util/MobileBackFoward.ts
@@ -17,6 +17,7 @@ import {setTitle} from "../../dialog/processSystem";
const forwardStack: IBackStack[] = [];
const focusStack = (backStack: IBackStack) => {
+ window.sout.tracker("invoked");
const protyle = getCurrentEditor().protyle;
window.siyuan.storage[Constants.LOCAL_DOCINFO] = {
id: backStack.id,
@@ -99,6 +100,7 @@ const focusStack = (backStack: IBackStack) => {
};
export const pushBack = () => {
+ window.sout.tracker("invoked");
const protyle = getCurrentEditor().protyle;
if (protyle.wysiwyg.element.firstElementChild) {
window.siyuan.backStack.push({
@@ -117,6 +119,7 @@ export const pushBack = () => {
};
export const goForward = () => {
+ window.sout.tracker("invoked");
if (window.siyuan.menus.menu.element.classList.contains("b3-menu--fullscreen") &&
!window.siyuan.menus.menu.element.classList.contains("fn__none")) {
window.siyuan.menus.menu.element.dispatchEvent(new CustomEvent("click", {detail: "back"}));
@@ -139,6 +142,7 @@ export const goForward = () => {
};
export const goBack = () => {
+ window.sout.tracker("invoked");
const editor = getCurrentEditor();
if (window.siyuan.menus.menu.element.classList.contains("b3-menu--fullscreen") &&
!window.siyuan.menus.menu.element.classList.contains("fn__none")) {
diff --git a/app/src/mobile/util/closePanel.ts b/app/src/mobile/util/closePanel.ts
index 60be93d65d..9e4bb22e87 100644
--- a/app/src/mobile/util/closePanel.ts
+++ b/app/src/mobile/util/closePanel.ts
@@ -1,6 +1,7 @@
import {activeBlur, hideKeyboardToolbar} from "./keyboardToolbar";
export const closePanel = () => {
+ window.sout.tracker("invoked");
document.getElementById("menu").style.transform = "";
document.getElementById("sidebar").style.transform = "";
document.getElementById("model").style.transform = "";
@@ -11,6 +12,7 @@ export const closePanel = () => {
};
export const closeModel = () => {
+ window.sout.tracker("invoked");
document.getElementById("model").style.transform = "";
activeBlur();
hideKeyboardToolbar();
diff --git a/app/src/mobile/util/initFramework.ts b/app/src/mobile/util/initFramework.ts
index 04e26ea3c9..a4ef80d579 100644
--- a/app/src/mobile/util/initFramework.ts
+++ b/app/src/mobile/util/initFramework.ts
@@ -28,6 +28,7 @@ import {showMessage} from "../../dialog/message";
let custom: MobileCustom;
const openDockMenu = (app: App) => {
+ window.sout.tracker("invoked");
const menu = new Menu("dockMobileMenu");
if (menu.isOpen) {
return;
@@ -60,11 +61,11 @@ const openDockMenu = (app: App) => {
export const initFramework = (app: App, isStart: boolean) => {
setInlineStyle();
- console.log("initFramework()->setInlineStyle() resolved");
+ window.sout.tracker("initFramework() -> setInlineStyle() resolved");
renderSnippet();
- console.log("initFramework()->renderSnippet() resolved");
+ window.sout.tracker("initFramework() -> renderSnippet() resolved");
initKeyboardToolbar();
- console.log("initFramework()->initKeyboardToolbar() resolved");
+ window.sout.tracker("initFramework() -> initKeyboardToolbar() resolved");
const sidebarElement = document.getElementById("sidebar");
let outline: MobileOutline;
let backlink: MobileBacklinks;
@@ -167,13 +168,13 @@ export const initFramework = (app: App, isStart: boolean) => {
closeModel();
});
initEditorName();
- console.log("initFramework()->initEditorName() resolved");
+ window.sout.tracker("initFramework() -> initEditorName() resolved");
if (getOpenNotebookCount() > 0) {
if (window.JSAndroid && window.openFileByURL(window.JSAndroid.getBlockURL())) {
return;
}
const idZoomIn = getIdZoomInByPath();
- console.log("initFramework()->getIdZoomInByPath() resolved");
+ window.sout.tracker("initFramework() -> getIdZoomInByPath() resolved");
if (idZoomIn.id) {
openMobileFileById(app, idZoomIn.id,
idZoomIn.isZoomIn ? [Constants.CB_GET_ALL, Constants.CB_GET_HL] : [Constants.CB_GET_HL, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]);
@@ -205,6 +206,7 @@ export const initFramework = (app: App, isStart: boolean) => {
};
const initEditorName = () => {
+ window.sout.tracker("invoked");
const inputElement = document.getElementById("toolbarName") as HTMLInputElement;
inputElement.setAttribute("placeholder", window.siyuan.languages._kernel[16]);
inputElement.addEventListener("blur", () => {
diff --git a/app/src/mobile/util/keyboardToolbar.ts b/app/src/mobile/util/keyboardToolbar.ts
index 09a0dc3014..6aa3a38015 100644
--- a/app/src/mobile/util/keyboardToolbar.ts
+++ b/app/src/mobile/util/keyboardToolbar.ts
@@ -18,6 +18,7 @@ let renderKeyboardToolbarTimeout: number;
let showUtil = false;
const getSlashItem = (value: string, icon: string, text: string, focus = "false") => {
+ window.sout.tracker("invoked");
let iconHTML;
if (icon?.startsWith("icon")) {
iconHTML = ``;
@@ -31,6 +32,7 @@ const getSlashItem = (value: string, icon: string, text: string, focus = "false"
};
export const renderTextMenu = (protyle: IProtyle, toolbarElement: Element) => {
+ window.sout.tracker("invoked");
let colorHTML = "";
["var(--b3-font-color1)", "var(--b3-font-color2)", "var(--b3-font-color3)", "var(--b3-font-color4)",
"var(--b3-font-color5)", "var(--b3-font-color6)", "var(--b3-font-color7)", "var(--b3-font-color8)",
@@ -193,7 +195,8 @@ export const renderTextMenu = (protyle: IProtyle, toolbarElement: Element) => {
};
const renderSlashMenu = (protyle: IProtyle, toolbarElement: Element) => {
- console.log("renderSlashMenu protyle", protyle);
+ window.sout.tracker("invoked");
+ window.sout.tracker("protyle: ", protyle);
protyle.hint.splitChar = "/";
protyle.hint.lastIndex = -1;
let pluginHTML = "";
@@ -268,6 +271,7 @@ const renderSlashMenu = (protyle: IProtyle, toolbarElement: Element) => {
};
export const showKeyboardToolbarUtil = (oldScrollTop: number) => {
+ window.sout.tracker("invoked");
window.siyuan.menus.menu.remove();
showUtil = true;
@@ -288,6 +292,7 @@ export const showKeyboardToolbarUtil = (oldScrollTop: number) => {
};
const hideKeyboardToolbarUtil = () => {
+ window.sout.tracker("invoked");
const toolbarElement = document.getElementById("keyboardToolbar");
toolbarElement.style.height = "";
const editor = getCurrentEditor();
@@ -300,6 +305,7 @@ const hideKeyboardToolbarUtil = () => {
};
const renderKeyboardToolbar = () => {
+ window.sout.tracker("invoked");
clearTimeout(renderKeyboardToolbarTimeout);
renderKeyboardToolbarTimeout = window.setTimeout(() => {
if (getSelection().rangeCount === 0 ||
@@ -393,6 +399,7 @@ const renderKeyboardToolbar = () => {
};
export const showKeyboardToolbar = () => {
+ window.sout.tracker("invoked");
if (!showUtil) {
hideKeyboardToolbarUtil();
}
@@ -433,6 +440,7 @@ export const showKeyboardToolbar = () => {
};
export const hideKeyboardToolbar = () => {
+ window.sout.tracker("invoked");
if (showUtil) {
return;
}
@@ -460,6 +468,7 @@ export const activeBlur = () => {
};
export const initKeyboardToolbar = () => {
+ window.sout.tracker("invoked");
let preventRender = false;
document.addEventListener("selectionchange", () => {
if (!preventRender) {
diff --git a/app/src/mobile/util/onMessage.ts b/app/src/mobile/util/onMessage.ts
index f1b0737432..fe714ac93c 100644
--- a/app/src/mobile/util/onMessage.ts
+++ b/app/src/mobile/util/onMessage.ts
@@ -14,6 +14,7 @@ export const onMessage = (app: App, data: IWebSocketData) => {
reloadSync(app, data.data);
break;
case "setConf":
+ window.sout.tracker(`invoked -> ${data.cmd} -> ${data.data}`);
window.siyuan.config = data.data;
break;
case "readonly":
@@ -29,9 +30,11 @@ export const onMessage = (app: App, data: IWebSocketData) => {
}
break;
case "openFileById":
+ window.sout.tracker(`invoked -> ${data.cmd} -> ${data.data?.id}`);
openMobileFileById(app, data.data.id, [Constants.CB_GET_HL]);
break;
case"txerr":
+ window.sout.tracker(`invoked -> ${data.cmd}`);
transactionError();
break;
case"statusbar":
diff --git a/app/src/mobile/util/setEmpty.ts b/app/src/mobile/util/setEmpty.ts
index 6eb97f0094..e438975a3d 100644
--- a/app/src/mobile/util/setEmpty.ts
+++ b/app/src/mobile/util/setEmpty.ts
@@ -8,6 +8,7 @@ import {App} from "../../index";
import {setTitle} from "../../dialog/processSystem";
export const setEmpty = (app: App) => {
+ window.sout.tracker("invoked");
setTitle(window.siyuan.languages.siyuanNote);
document.getElementById("toolbarName").classList.add("fn__hidden");
document.getElementById("editor").classList.add("fn__none");
@@ -32,7 +33,7 @@ export const setEmpty = (app: App) => {
${window.siyuan.languages.newNotebook}
- ${window.siyuan.languages.help}
+ ${window.siyuan.languages.userGuide}
`;
emptyElement.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
@@ -77,6 +78,7 @@ export const setEmpty = (app: App) => {
};
export const setEditor = () => {
+ window.sout.tracker("invoked");
const toolbarNameElement = document.getElementById("toolbarName") as HTMLInputElement;
setTitle(toolbarNameElement.value);
toolbarNameElement.classList.remove("fn__hidden");
diff --git a/app/src/mobile/util/touch.ts b/app/src/mobile/util/touch.ts
index 667c295cb1..e62e6ef62b 100644
--- a/app/src/mobile/util/touch.ts
+++ b/app/src/mobile/util/touch.ts
@@ -1,8 +1,4 @@
-import {
- hasClosestByAttribute,
- hasClosestByClassName,
- hasTopClosestByClassName,
-} from "../../protyle/util/hasClosest";
+import {hasClosestByAttribute, hasClosestByClassName, hasTopClosestByClassName,} from "../../protyle/util/hasClosest";
import {closeModel, closePanel} from "./closePanel";
import {popMenu} from "../menu";
import {activeBlur, hideKeyboardToolbar} from "./keyboardToolbar";
@@ -21,6 +17,7 @@ let lastClientX: number; // 和起始方向不一致时,记录最后一次
let scrollBlock: boolean;
const popSide = (render = true) => {
+ window.sout.tracker("invoked");
if (render) {
document.getElementById("toolbarFile").dispatchEvent(new CustomEvent("click"));
} else {
@@ -31,6 +28,7 @@ const popSide = (render = true) => {
};
export const handleTouchEnd = (event: TouchEvent, app: App) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
if (isIPhone() && globalTouchEnd(event, yDiff, time, app)) {
event.stopImmediatePropagation();
event.preventDefault();
@@ -137,6 +135,7 @@ export const handleTouchEnd = (event: TouchEvent, app: App) => {
};
export const handleTouchStart = (event: TouchEvent) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
if (globalTouchStart(event)) {
return;
}
@@ -160,8 +159,9 @@ export const handleTouchStart = (event: TouchEvent) => {
};
let previousClientX: number;
-const sideMaskElement = document.querySelector(".side-mask") as HTMLElement
+const sideMaskElement = document.querySelector(".side-mask") as HTMLElement;
export const handleTouchMove = (event: TouchEvent) => {
+ // window.sout.tracker("invoked"); // 这里调用频繁
const target = event.target as HTMLElement;
if (!clientX || !clientY ||
target.tagName === "AUDIO" ||
@@ -189,15 +189,15 @@ export const handleTouchMove = (event: TouchEvent) => {
// 上下滚动防止左右滑动
if (!firstXY) {
if (Math.abs(xDiff) > Math.abs(yDiff)) {
- firstXY = "x"
+ firstXY = "x";
} else {
- firstXY = "y"
+ firstXY = "y";
}
if (firstXY === "x") {
if ((hasClosestByAttribute(target, "id", "menu") && firstDirection === "toLeft") ||
(hasClosestByAttribute(target, "id", "sidebar") && firstDirection === "toRight")) {
- firstXY = "y"
- yDiff = undefined
+ firstXY = "y";
+ yDiff = undefined;
}
}
}
diff --git a/app/src/plugin/EventBus.ts b/app/src/plugin/EventBus.ts
index f470ada025..1bf8e354d9 100644
--- a/app/src/plugin/EventBus.ts
+++ b/app/src/plugin/EventBus.ts
@@ -33,6 +33,7 @@ export const emitOpenMenu = (options: {
detail: any,
separatorPosition?: "top" | "bottom",
}) => {
+ window.sout.tracker("invoked");
const pluginSubMenu = new subMenu();
options.detail.menu = pluginSubMenu;
options.plugins.forEach((plugin) => {
diff --git a/app/src/plugin/customBlockRender.ts b/app/src/plugin/customBlockRender.ts
index d8887ac475..a85d7394a7 100644
--- a/app/src/plugin/customBlockRender.ts
+++ b/app/src/plugin/customBlockRender.ts
@@ -3,6 +3,7 @@ import {Constants} from "../constants";
import {genIconHTML} from "../protyle/render/util";
export const customBlockRender = (app: App, element: Element) => {
+ window.sout.tracker("invoked");
// TODO
let abcElements: Element[] = [];
if (element.getAttribute("data-subtype") === "abc") {
diff --git a/app/src/plugin/index.ts b/app/src/plugin/index.ts
index 301df2877a..6a65cd60ee 100644
--- a/app/src/plugin/index.ts
+++ b/app/src/plugin/index.ts
@@ -14,6 +14,7 @@ import {MobileCustom} from "../mobile/dock/MobileCustom";
import {hasClosestByAttribute} from "../protyle/util/hasClosest";
import {BlockPanel} from "../block/Panel";
import {Setting} from "./Setting";
+import {clearOBG} from "../layout/dock/util";
export class Plugin {
private app: App;
@@ -268,6 +269,7 @@ export class Plugin {
update: options.update,
});
customObj.element.addEventListener("click", () => {
+ clearOBG();
setPanelFocus(customObj.element.parentElement.parentElement);
});
return customObj;
diff --git a/app/src/plugin/loader.ts b/app/src/plugin/loader.ts
index 9ab3682048..58d7ec8248 100644
--- a/app/src/plugin/loader.ts
+++ b/app/src/plugin/loader.ts
@@ -22,10 +22,12 @@ if (window.require instanceof Function) {
}
const runCode = (code: string, sourceURL: string) => {
+ window.sout.tracker("-> code:", code);
return window.eval("(function anonymous(require, module, exports){".concat(code, "\n})\n//# sourceURL=").concat(sourceURL, "\n"));
};
export const loadPlugins = async (app: App) => {
+ window.sout.tracker("invoked");
const response = await fetchSyncPost("/api/petal/loadPetals", {frontend: getFrontend()});
let css = "";
// 为加快启动速度,不进行 await
@@ -42,6 +44,7 @@ export const loadPlugins = async (app: App) => {
};
const loadPluginJS = async (app: App, item: IPluginData) => {
+ window.sout.tracker("invoked");
const exportsObj: { [key: string]: any } = {};
const moduleObj = {exports: exportsObj};
try {
@@ -76,6 +79,7 @@ const loadPluginJS = async (app: App, item: IPluginData) => {
// 启用插件
export const loadPlugin = async (app: App, item: IPluginData) => {
+ window.sout.tracker("invoked");
const plugin = await loadPluginJS(app, item);
const styleElement = document.createElement("style");
styleElement.textContent = item.css;
@@ -87,6 +91,7 @@ export const loadPlugin = async (app: App, item: IPluginData) => {
const updateDock = (dockItem: Config.IUILayoutDockTab[], index: number, plugin: Plugin, type: string) => {
+ // window.sout.tracker("invoked"); // 由插件触发可能调用频繁,请根据实际需求追踪
const dockKeys = Object.keys(plugin.docks);
dockItem.forEach((tabItem: Config.IUILayoutDockTab, tabIndex: number) => {
if (dockKeys.includes(tabItem.type)) {
@@ -105,6 +110,7 @@ const updateDock = (dockItem: Config.IUILayoutDockTab[], index: number, plugin:
};
export const afterLoadPlugin = (plugin: Plugin) => {
+ window.sout.tracker("invoked");
try {
plugin.onLayoutReady();
} catch (e) {
@@ -198,6 +204,7 @@ export const afterLoadPlugin = (plugin: Plugin) => {
};
export const reloadPlugin = (app: App) => {
+ window.sout.tracker("invoked");
app.plugins.forEach((item) => {
uninstall(this, item.name);
});
diff --git a/app/src/plugin/uninstall.ts b/app/src/plugin/uninstall.ts
index fcc7c7ecd4..40af8e5b3b 100644
--- a/app/src/plugin/uninstall.ts
+++ b/app/src/plugin/uninstall.ts
@@ -6,6 +6,7 @@ import {resizeTopBar} from "../layout/util";
/// #endif
export const uninstall = (app: App, name: string, isUninstall = false) => {
+ window.sout.tracker("invoked");
app.plugins.find((plugin: Plugin, index) => {
if (plugin.name === name) {
// rm command
diff --git a/app/src/protyle/breadcrumb/action.ts b/app/src/protyle/breadcrumb/action.ts
index 5925d7cb79..3fd1c6dfba 100644
--- a/app/src/protyle/breadcrumb/action.ts
+++ b/app/src/protyle/breadcrumb/action.ts
@@ -13,6 +13,7 @@ import {isWindow} from "../../util/functions";
import {Wnd} from "../../layout/Wnd";
export const net2LocalAssets = (protyle: IProtyle, type: "Assets" | "Img") => {
+ window.sout.tracker("invoked");
if (protyle.element.querySelector(".wysiwygLoading")) {
return;
}
@@ -34,6 +35,7 @@ export const net2LocalAssets = (protyle: IProtyle, type: "Assets" | "Img") => {
};
export const fullscreen = (element: Element, btnElement?: Element) => {
+ window.sout.tracker("invoked");
setTimeout(() => {
hideAllElements(["gutter"]);
}, Constants.TIMEOUT_TRANSITION); // 等待页面动画结束
@@ -100,6 +102,7 @@ export const fullscreen = (element: Element, btnElement?: Element) => {
};
export const updateReadonly = (target: Element, protyle: IProtyle) => {
+ window.sout.tracker("invoked");
if (!window.siyuan.config.readonly) {
const isReadonly = target.querySelector("use").getAttribute("xlink:href") !== "#iconUnlock";
if (window.siyuan.config.editor.readOnly) {
diff --git a/app/src/protyle/breadcrumb/index.ts b/app/src/protyle/breadcrumb/index.ts
index 004b2925ed..8bf5dbeb54 100644
--- a/app/src/protyle/breadcrumb/index.ts
+++ b/app/src/protyle/breadcrumb/index.ts
@@ -15,7 +15,7 @@ import {zoomOut} from "../../menus/protyle";
import {getEditorRange} from "../util/selection";
/// #if !MOBILE
import {openFileById} from "../../editor/util";
-import {saveLayout, setPanelFocus} from "../../layout/util";
+import {saveLayout} from "../../layout/util";
/// #endif
/// #if !BROWSER
import {ipcRenderer} from "electron";
@@ -63,11 +63,6 @@ ${padHTML}
`;
this.element = element.firstElementChild as HTMLElement;
element.addEventListener("click", (event) => {
- /// #if !MOBILE
- if (protyle.model) {
- setPanelFocus(protyle.model.element.parentElement.parentElement);
- }
- /// #endif
let target = event.target as HTMLElement;
while (target && !target.isEqualNode(element)) {
const id = target.getAttribute("data-node-id");
@@ -566,11 +561,13 @@ ${padHTML}
});
}
- public render(protyle: IProtyle, update = false) {
+ public render(protyle: IProtyle, update = false, nodeElement?: Element | false) {
/// #if !MOBILE
let range: Range;
let blockElement: Element;
- if (getSelection().rangeCount > 0) {
+ if (nodeElement) {
+ blockElement = nodeElement;
+ } else if (getSelection().rangeCount > 0) {
range = getSelection().getRangeAt(0);
if (!protyle?.wysiwyg.element.isEqualNode(range.startContainer) && !protyle?.wysiwyg.element.contains(range.startContainer)) {
if (protyle.element.id === "searchPreview") {
diff --git a/app/src/protyle/export/index.ts b/app/src/protyle/export/index.ts
index 34ecb7e29b..43e1f531c5 100644
--- a/app/src/protyle/export/index.ts
+++ b/app/src/protyle/export/index.ts
@@ -16,6 +16,7 @@ import {setStorageVal} from "../util/compatibility";
import {isPaidUser} from "../../util/needSubscribe";
export const saveExport = (option: IExportOptions) => {
+ window.sout.tracker("invoked");
/// #if !BROWSER
if (option.type === "pdf") {
if (window.siyuan.config.appearance.mode === 1) {
@@ -71,6 +72,7 @@ export const saveExport = (option: IExportOptions) => {
};
const getSnippetCSS = () => {
+ window.sout.tracker("invoked");
let snippetCSS = "";
document.querySelectorAll("style").forEach((item) => {
if (item.id.startsWith("snippet")) {
@@ -82,6 +84,7 @@ const getSnippetCSS = () => {
/// #if !BROWSER
const renderPDF = async (id: string) => {
+ window.sout.tracker("invoked");
const localData = window.siyuan.storage[Constants.LOCAL_EXPORTPDF];
const servePath = window.location.protocol + "//" + window.location.host;
const isDefault = (window.siyuan.config.appearance.mode === 1 && window.siyuan.config.appearance.themeDark === "midnight") || (window.siyuan.config.appearance.mode === 0 && window.siyuan.config.appearance.themeLight === "daylight");
@@ -566,6 +569,7 @@ const renderPDF = async (id: string) => {
};
const getExportPath = (option: IExportOptions, removeAssets?: boolean, mergeSubdocs?: boolean) => {
+ window.sout.tracker("invoked");
fetchPost("/api/block/getBlockInfo", {
id: option.id
}, async (response) => {
@@ -627,6 +631,7 @@ const getExportPath = (option: IExportOptions, removeAssets?: boolean, mergeSubd
};
const onExport = (data: IWebSocketData, filePath: string, exportOption: IExportOptions, removeAssets?: boolean, msgId?: string) => {
+ window.sout.tracker("invoked");
let themeName = window.siyuan.config.appearance.themeLight;
let mode = 0;
if (["html", "htmlmd"].includes(exportOption.type) && window.siyuan.config.appearance.mode === 1) {
diff --git a/app/src/protyle/export/util.ts b/app/src/protyle/export/util.ts
index 55e91bac98..f1f847400a 100644
--- a/app/src/protyle/export/util.ts
+++ b/app/src/protyle/export/util.ts
@@ -15,6 +15,7 @@ import {showFileInFolder} from "../../util/pathName";
import {isPaidUser} from "../../util/needSubscribe";
export const afterExport = (exportPath: string, msgId: string) => {
+ window.sout.tracker("invoked");
/// #if !BROWSER
showMessage(`${window.siyuan.languages.exported} ${escapeHtml(exportPath)}
@@ -27,6 +28,7 @@ export const afterExport = (exportPath: string, msgId: string) => {
};
export const exportImage = (id: string) => {
+ window.sout.tracker("invoked");
const exportDialog = new Dialog({
title: window.siyuan.languages.exportAsImage,
content: `
diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts
index a9e04007db..c95a1ef419 100644
--- a/app/src/protyle/gutter/index.ts
+++ b/app/src/protyle/gutter/index.ts
@@ -108,10 +108,12 @@ export class Gutter {
const ghostElement = document.createElement("div");
ghostElement.className = protyle.wysiwyg.element.className;
selectElements.forEach(item => {
- if (item.getAttribute("data-type") === "NodeIFrame") {
+ const type = item.getAttribute("data-type");
+ if (["NodeIFrame", "NodeWidget"].includes(type)) {
const embedElement = genEmptyElement();
embedElement.classList.add("protyle-wysiwyg--select");
- getContenteditableElement(embedElement).innerHTML = "
IFrame";
+ const isIFrame = type === "NodeIFrame";
+ getContenteditableElement(embedElement).innerHTML = `
${isIFrame ? "IFrame" : window.siyuan.languages.widget}`;
ghostElement.append(embedElement);
} else {
ghostElement.append(item.cloneNode(true));
diff --git a/app/src/protyle/header/Title.ts b/app/src/protyle/header/Title.ts
index 9f230d823f..ed23aacf9c 100644
--- a/app/src/protyle/header/Title.ts
+++ b/app/src/protyle/header/Title.ts
@@ -15,8 +15,7 @@ import {matchHotKey} from "../util/hotKey";
import {isMac, readText, writeText} from "../util/compatibility";
// import * as dayjs from "dayjs";
import {formatDate,parseDate} from "sofill/mid";
-import {setPanelFocus} from "../../layout/util";
-import {openFileById, updatePanelByEditor} from "../../editor/util";
+import {openFileById} from "../../editor/util";
import {setTitle} from "../../dialog/processSystem";
import {getNoContainerElement} from "../wysiwyg/getBlock";
import {commonHotkey} from "../wysiwyg/commonHotkey";
@@ -50,16 +49,6 @@ export class Title {
this.rename(protyle);
});
this.editElement.addEventListener("click", () => {
- if (protyle.model) {
- setPanelFocus(protyle.model.element.parentElement.parentElement);
- updatePanelByEditor({
- protyle: protyle,
- focus: false,
- pushBackStack: false,
- reload: false,
- resize: false,
- });
- }
protyle.toolbar?.element.classList.add("fn__none");
});
this.editElement.addEventListener("input", (event: InputEvent) => {
@@ -86,11 +75,16 @@ export class Title {
}
if (matchHotKey("⇧⌘V", event)) {
navigator.clipboard.readText().then(textPlain => {
+ // 对 HTML 标签进行内部转义,避免被 Lute 解析以后变为小写 https://github.com/siyuan-note/siyuan/issues/10620
textPlain = textPlain.replace(//g, ";;;gt;;;");
- const content = protyle.lute.BlockDOM2EscapeMarkerContent(protyle.lute.Md2BlockDOM(textPlain));
+ let content = protyle.lute.BlockDOM2EscapeMarkerContent(protyle.lute.Md2BlockDOM(textPlain));
+ // 移除 ;;;lt;;; 和 ;;;gt;;; 转义及其包裹的内容
+ content = content.replace(/;;;lt;;;[^;]+;;;gt;;;/g, "");
document.execCommand("insertText", false, replaceFileName(content));
this.rename(protyle);
});
+ event.preventDefault();
+ event.stopPropagation();
}
if (matchHotKey(window.siyuan.config.keymap.general.enterBack.custom, event)) {
const ids = protyle.path.split("/");
@@ -236,7 +230,9 @@ export class Title {
click: async () => {
navigator.clipboard.readText().then(textPlain => {
textPlain = textPlain.replace(//g, ";;;gt;;;");
- const content = protyle.lute.BlockDOM2EscapeMarkerContent(protyle.lute.Md2BlockDOM(textPlain));
+ let content = protyle.lute.BlockDOM2EscapeMarkerContent(protyle.lute.Md2BlockDOM(textPlain));
+ // 移除 ;;;lt;;; 和 ;;;gt;;; 转义及其包裹的内容
+ content = content.replace(/;;;lt;;;[^;]+;;;gt;;;/g, "");
document.execCommand("insertText", false, replaceFileName(content));
this.rename(protyle);
});
diff --git a/app/src/protyle/header/openTitleMenu.ts b/app/src/protyle/header/openTitleMenu.ts
index 94d0142c30..d2d2005ebf 100644
--- a/app/src/protyle/header/openTitleMenu.ts
+++ b/app/src/protyle/header/openTitleMenu.ts
@@ -25,6 +25,7 @@ import {openSearchAV} from "../render/av/relation";
import {transaction} from "../wysiwyg/transaction";
export const openTitleMenu = (protyle: IProtyle, position: IPosition) => {
+ window.sout.tracker("invoked");
hideTooltip();
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
window.siyuan.menus.menu.element.getAttribute("data-name") === "titleMenu") {
@@ -34,7 +35,7 @@ export const openTitleMenu = (protyle: IProtyle, position: IPosition) => {
fetchPost("/api/block/getDocInfo", {
id: protyle.block.rootID
}, (response) => {
- console.log(response.data);
+ window.sout.tracker("/api/block/getDocInfo -> ", response.data);
window.siyuan.menus.menu.remove();
window.siyuan.menus.menu.element.setAttribute("data-name", "titleMenu");
window.siyuan.menus.menu.append(new MenuItem({
diff --git a/app/src/protyle/hint/extend.ts b/app/src/protyle/hint/extend.ts
index 166e7b8cc7..531b71c595 100644
--- a/app/src/protyle/hint/extend.ts
+++ b/app/src/protyle/hint/extend.ts
@@ -22,6 +22,7 @@ import {unicode2Emoji} from "../../emoji";
import {avRender} from "../render/av/render";
export const hintSlash = (key: string, protyle: IProtyle) => {
+ window.sout.tracker("invoked");
const allList: IHintData[] = [{
filter: ["模版", "moban", "mb", "template"],
value: Constants.ZWSP,
@@ -46,7 +47,7 @@ export const hintSlash = (key: string, protyle: IProtyle) => {
filter: ["ai chat"],
value: Constants.ZWSP + 5,
html: '
AI Chat
',
- },{
+ }, {
filter: ["数据库", "视图", "shujuku", "shitu", "sjk", "st", "database", "view", "db"],
value: '
',
html: `
${window.siyuan.languages.database}
`,
@@ -241,7 +242,7 @@ export const hintSlash = (key: string, protyle: IProtyle) => {
filter: ["移除样式", "yichuyangshi", "ycys", "remove style"],
value: `style${Constants.ZWSP}`,
html: `
A
${window.siyuan.languages.clearFontStyle}`,
- },{
+ }, {
value: "",
html: "separator",
}];
@@ -280,6 +281,7 @@ export const hintSlash = (key: string, protyle: IProtyle) => {
};
export const hintTag = (key: string, protyle: IProtyle): IHintData[] => {
+ window.sout.tracker("invoked");
protyle.hint.genLoading(protyle);
fetchPost("/api/search/searchTag", {
k: key,
@@ -312,6 +314,7 @@ export const hintTag = (key: string, protyle: IProtyle): IHintData[] => {
};
export const genHintItemHTML = (item: IBlock) => {
+ window.sout.tracker("invoked");
let iconHTML;
if (item.type === "NodeDocument" && item.ial.icon) {
iconHTML = unicode2Emoji(item.ial.icon, "b3-list-item__graphic popover__block", true);
@@ -341,13 +344,14 @@ export const genHintItemHTML = (item: IBlock) => {
};
export const hintRef = (key: string, protyle: IProtyle, source: THintSource): IHintData[] => {
+ window.sout.tracker("invoked");
const nodeElement = hasClosestBlock(getEditorRange(protyle.wysiwyg.element).startContainer);
protyle.hint.genLoading(protyle);
fetchPost("/api/search/searchRefBlock", {
k: key,
id: nodeElement ? nodeElement.getAttribute("data-node-id") : protyle.block.parentID,
beforeLen: Math.floor((Math.max(protyle.element.clientWidth / 2, 320) - 58) / 28.8),
- rootID: protyle.block.rootID,
+ rootID: source === "av" ? "" : protyle.block.rootID,
isSquareBrackets: ["[[", "【【"].includes(protyle.hint.splitChar)
}, (response) => {
const dataList: IHintData[] = [];
@@ -387,6 +391,7 @@ export const hintRef = (key: string, protyle: IProtyle, source: THintSource): IH
};
export const hintEmbed = (key: string, protyle: IProtyle): IHintData[] => {
+ window.sout.tracker("invoked");
if (key.endsWith("}}") || key.endsWith("」」")) {
return [];
}
@@ -417,6 +422,7 @@ export const hintEmbed = (key: string, protyle: IProtyle): IHintData[] => {
};
export const hintRenderTemplate = (value: string, protyle: IProtyle, nodeElement: Element) => {
+ window.sout.tracker("invoked");
fetchPost("/api/template/render", {
id: protyle.block.parentID,
path: value
@@ -441,6 +447,7 @@ export const hintRenderTemplate = (value: string, protyle: IProtyle, nodeElement
};
export const hintRenderWidget = (value: string, protyle: IProtyle) => {
+ window.sout.tracker("invoked");
focusByRange(protyle.toolbar.range);
// src 地址以 / 结尾
// Use the path ending with `/` when loading the widget https://github.com/siyuan-note/siyuan/issues/10520
@@ -449,6 +456,7 @@ export const hintRenderWidget = (value: string, protyle: IProtyle) => {
};
export const hintRenderAssets = (value: string, protyle: IProtyle) => {
+ window.sout.tracker("invoked");
focusByRange(protyle.toolbar.range);
const type = pathPosix().extname(value).toLowerCase();
const filename = value.startsWith("assets/") ? getAssetName(value) : value;
@@ -457,6 +465,7 @@ export const hintRenderAssets = (value: string, protyle: IProtyle) => {
};
export const hintMoveBlock = (pathString: string, sourceElements: Element[], protyle: IProtyle) => {
+ window.sout.tracker("invoked");
if (pathString === "/") {
return;
}
diff --git a/app/src/protyle/hint/index.ts b/app/src/protyle/hint/index.ts
index 0b0b8f5783..c87354bddd 100644
--- a/app/src/protyle/hint/index.ts
+++ b/app/src/protyle/hint/index.ts
@@ -305,22 +305,22 @@ ${unicode2Emoji(emoji.unicode)}`;
return;
}
event.stopPropagation();
- this.genSearchHTML(protyle, searchElement, nodeElement, oldValue);
+ this.genSearchHTML(protyle, searchElement, nodeElement, oldValue, source);
});
searchElement.addEventListener("compositionend", (event: InputEvent) => {
event.stopPropagation();
- this.genSearchHTML(protyle, searchElement, nodeElement, oldValue);
+ this.genSearchHTML(protyle, searchElement, nodeElement, oldValue, source);
});
}
}
- private genSearchHTML(protyle: IProtyle, searchElement: HTMLInputElement, nodeElement: false | HTMLElement, oldValue: string) {
+ private genSearchHTML(protyle: IProtyle, searchElement: HTMLInputElement, nodeElement: false | HTMLElement, oldValue: string, source: THintSource) {
this.element.lastElementChild.innerHTML = '
';
fetchPost("/api/search/searchRefBlock", {
k: searchElement.value,
id: nodeElement ? nodeElement.getAttribute("data-node-id") : protyle.block.parentID,
beforeLen: Math.floor((Math.max(protyle.element.clientWidth / 2, 320) - 58) / 28.8),
- rootID: protyle.block.rootID,
+ rootID: source === "av" ? "" : protyle.block.rootID,
}, (response) => {
let searchHTML = "";
if (response.data.newDoc) {
diff --git a/app/src/protyle/preview/image.ts b/app/src/protyle/preview/image.ts
index 66447a3cf8..ce3907d977 100644
--- a/app/src/protyle/preview/image.ts
+++ b/app/src/protyle/preview/image.ts
@@ -3,6 +3,7 @@ import {addScript} from "../util/addScript";
import {fetchPost} from "../../util/fetch";
export const previewImage = (src: string) => {
+ window.sout.tracker("invoked");
addScript(`${Constants.PROTYLE_CDN}/js/viewerjs/viewer.js?v=1.10.4`, "protyleViewerScript").then(() => {
const imagesElement = document.createElement("ul");
imagesElement.innerHTML = `
`;
@@ -42,6 +43,7 @@ export const previewImage = (src: string) => {
};
export const previewDocImage = (src: string, id: string) => {
+ window.sout.tracker("invoked");
addScript(`${Constants.PROTYLE_CDN}/js/viewerjs/viewer.js?v=1.10.4`, "protyleViewerScript").then(() => {
fetchPost("/api/asset/getDocImageAssets", {id}, (response) => {
const imagesElement = document.createElement("ul");
diff --git a/app/src/protyle/preview/index.ts b/app/src/protyle/preview/index.ts
index bec179f1c2..fa069236ee 100644
--- a/app/src/protyle/preview/index.ts
+++ b/app/src/protyle/preview/index.ts
@@ -10,9 +10,8 @@ import {getSearch, isMobile} from "../../util/functions";
import {shell} from "electron";
/// #endif
/// #if !MOBILE
-import {openAsset, openBy, updateOutline} from "../../editor/util";
+import {openAsset, openBy} from "../../editor/util";
import {getAllModels} from "../../layout/getAll";
-import {setPanelFocus} from "../../layout/util";
/// #endif
import {fetchPost} from "../../util/fetch";
import {processRender} from "../util/processCode";
@@ -74,10 +73,6 @@ export class Preview {
this.element.appendChild(previewElement);
this.element.addEventListener("click", (event) => {
- if (protyle.model) {
- setPanelFocus(protyle.model.element.parentElement.parentElement);
- updateOutline(getAllModels(), protyle.model.editor.protyle);
- }
let target = event.target as HTMLElement;
while (target && !target.isEqualNode(this.element)) {
if (target.tagName === "A") {
diff --git a/app/src/protyle/render/abcRender.ts b/app/src/protyle/render/abcRender.ts
index c7ab4ff914..9adc14e3c9 100644
--- a/app/src/protyle/render/abcRender.ts
+++ b/app/src/protyle/render/abcRender.ts
@@ -4,6 +4,7 @@ import {genIconHTML} from "./util";
import {hasClosestByClassName} from "../util/hasClosest";
export const abcRender = (element: Element, cdn = Constants.PROTYLE_CDN) => {
+ window.sout.tracker("invoked");
let abcElements: Element[] = [];
if (element.getAttribute("data-subtype") === "abc") {
// 编辑器内代码块编辑渲染
diff --git a/app/src/protyle/render/av/action.ts b/app/src/protyle/render/av/action.ts
index 505549396b..e3b20bb68d 100644
--- a/app/src/protyle/render/av/action.ts
+++ b/app/src/protyle/render/av/action.ts
@@ -9,7 +9,7 @@ import {
getTypeByCellElement,
popTextCell,
renderCell,
- renderCellAttr,
+ renderCellAttr, updateCellsValue,
updateHeaderCell
} from "./cell";
import {getColIconByType, showColMenu} from "./col";
@@ -36,6 +36,7 @@ import {addView, openViewMenu} from "./view";
import {isOnlyMeta, openByMobile, writeText} from "../../util/compatibility";
export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLElement }) => {
+ window.sout.tracker("invoked");
const blockElement = hasClosestBlock(event.target);
if (!blockElement) {
return false;
@@ -276,6 +277,7 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
};
export const avContextmenu = (protyle: IProtyle, rowElement: HTMLElement, position: IPosition) => {
+ window.sout.tracker("invoked");
if (rowElement.classList.contains("av__row--header")) {
return false;
}
@@ -304,18 +306,27 @@ export const avContextmenu = (protyle: IProtyle, rowElement: HTMLElement, positi
rowElement.querySelector(".av__firstcol use").setAttribute("xlink:href", "#iconCheck");
const rowElements = blockElement.querySelectorAll(".av__row--select:not(.av__row--header)");
updateHeader(rowElement);
- if (rowElements.length === 1 && !rowElements[0].querySelector('[data-detached="true"]')) {
- openEditorTab(protyle.app, rowElements[0].getAttribute("data-id"));
+ const keyCellElement = rowElements[0].querySelector(".av__cell[data-block-id]") as HTMLElement;
+ if (rowElements.length === 1 && keyCellElement.getAttribute("data-detached") !== "true") {
+ const blockId = rowElements[0].getAttribute("data-id");
+ openEditorTab(protyle.app, blockId);
menu.addItem({
label: window.siyuan.languages.copy,
icon: "iconCopy",
type: "submenu",
- submenu: copySubMenu(rowElements[0].getAttribute("data-id"))
+ submenu: copySubMenu(blockId)
+ });
+ menu.addItem({
+ label: window.siyuan.languages.unbindBlock,
+ icon: "iconLinkOff",
+ click() {
+ updateCellsValue(protyle, blockElement, keyCellElement.querySelector(".av__celltext").textContent, [keyCellElement]);
+ }
});
}
if (!protyle.disabled) {
if (rowElements.length === 1) {
- if (!rowElements[0].querySelector('[data-detached="true"]')) {
+ if (keyCellElement.getAttribute("data-detached") !== "true") {
menu.addSeparator();
}
menu.addItem({
@@ -419,6 +430,7 @@ ${window.siyuan.languages.insertRowAfter.replace("${x}", '
{
+ window.sout.tracker("invoked");
if (headerValue) {
updateHeaderCell(cellElement, headerValue);
} else {
@@ -480,6 +493,7 @@ export const updateAttrViewCellAnimation = (cellElement: HTMLElement, value: IAV
};
export const removeAttrViewColAnimation = (blockElement: Element, id: string) => {
+ window.sout.tracker("invoked");
blockElement.querySelectorAll(`.av__cell[data-col-id="${id}"]`).forEach(item => {
item.remove();
});
diff --git a/app/src/protyle/render/av/asset.ts b/app/src/protyle/render/av/asset.ts
index 4ba0ca5beb..7665d2a3f9 100644
--- a/app/src/protyle/render/av/asset.ts
+++ b/app/src/protyle/render/av/asset.ts
@@ -23,6 +23,7 @@ export const bindAssetEvent = (options: {
cellElements: HTMLElement[],
blockElement: Element
}) => {
+ window.sout.tracker("invoked");
options.menuElement.querySelector("input").addEventListener("change", (event: InputEvent & {
target: HTMLInputElement
}) => {
@@ -52,6 +53,7 @@ export const bindAssetEvent = (options: {
};
export const getAssetHTML = (cellElements: HTMLElement[]) => {
+ window.sout.tracker("invoked");
let html = "";
genCellValueByElement("mAsset", cellElements[0]).mAsset.forEach(item => {
if (!item.content) {
@@ -100,6 +102,7 @@ export const updateAssetCell = (options: {
removeContent?: string,
blockElement: Element
}) => {
+ window.sout.tracker("invoked");
const colId = options.cellElements[0].dataset.colId;
const cellDoOperations: IOperation[] = [];
const cellUndoOperations: IOperation[] = [];
@@ -200,6 +203,7 @@ export const updateAssetCell = (options: {
};
export const editAssetItem = (protyle: IProtyle, data: IAV, cellElements: HTMLElement[], target: HTMLElement, blockElement: Element) => {
+ window.sout.tracker("invoked");
const linkAddress = target.dataset.content;
const type = target.dataset.type as "image" | "file";
const menu = new Menu("av-asset-edit", () => {
@@ -271,6 +275,7 @@ export const editAssetItem = (protyle: IProtyle, data: IAV, cellElements: HTMLEl
};
export const addAssetLink = (protyle: IProtyle, data: IAV, cellElements: HTMLElement[], target: HTMLElement, blockElement: Element) => {
+ window.sout.tracker("invoked");
const menu = new Menu("av-asset-link", () => {
const textElements = menu.element.querySelectorAll("textarea");
if (!textElements[0].value) {
@@ -311,6 +316,7 @@ ${window.siyuan.languages.title}
};
export const dragUpload = (files: string[], protyle: IProtyle, cellElement: HTMLElement, avID: string) => {
+ window.sout.tracker("invoked");
const msgId = showMessage(window.siyuan.languages.uploading, 0);
fetchPost("/api/asset/insertLocalAssets", {
assetPaths: files,
diff --git a/app/src/protyle/render/av/blockAttr.ts b/app/src/protyle/render/av/blockAttr.ts
index 7695e4fbe0..f20ac5decf 100644
--- a/app/src/protyle/render/av/blockAttr.ts
+++ b/app/src/protyle/render/av/blockAttr.ts
@@ -10,6 +10,7 @@ import {transaction} from "../../wysiwyg/transaction";
import {openMenuPanel} from "./openMenuPanel";
const genAVRollupHTML = (value: IAVCellValue) => {
+ window.sout.tracker("invoked");
let html = "";
switch (value.type) {
case "block":
@@ -50,6 +51,7 @@ const genAVRollupHTML = (value: IAVCellValue) => {
};
export const genAVValueHTML = (value: IAVCellValue) => {
+ window.sout.tracker("invoked");
let html = "";
switch (value.type) {
case "block":
@@ -142,6 +144,7 @@ export const genAVValueHTML = (value: IAVCellValue) => {
};
export const renderAVAttribute = (element: HTMLElement, id: string, protyle: IProtyle, cb?: (element: HTMLElement) => void) => {
+ window.sout.tracker("invoked");
fetchPost("/api/av/getAttributeViewKeys", {id}, (response) => {
let html = "";
response.data.forEach((table: {
@@ -176,7 +179,7 @@ export const renderAVAttribute = (element: HTMLElement, id: string, protyle: IPr
table.keyValues?.forEach(item => {
html += `
-
+
${item.key.icon ? unicode2Emoji(item.key.icon, "block__logoicon", true) : ``}
${item.key.name}
@@ -327,14 +330,12 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
event.preventDefault();
break;
} else if (type === "editCol") {
- if (target.classList.contains("fn__pointer")) {
- openMenuPanel({
- protyle,
- blockElement,
- type: "edit",
- colId: target.parentElement.dataset.colId
- });
- }
+ openMenuPanel({
+ protyle,
+ blockElement,
+ type: "edit",
+ colId: target.parentElement.dataset.colId
+ });
event.stopPropagation();
event.preventDefault();
break;
diff --git a/app/src/protyle/render/av/calc.ts b/app/src/protyle/render/av/calc.ts
index 844ff9911f..489d09d4fc 100644
--- a/app/src/protyle/render/av/calc.ts
+++ b/app/src/protyle/render/av/calc.ts
@@ -14,6 +14,7 @@ const calcItem = (options: {
avId: string,
blockID: string
}) => {
+ window.sout.tracker("invoked");
options.menu.addItem({
iconHTML: "",
label: getNameByOperator(options.operator, !!options.data),
@@ -80,6 +81,7 @@ export const openCalcMenu = async (protyle: IProtyle, calcElement: HTMLElement,
colId: string,
blockID: string
}) => {
+ window.sout.tracker("invoked");
let rowElement: HTMLElement | false;
let type;
let colId: string;
@@ -393,6 +395,7 @@ export const openCalcMenu = async (protyle: IProtyle, calcElement: HTMLElement,
};
export const getCalcValue = (column: IAVColumn) => {
+ window.sout.tracker("invoked");
if (!column.calc || !column.calc.result) {
return "";
}
@@ -465,6 +468,7 @@ export const getCalcValue = (column: IAVColumn) => {
};
export const getNameByOperator = (operator: string, isRollup: boolean) => {
+ window.sout.tracker("invoked");
switch (operator) {
case undefined:
case "":
diff --git a/app/src/protyle/render/av/cell.ts b/app/src/protyle/render/av/cell.ts
index a48eb41b8b..9e8b707f70 100644
--- a/app/src/protyle/render/av/cell.ts
+++ b/app/src/protyle/render/av/cell.ts
@@ -15,6 +15,7 @@ import {Constants} from "../../../constants";
import {hintRef} from "../../hint/extend";
const renderCellURL = (urlContent: string) => {
+ window.sout.tracker("invoked");
let host = urlContent;
let suffix = "";
try {
@@ -34,6 +35,7 @@ const renderCellURL = (urlContent: string) => {
};
export const getCellText = (cellElement: HTMLElement | false) => {
+ window.sout.tracker("invoked");
if (!cellElement) {
return "";
}
@@ -57,6 +59,7 @@ export const getCellText = (cellElement: HTMLElement | false) => {
};
export const genCellValueByElement = (colType: TAVCol, cellElement: HTMLElement) => {
+ window.sout.tracker("invoked");
const cellValue: IAVCellValue = {
type: colType,
id: cellElement.dataset.id,
@@ -130,6 +133,7 @@ export const genCellValueByElement = (colType: TAVCol, cellElement: HTMLElement)
};
export const genCellValue = (colType: TAVCol, value: string | any) => {
+ window.sout.tracker("invoked");
let cellValue: IAVCellValue = {
type: colType,
[colType === "select" ? "mSelect" : colType]: value as IAVCellDateValue
@@ -242,6 +246,7 @@ export const genCellValue = (colType: TAVCol, value: string | any) => {
};
export const cellScrollIntoView = (blockElement: HTMLElement, cellElement: Element, onlyHeight = true) => {
+ window.sout.tracker("invoked");
const cellRect = cellElement.getBoundingClientRect();
if (!onlyHeight) {
const avScrollElement = blockElement.querySelector(".av__scroll");
@@ -298,6 +303,7 @@ export const cellScrollIntoView = (blockElement: HTMLElement, cellElement: Eleme
};
export const getTypeByCellElement = (cellElement: Element) => {
+ window.sout.tracker("invoked");
const scrollElement = hasClosestByClassName(cellElement, "av__scroll");
if (!scrollElement) {
return;
@@ -306,6 +312,7 @@ export const getTypeByCellElement = (cellElement: Element) => {
};
export const popTextCell = (protyle: IProtyle, cellElements: HTMLElement[], type?: TAVCol) => {
+ window.sout.tracker("invoked");
if (cellElements.length === 0 || (cellElements.length === 1 && !cellElements[0])) {
return;
}
@@ -441,7 +448,8 @@ export const popTextCell = (protyle: IProtyle, cellElements: HTMLElement[], type
});
}
avMaskElement.addEventListener("click", (event) => {
- if ((event.target as HTMLElement).classList.contains("av__mask")) {
+ if ((event.target as HTMLElement).classList.contains("av__mask")
+ && document.activeElement.tagName !== "TEXTAREA" && document.activeElement.tagName !== "INPUT") {
updateCellValueByInput(protyle, type, blockElement, cellElements);
avMaskElement?.remove();
}
@@ -449,6 +457,7 @@ export const popTextCell = (protyle: IProtyle, cellElements: HTMLElement[], type
};
const updateCellValueByInput = (protyle: IProtyle, type: TAVCol, blockElement: HTMLElement, cellElements: HTMLElement[]) => {
+ window.sout.tracker("invoked");
const rowElement = hasClosestByClassName(cellElements[0], "av__row");
if (!rowElement) {
return;
@@ -497,6 +506,7 @@ const updateCellValueByInput = (protyle: IProtyle, type: TAVCol, blockElement: H
};
export const updateCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, value?: any, cElements?: HTMLElement[]) => {
+ window.sout.tracker("invoked");
const doOperations: IOperation[] = [];
const undoOperations: IOperation[] = [];
@@ -610,6 +620,7 @@ export const updateCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, va
};
export const renderCellAttr = (cellElement: Element, value: IAVCellValue) => {
+ window.sout.tracker("invoked");
if (value.type === "checkbox") {
if (value.checkbox.checked) {
cellElement.classList.add("av__cell-check");
@@ -627,6 +638,7 @@ export const renderCellAttr = (cellElement: Element, value: IAVCellValue) => {
};
export const renderCell = (cellValue: IAVCellValue) => {
+ window.sout.tracker("invoked");
let text = "";
if (["text", "template"].includes(cellValue.type)) {
text = `
${cellValue ? (cellValue[cellValue.type as "text"].content || "") : ""}`;
@@ -703,6 +715,7 @@ export const renderCell = (cellValue: IAVCellValue) => {
};
const renderRollup = (cellValue: IAVCellValue) => {
+ window.sout.tracker("invoked");
let text = "";
if (["text"].includes(cellValue.type)) {
text = cellValue ? (cellValue[cellValue.type as "text"].content || "") : "";
@@ -726,11 +739,15 @@ const renderRollup = (cellValue: IAVCellValue) => {
text = cellValue?.number.formattedContent || cellValue?.number.content.toString() || "";
} else if (cellValue.type === "date") {
const dataValue = cellValue ? cellValue.date : null;
- if (dataValue && dataValue.isNotEmpty) {
- text += formatDate(dataValue.content, dataValue.isNotTime ? "yyyy-MM-dd" : "yyyy-MM-dd HH:mm");
- }
- if (dataValue && dataValue.hasEndDate && dataValue.isNotEmpty && dataValue.isNotEmpty2) {
- text += `
${formatDate(dataValue.content2, dataValue.isNotTime ? "yyyy-MM-dd" : "yyyy-MM-dd HH:mm")}`;
+ if (dataValue.formattedContent) {
+ text = dataValue.formattedContent;
+ } else {
+ if (dataValue && dataValue.isNotEmpty) {
+ text = formatDate(dataValue.content, dataValue.isNotTime ? "yyyy-MM-dd" : "yyyy-MM-dd HH:mm");
+ }
+ if (dataValue && dataValue.hasEndDate && dataValue.isNotEmpty && dataValue.isNotEmpty2) {
+ text = `
${formatDate(dataValue.content2, dataValue.isNotTime ? "yyyy-MM-dd" : "yyyy-MM-dd HH:mm")}`;
+ }
}
if (text) {
text = `
${text}`;
@@ -744,6 +761,7 @@ export const updateHeaderCell = (cellElement: HTMLElement, headerValue: {
name?: string,
pin?: boolean,
}) => {
+ window.sout.tracker("invoked");
if (typeof headerValue.icon !== "undefined") {
cellElement.dataset.icon = headerValue.icon;
cellElement.querySelector(".av__cellheadericon").outerHTML = headerValue.icon ? unicode2Emoji(headerValue.icon, "av__cellheadericon", true) : ``;
@@ -764,6 +782,7 @@ export const updateHeaderCell = (cellElement: HTMLElement, headerValue: {
};
export const getPositionByCellElement = (cellElement: HTMLElement) => {
+ window.sout.tracker("invoked");
let rowElement = hasClosestByClassName(cellElement, "av__row");
if (!rowElement) {
return;
@@ -787,6 +806,7 @@ export const getPositionByCellElement = (cellElement: HTMLElement) => {
export const dragFillCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, originData: {
[key: string]: IAVCellValue[]
}, originCellIds: string[]) => {
+ window.sout.tracker("invoked");
nodeElement.querySelector(".av__drag-fill")?.remove();
const newData: { [key: string]: Array
} = {};
nodeElement.querySelectorAll(".av__cell--active").forEach((item: HTMLElement) => {
@@ -854,9 +874,12 @@ export const dragFillCellsValue = (protyle: IProtyle, nodeElement: HTMLElement,
};
export const addDragFill = (cellElement: Element) => {
+ window.sout.tracker("invoked");
if (!cellElement) {
return;
}
cellElement.classList.add("av__cell--active");
- cellElement.insertAdjacentHTML("beforeend", ``);
+ if (!cellElement.querySelector(".av__drag-fill")) {
+ cellElement.insertAdjacentHTML("beforeend", ``);
+ }
};
diff --git a/app/src/protyle/render/av/col.ts b/app/src/protyle/render/av/col.ts
index ef6d87b91a..a837ac89ca 100644
--- a/app/src/protyle/render/av/col.ts
+++ b/app/src/protyle/render/av/col.ts
@@ -13,29 +13,36 @@ import {bindRollupData, getRollupHTML} from "./rollup";
import {Constants} from "../../../constants";
// import * as dayjs from "dayjs";
import {formatDate} from "sofill/mid";
+import {setPosition} from "../../../util/setPosition";
export const duplicateCol = (options: {
protyle: IProtyle,
- type: TAVCol,
- avID: string,
colId: string,
- newValue: string,
- icon: string
viewID: string,
- blockElement: Element
+ blockElement: Element,
+ data: IAV,
}) => {
- const id = Lute.NewNodeID();
- const nameMatch = options.newValue.match(/^(.*) \((\d+)\)$/);
+ window.sout.tracker("invoked");
+ let newColData: IAVColumn;
+ options.data.view.columns.find((item: IAVColumn, index) => {
+ if (item.id === options.colId) {
+ newColData = JSON.parse(JSON.stringify(item));
+ options.data.view.columns.splice(index + 1, 0, newColData);
+ return true;
+ }
+ });
+ const nameMatch = newColData.name.match(/^(.*) \((\d+)\)$/);
if (nameMatch) {
- options.newValue = `${nameMatch[1]} (${parseInt(nameMatch[2]) + 1})`;
+ newColData.name = `${nameMatch[1]} (${parseInt(nameMatch[2]) + 1})`;
} else {
- options.newValue = `${options.newValue} (1)`;
+ newColData.name = `${newColData.name} (1)`;
}
+ newColData.id = Lute.NewNodeID();
const newUpdated = formatDate(new Date(), 'yyyyMMddHHmmss');
const blockId = options.blockElement.getAttribute("data-node-id");
- if (["select", "mSelect", "rollup"].includes(options.type)) {
+ if (["select", "mSelect", "rollup"].includes(newColData.type)) {
fetchPost("/api/av/renderAttributeView", {
- id: options.avID,
+ id: options.data.id,
viewID: options.viewID
}, (response) => {
const data = response.data as IAV;
@@ -48,16 +55,16 @@ export const duplicateCol = (options: {
});
transaction(options.protyle, [{
action: "addAttrViewCol",
- name: options.newValue,
- avID: options.avID,
- type: options.type,
- data: options.icon,
+ name: newColData.name,
+ avID: options.data.id,
+ type: newColData.type,
+ data: newColData.icon,
previousID: options.colId,
- id
+ id: newColData.id
}, {
action: "updateAttrViewColOptions",
- id,
- avID: options.avID,
+ id: newColData.id,
+ avID: options.data.id,
data: colOptions
}, {
action: "doUpdateUpdated",
@@ -65,8 +72,8 @@ export const duplicateCol = (options: {
data: newUpdated,
}], [{
action: "removeAttrViewCol",
- id,
- avID: options.avID,
+ id: newColData.id,
+ avID: options.data.id,
}, {
action: "doUpdateUpdated",
id: blockId,
@@ -76,11 +83,11 @@ export const duplicateCol = (options: {
} else {
transaction(options.protyle, [{
action: "addAttrViewCol",
- name: options.newValue,
- avID: options.avID,
- type: options.type,
- data: options.icon,
- id,
+ name: newColData.name,
+ avID: options.data.id,
+ type: newColData.type,
+ data: newColData.icon,
+ id: newColData.id,
previousID: options.colId,
}, {
action: "doUpdateUpdated",
@@ -88,8 +95,8 @@ export const duplicateCol = (options: {
data: newUpdated,
}], [{
action: "removeAttrViewCol",
- id,
- avID: options.avID,
+ id: newColData.id,
+ avID: options.data.id,
}, {
action: "doUpdateUpdated",
id: blockId,
@@ -99,11 +106,12 @@ export const duplicateCol = (options: {
addAttrViewColAnimation({
blockElement: options.blockElement,
protyle: options.protyle,
- type: options.type,
- name: options.newValue,
- icon: options.icon,
+ type: newColData.type,
+ name: newColData.name,
+ icon: newColData.icon,
previousID: options.colId,
- id
+ data: options.data,
+ id: newColData.id,
});
options.blockElement.setAttribute("updated", newUpdated);
};
@@ -114,6 +122,7 @@ export const getEditHTML = (options: {
data: IAV,
isCustomAttr: boolean
}) => {
+ window.sout.tracker("invoked");
let colData: IAVColumn;
options.data.view.columns.find((item) => {
if (item.id === options.colId) {
@@ -132,7 +141,7 @@ export const getEditHTML = (options: {
${colData.icon ? unicode2Emoji(colData.icon) : ``}
-`;
} else if (colData.type === "rollup") {
- html += getRollupHTML({colData});
+ html += '' + getRollupHTML({colData});
+ } else if (colData.type === "date") {
+ html += `
+`;
+ }
+ if (colData.type !== "block") {
+ html += `
+
+
+`;
}
return `
`;
};
export const bindEditEvent = (options: {
protyle: IProtyle,
data: IAV,
+ blockID: string,
menuElement: HTMLElement,
isCustomAttr: boolean
}) => {
+ window.sout.tracker("invoked");
const avID = options.data.id;
const colId = options.menuElement.querySelector(".b3-menu__item").getAttribute("data-col-id");
const colData = options.data.view.columns.find((item: IAVColumn) => item.id === colId);
@@ -313,6 +340,24 @@ export const bindEditEvent = (options: {
});
}
+ const wrapElement = options.menuElement.querySelector('.b3-switch[data-type="wrap"]') as HTMLInputElement;
+ if (wrapElement) {
+ wrapElement.addEventListener("change", () => {
+ transaction(options.protyle, [{
+ action: "setAttrViewColWrap",
+ id: colId,
+ avID,
+ data: wrapElement.checked,
+ blockID: options.blockID
+ }], [{
+ action: "setAttrViewColWrap",
+ id: colId,
+ avID,
+ data: !wrapElement.checked,
+ blockID: options.blockID
+ }]);
+ });
+ }
const addOptionElement = options.menuElement.querySelector('[data-type="addOption"]') as HTMLInputElement;
if (addOptionElement) {
addOptionElement.addEventListener("keydown", (event: KeyboardEvent) => {
@@ -358,13 +403,31 @@ export const bindEditEvent = (options: {
protyle: options.protyle,
menuElement: options.menuElement,
data: options.data,
- isCustomAttr: options.isCustomAttr
+ isCustomAttr: options.isCustomAttr,
+ blockID: options.blockID
});
(options.menuElement.querySelector('[data-type="addOption"]') as HTMLInputElement).focus();
}
});
}
+ const fillCreatedElement = options.menuElement.querySelector('[data-type="fillCreated"]') as HTMLInputElement;
+ if (fillCreatedElement) {
+ fillCreatedElement.addEventListener("change", () => {
+ transaction(options.protyle, [{
+ avID,
+ action: "setAttrViewColDate",
+ id: colId,
+ data: fillCreatedElement.checked
+ }], [{
+ avID,
+ action: "setAttrViewColDate",
+ id: colId,
+ data: !fillCreatedElement.checked
+ }]);
+ });
+ }
+
const backRelationElement = options.menuElement.querySelector('[data-type="backRelation"]') as HTMLInputElement;
if (backRelationElement) {
backRelationElement.addEventListener("change", () => {
@@ -396,6 +459,7 @@ export const bindEditEvent = (options: {
};
export const getColNameByType = (type: TAVCol) => {
+ window.sout.tracker("invoked");
switch (type) {
case "text":
case "number":
@@ -421,10 +485,13 @@ export const getColNameByType = (type: TAVCol) => {
return window.siyuan.languages.assets;
case "checkbox":
return window.siyuan.languages.checkbox;
+ case "block":
+ return window.siyuan.languages["_attrView"].key;
}
};
export const getColIconByType = (type: TAVCol) => {
+ window.sout.tracker("invoked");
switch (type) {
case "text":
return "iconAlignLeft";
@@ -467,11 +534,14 @@ const addAttrViewColAnimation = (options: {
name: string,
id: string,
icon?: string,
- previousID: string
+ previousID: string,
+ data?: IAV
}) => {
+ window.sout.tracker("invoked");
if (!options.blockElement) {
return;
}
+ const nodeId = options.blockElement.getAttribute("data-node-id");
if (options.blockElement.classList.contains("av")) {
options.blockElement.querySelectorAll(".av__row").forEach((item, index) => {
let previousElement;
@@ -494,10 +564,9 @@ const addAttrViewColAnimation = (options: {
previousElement.insertAdjacentHTML("afterend", html);
});
} else {
- const nodeId = options.blockElement.getAttribute("data-node-id");
options.blockElement.querySelector(".fn__hr").insertAdjacentHTML("beforebegin", `
-
+
${getColNameByType(options.type)}
@@ -506,6 +575,27 @@ const addAttrViewColAnimation = (options: {
`);
}
+ const menuElement = document.querySelector(".av__panel .b3-menu") as HTMLElement;
+ if (menuElement && options.data && options.blockElement.classList.contains("av")) {
+ menuElement.innerHTML = getEditHTML({
+ protyle: options.protyle,
+ data: options.data,
+ colId: options.id,
+ isCustomAttr: false
+ });
+ bindEditEvent({
+ protyle: options.protyle,
+ data: options.data,
+ menuElement,
+ isCustomAttr: false,
+ blockID: nodeId
+ });
+ const tabRect = options.blockElement.querySelector(".av__views").getBoundingClientRect();
+ if (tabRect) {
+ setPosition(menuElement, tabRect.right - menuElement.clientWidth, tabRect.bottom, tabRect.height);
+ }
+ return;
+ }
openMenuPanel({
protyle: options.protyle,
blockElement: options.blockElement,
@@ -513,13 +603,14 @@ const addAttrViewColAnimation = (options: {
colId: options.id,
editData: {
previousID: options.previousID,
- colData: genColDataByType(options.type, options.id),
+ colData: genColDataByType(options.type, options.id, options.name),
}
});
window.siyuan.menus.menu.remove();
};
export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElement: HTMLElement) => {
+ window.sout.tracker("invoked");
const type = cellElement.getAttribute("data-dtype") as TAVCol;
const colId = cellElement.getAttribute("data-col-id");
const avID = blockElement.getAttribute("data-av-id");
@@ -591,27 +682,25 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
});
}
});
- if (type !== "block") {
- menu.addItem({
- icon: "iconEdit",
- label: window.siyuan.languages.edit,
- click() {
- const colName = (menu.element.querySelector(".b3-text-field") as HTMLInputElement).value;
- openMenuPanel({
- protyle,
- blockElement,
- type: "edit",
- colId,
- cb(avElement) {
- // 修改名字后点击编辑,需要更新名字
- const editNameElement = avElement.querySelector('.b3-text-field[data-type="name"]') as HTMLInputElement;
- editNameElement.value = colName;
- editNameElement.select();
- }
- });
- }
- });
- }
+ menu.addItem({
+ icon: "iconEdit",
+ label: window.siyuan.languages.edit,
+ click() {
+ const colName = (menu.element.querySelector(".b3-text-field") as HTMLInputElement).value;
+ openMenuPanel({
+ protyle,
+ blockElement,
+ type: "edit",
+ colId,
+ cb(avElement) {
+ // 修改名字后点击编辑,需要更新名字
+ const editNameElement = avElement.querySelector('.b3-text-field[data-type="name"]') as HTMLInputElement;
+ editNameElement.value = colName;
+ editNameElement.select();
+ }
+ });
+ }
+ });
menu.addSeparator();
menu.addItem({
icon: "iconUp",
@@ -772,15 +861,16 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
icon: "iconCopy",
label: window.siyuan.languages.duplicate,
click() {
- duplicateCol({
- blockElement,
- viewID: blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
- protyle,
- type,
- avID,
- colId,
- icon: menu.element.querySelector(".block__icon").getAttribute("data-icon"),
- newValue: (window.siyuan.menus.menu.element.querySelector(".b3-text-field") as HTMLInputElement).value
+ fetchPost("/api/av/renderAttributeView", {
+ id: avID,
+ }, (response) => {
+ duplicateCol({
+ blockElement,
+ viewID: blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
+ protyle,
+ colId,
+ data: response.data
+ });
});
}
});
@@ -817,8 +907,8 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
menu.addSeparator();
}
menu.addItem({
- label: `
`,
+ label: `
`,
bind(element) {
const inputElement = element.querySelector("input") as HTMLInputElement;
inputElement.addEventListener("change", () => {
@@ -851,8 +941,9 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
}
};
-const genUpdateColItem = (type: TAVCol, oldType: TAVCol, name: string) => {
- return `