From a10e701cc9006e24ba9991c1031c22458bcef297 Mon Sep 17 00:00:00 2001 From: Kuingsmile <96409857+Kuingsmile@users.noreply.github.com> Date: Sun, 25 Jan 2026 18:25:52 +0800 Subject: [PATCH] :sparkles: Feature(custom): support open and edit config file in software --- currentVersion.md | 5 +- package.json | 8 + src/main/events/rpc/routes/setting/mainApp.ts | 18 ++ src/main/events/rpc/routes/system/window.ts | 7 + src/main/utils/enum.ts | 3 + src/renderer/components/Editor.vue | 99 +++++++++++ src/renderer/i18n/locales/en.json | 6 + src/renderer/i18n/locales/zh-CN.json | 6 + src/renderer/i18n/locales/zh-TW.json | 6 + src/renderer/pages/PicGoSetting.vue | 61 ++++++- src/renderer/utils/enum.ts | 3 + yarn.lock | 168 ++++++++++++++++++ 12 files changed, 387 insertions(+), 3 deletions(-) create mode 100644 src/renderer/components/Editor.vue diff --git a/currentVersion.md b/currentVersion.md index a75196d3..98727d28 100644 --- a/currentVersion.md +++ b/currentVersion.md @@ -9,12 +9,13 @@ #### ⚙️ 核心功能 -- 现在支持手动关闭 GPU 加速,解决部分硬件兼容性导致的黑屏或闪烁问题。 -- 新增高级动画设置,开启后可获得更佳的 UI 交互体验。 +- 现在支持软件内编辑配置文件并保存 - Windows 便携模式,无需安装运行,数据存储在程序目录下的 `data` 文件夹中,且支持自动更新。 - Linux 新增 `rpm` 安装包。 - 新增图床编辑卡片页面,解决多配置切换时的混乱问题。 - 文件浏览页面新增列表模式支持。 +- 现在支持手动关闭 GPU 加速,解决部分硬件兼容性导致的黑屏或闪烁问题。 +- 新增高级动画设置,开启后可获得更佳的 UI 交互体验。 #### 🎨 UI 界面 diff --git a/package.json b/package.json index 39a4a8ae..ebeb6ff0 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,13 @@ "yaml": "^2.8.2" }, "devDependencies": { + "@codemirror/commands": "^6.10.1", + "@codemirror/lang-javascript": "^6.2.4", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/search": "^6.6.0", + "@codemirror/state": "^6.5.4", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.39.11", "@electron/notarize": "^3.1.1", "@eslint/js": "^9.39.2", "@headlessui/vue": "^1.7.23", @@ -105,6 +112,7 @@ "@vitejs/plugin-vue": "^6.0.3", "@vueuse/core": "^14.1.0", "baseline-browser-mapping": "^2.9.13", + "codemirror": "^6.0.2", "dexie": "^3.2.4", "dotenv": "^17.2.3", "dpdm": "^3.14.0", diff --git a/src/main/events/rpc/routes/setting/mainApp.ts b/src/main/events/rpc/routes/setting/mainApp.ts index 72c2b09e..369c779f 100644 --- a/src/main/events/rpc/routes/setting/mainApp.ts +++ b/src/main/events/rpc/routes/setting/mainApp.ts @@ -42,6 +42,24 @@ export default [ shell.openPath(abFilePath) }, }, + { + action: IRPCActionType.READ_FILE_CONTENT, + handler: async (_: IIPCEvent, args: [fileName: string]) => { + const abFilePath = path.join(STORE_PATH, args[0]) + if (!fs.existsSync(abFilePath)) { + fs.writeFileSync(abFilePath, '') + } + return fs.readFileSync(abFilePath, 'utf-8') + }, + type: IRPCType.INVOKE, + }, + { + action: IRPCActionType.WRITE_FILE_CONTENT, + handler: async (_: IIPCEvent, args: [fileName: string, content: string]) => { + const abFilePath = path.join(STORE_PATH, args[0]) + fs.writeFileSync(abFilePath, args[1], 'utf-8') + }, + }, { action: IRPCActionType.PICLIST_OPEN_DIRECTORY, handler: async (_: IIPCEvent, args: [dirPath?: string, inStorePath?: boolean]) => { diff --git a/src/main/events/rpc/routes/system/window.ts b/src/main/events/rpc/routes/system/window.ts index 5ec0882c..ab48f03a 100644 --- a/src/main/events/rpc/routes/system/window.ts +++ b/src/main/events/rpc/routes/system/window.ts @@ -138,4 +138,11 @@ export default [ }) }, }, + { + action: IRPCActionType.RELOAD_WINDOW, + handler: async () => { + const window = BrowserWindow.getFocusedWindow() + window?.webContents.reload() + }, + }, ] diff --git a/src/main/utils/enum.ts b/src/main/utils/enum.ts index 71731153..4c98cfb8 100644 --- a/src/main/utils/enum.ts +++ b/src/main/utils/enum.ts @@ -123,6 +123,9 @@ export const IRPCActionType = { PICLIST_OPEN_DIRECTORY: 'PICLIST_OPEN_DIRECTORY', PICLIST_AUTO_START: 'PICLIST_AUTO_START', PICLIST_AUTO_START_STATUS: 'PICLIST_AUTO_START_STATUS', + READ_FILE_CONTENT: 'READ_FILE_CONTENT', + WRITE_FILE_CONTENT: 'WRITE_FILE_CONTENT', + RELOAD_WINDOW: 'RELOAD_WINDOW', // shortkey setting rpc SHORTKEY_UPDATE: 'SHORTKEY_UPDATE', diff --git a/src/renderer/components/Editor.vue b/src/renderer/components/Editor.vue new file mode 100644 index 00000000..1ec7416d --- /dev/null +++ b/src/renderer/components/Editor.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/renderer/i18n/locales/en.json b/src/renderer/i18n/locales/en.json index 8fa266b3..d92a8ada 100644 --- a/src/renderer/i18n/locales/en.json +++ b/src/renderer/i18n/locales/en.json @@ -6,8 +6,10 @@ "cancel": "Cancel", "close": "Close", "confirm": "Confirm", + "edit": "Edit", "import": "Import", "reset": "Reset", + "save": "Save", "submit": "Submit", "version": "Version" }, @@ -718,6 +720,7 @@ "enableServer": "Enable Upload API Service", "enableWebServer": "Enable Web Server", "guiLogFile": "GUI Log File", + "invalidJson": "Invalid JSON format", "logDialogDesc": "View log files and configure log settings", "logFile": "General Log File", "logFilePath": "Log File Path", @@ -739,6 +742,8 @@ "pluginInstallMirror": "Plugin Install Mirror", "pluginInstallProxy": "Plugin Install Proxy", "proxyDialogDesc": "Configure network proxy and plugin mirrors", + "saveFileFailed": "failed to save file", + "saveFileSuccess": "file saved successfully", "serverConfig": "Server Configuration", "serverDialogDesc": "Configure upload API service connection parameters", "serverEncryptionKey": "API Data Encryption Key", @@ -777,6 +782,7 @@ "commonConfig": "Common Configuration", "configureSync": "Platform Config", "downloadSettings": "Download Settings", + "editConfigFile": "Edit Configuration File", "fileManagement": "File Management", "galleryDB": "Gallery Database Sync", "gitea": { diff --git a/src/renderer/i18n/locales/zh-CN.json b/src/renderer/i18n/locales/zh-CN.json index a64fc89a..3703347e 100644 --- a/src/renderer/i18n/locales/zh-CN.json +++ b/src/renderer/i18n/locales/zh-CN.json @@ -6,8 +6,10 @@ "cancel": "取消", "close": "关闭", "confirm": "确认", + "edit": "编辑", "import": "导入", "reset": "重置", + "save": "保存", "submit": "提交", "version": "版本" }, @@ -718,6 +720,7 @@ "enableServer": "是否开启上传API服务", "enableWebServer": "是否开启 Web 服务", "guiLogFile": "GUI 日志文件", + "invalidJson": "无效的JSON格式", "logDialogDesc": "查看日志文件和配置日志设置", "logFile": "常规日志文件", "logFilePath": "日志文件路径", @@ -739,6 +742,8 @@ "pluginInstallMirror": "插件安装镜像", "pluginInstallProxy": "插件安装代理", "proxyDialogDesc": "配置网络代理和插件安装镜像", + "saveFileFailed": "文件保存失败", + "saveFileSuccess": "文件保存成功", "serverConfig": "服务器配置", "serverDialogDesc": "配置上传 API 服务的连接参数", "serverEncryptionKey": "接口数据加密密钥", @@ -777,6 +782,7 @@ "commonConfig": "通用配置", "configureSync": "平台设置", "downloadSettings": "下载配置", + "editConfigFile": "编辑配置文件", "fileManagement": "文件管理", "galleryDB": "相册数据库同步", "gitea": { diff --git a/src/renderer/i18n/locales/zh-TW.json b/src/renderer/i18n/locales/zh-TW.json index cffda24f..90fc5b3a 100644 --- a/src/renderer/i18n/locales/zh-TW.json +++ b/src/renderer/i18n/locales/zh-TW.json @@ -6,8 +6,10 @@ "cancel": "取消", "close": "關閉", "confirm": "確認", + "edit": "編輯", "import": "匯入", "reset": "重置", + "save": "保存", "submit": "提交", "version": "版本" }, @@ -718,6 +720,7 @@ "enableServer": "是否開啟上傳API服務", "enableWebServer": "是否開啟 Web 服務", "guiLogFile": "GUI 日誌文件", + "invalidJson": "無效的 JSON 格式", "logDialogDesc": "查看日誌文件和配置日誌設置", "logFile": "常規日誌文件", "logFilePath": "日誌文件路徑", @@ -739,6 +742,8 @@ "pluginInstallMirror": "插件安裝鏡像", "pluginInstallProxy": "插件安裝代理", "proxyDialogDesc": "配置網絡代理和插件安裝鏡像", + "saveFileFailed": "文件保存失敗", + "saveFileSuccess": "文件保存成功", "serverConfig": "伺服器配置", "serverDialogDesc": "配置上傳 API 服務的連接參數", "serverEncryptionKey": "接口數據加密密鑰", @@ -777,6 +782,7 @@ "commonConfig": "通用配置", "configureSync": "平台配置", "downloadSettings": "下載配置", + "editConfigFile": "編輯配置文件", "fileManagement": "文件管理", "galleryDB": "相冊數據庫同步", "gitea": { diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index 55262866..972642f8 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -274,6 +274,11 @@ :icon="FileText" @click="openFile('data.json')" /> + + + + + + @@ -1257,6 +1270,7 @@ import MultiSelect from '@/components/common/MultiSelect.vue' import placeholderTable from '@/components/common/PlaceholderTable.vue' import SettingCard from '@/components/common/SettingCard.vue' import SettingSection from '@/components/common/SettingSection.vue' +import Editor from '@/components/Editor.vue' import ImageProcessSetting from '@/components/ImageProcessSetting.vue' import useConfirm from '@/hooks/useConfirm' import { osGlobal, usePicBed } from '@/hooks/useGlobal' @@ -1296,6 +1310,8 @@ const webServerVisible = ref(false) const syncVisible = ref(false) const upDownConfigVisible = ref(false) const proxyVisible = ref(false) +const editorVisible = ref(false) +const editorContent = ref('// 在这里开始编写代码...\nfunction hello() {\n console.log("Hello Electron!");\n}') const latestVersion = ref('') const releaseNotes = ref('') @@ -1829,10 +1845,53 @@ async function handleChangeSecondPicBed() { window.electron.sendRPC(IRPCActionType.SHOW_SECOND_UPLOADER_MENU) } -function openFile(file: string) { +async function saveEditorContent() { + const content = editorContent.value.trim() + await saveFile('data.json', content, 'json') + editorVisible.value = false +} + +async function openFile(file: string) { window.electron.sendRPC(IRPCActionType.PICLIST_OPEN_FILE, file) } +async function editFile(file: string, mode: 'text' | 'json' = 'text') { + const content = (await window.electron.triggerRPC(IRPCActionType.READ_FILE_CONTENT, file)) || '' + if (mode === 'json') { + try { + editorContent.value = JSON.stringify(JSON.parse(content), null, 2) + } catch (error) { + editorContent.value = content + } + } else { + editorContent.value = content + } + editorVisible.value = true +} + +async function saveFile(file: string, content: string, mode: 'text' | 'json' = 'text') { + let dataToSave = content + if (mode === 'json') { + try { + dataToSave = JSON.stringify(JSON.parse(content), null, 2) + } catch (error) { + console.error('Invalid JSON content:', error) + message.error(t('pages.settings.advanced.invalidJson')) + return + } + } + try { + window.electron.sendRPC(IRPCActionType.WRITE_FILE_CONTENT, file, dataToSave) + message.success(t('pages.settings.advanced.saveFileSuccess')) + setTimeout(() => { + window.electron.sendRPC(IRPCActionType.RELOAD_WINDOW) + }, 1000) + } catch (error) { + console.error('Failed to save file:', error) + message.error(t('pages.settings.advanced.saveFileFailed')) + } +} + function openDirectory(directory?: string, inStorePath = true) { window.electron.sendRPC(IRPCActionType.PICLIST_OPEN_DIRECTORY, directory, inStorePath) } diff --git a/src/renderer/utils/enum.ts b/src/renderer/utils/enum.ts index 0b837391..5c4d27f8 100644 --- a/src/renderer/utils/enum.ts +++ b/src/renderer/utils/enum.ts @@ -65,6 +65,9 @@ export const IRPCActionType = { PICLIST_OPEN_DIRECTORY: 'PICLIST_OPEN_DIRECTORY', PICLIST_AUTO_START: 'PICLIST_AUTO_START', PICLIST_AUTO_START_STATUS: 'PICLIST_AUTO_START_STATUS', + READ_FILE_CONTENT: 'READ_FILE_CONTENT', + WRITE_FILE_CONTENT: 'WRITE_FILE_CONTENT', + RELOAD_WINDOW: 'RELOAD_WINDOW', // shortkey setting rpc SHORTKEY_UPDATE: 'SHORTKEY_UPDATE', diff --git a/yarn.lock b/yarn.lock index 49535aa8..bbf5b7f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -997,6 +997,104 @@ hashery "^1.3.0" keyv "^5.5.5" +"@codemirror/autocomplete@^6.0.0": + version "6.20.0" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz#db818c12dce892a93fb8abadc2426febb002f8c1" + integrity sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + +"@codemirror/commands@^6.0.0", "@codemirror/commands@^6.10.1": + version "6.10.1" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.10.1.tgz#a17a48f846947f48150b9670a3de8c4352b69256" + integrity sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.4.0" + "@codemirror/view" "^6.27.0" + "@lezer/common" "^1.1.0" + +"@codemirror/lang-javascript@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz#eef2227d1892aae762f3a0f212f72bec868a02c5" + integrity sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.6.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + "@lezer/javascript" "^1.0.0" + +"@codemirror/lang-json@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-json/-/lang-json-6.0.2.tgz#054b160671306667e25d80385286049841836179" + integrity sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ== + dependencies: + "@codemirror/language" "^6.0.0" + "@lezer/json" "^1.0.0" + +"@codemirror/language@^6.0.0", "@codemirror/language@^6.6.0": + version "6.12.1" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.12.1.tgz#d615f7b099a39248312feaaf0bfafce4418aac1b" + integrity sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.23.0" + "@lezer/common" "^1.5.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + style-mod "^4.0.0" + +"@codemirror/lint@^6.0.0": + version "6.9.2" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.9.2.tgz#09ed0aedec13381c9e36e1ac5d126027740c3ef4" + integrity sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.35.0" + crelt "^1.0.5" + +"@codemirror/search@^6.0.0", "@codemirror/search@^6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.6.0.tgz#3b83a1e35391e1575a83a3b485e3f95263ddaa0b" + integrity sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.37.0" + crelt "^1.0.5" + +"@codemirror/state@^6.0.0", "@codemirror/state@^6.4.0", "@codemirror/state@^6.5.0", "@codemirror/state@^6.5.4": + version "6.5.4" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.4.tgz#f5be4b8c0d2310180d5f15a9f641c21ca69faf19" + integrity sha512-8y7xqG/hpB53l25CIoit9/ngxdfoG+fx+V3SHBrinnhOtLvKHRyAJJuHzkWrR4YXXLX8eXBsejgAAxHUOdW1yw== + dependencies: + "@marijn/find-cluster-break" "^1.0.0" + +"@codemirror/theme-one-dark@^6.1.3": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz#1dbb73f6e73c53c12ad2aed9f48c263c4e63ea37" + integrity sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/highlight" "^1.0.0" + +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0", "@codemirror/view@^6.39.11": + version "6.39.11" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.39.11.tgz#200aebef2074bfbbb7a3d5f0644c1b560d876b39" + integrity sha512-bWdeR8gWM87l4DB/kYSF9A+dVackzDb/V56Tq7QVrQ7rn86W0rgZFtlL3g3pem6AeGcb9NQNoy3ao4WpW4h5tQ== + dependencies: + "@codemirror/state" "^6.5.0" + crelt "^1.0.6" + style-mod "^4.1.0" + w3c-keyname "^2.2.4" + "@commitlint/cli@^19.8.1": version "19.8.1" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.8.1.tgz#85f7d9f331344e1f0a2b9d8b24fd3695466e1158" @@ -2532,6 +2630,43 @@ resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.1.1.tgz#0c01dd3a3483882af7cf3878d4e71d505c81fc4a" integrity sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA== +"@lezer/common@^1.0.0", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.3.0", "@lezer/common@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.5.0.tgz#db227b596260189b67ba286387d9dc81fb07c70b" + integrity sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA== + +"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.3.tgz#a20f324b71148a2ea9ba6ff42e58bbfaec702857" + integrity sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g== + dependencies: + "@lezer/common" "^1.3.0" + +"@lezer/javascript@^1.0.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.5.4.tgz#11746955f957d33c0933f17d7594db54a8b4beea" + integrity sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.1.3" + "@lezer/lr" "^1.3.0" + +"@lezer/json@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@lezer/json/-/json-1.0.3.tgz#e773a012ad0088fbf07ce49cfba875cc9e5bc05f" + integrity sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/lr@^1.0.0", "@lezer/lr@^1.3.0": + version "1.4.7" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.7.tgz#01a38556652bf73ffbf3af4a88b91e4c056cc6ee" + integrity sha512-wNIFWdSUfX9Jc6ePMzxSPVgTVB4EOfDIwLQLWASyiUdHKaMsiilj9bYiGkGQCKVodd0x6bgQCV207PILGFCF9Q== + dependencies: + "@lezer/common" "^1.0.0" + "@malept/cross-spawn-promise@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" @@ -2549,6 +2684,11 @@ lodash "^4.17.15" tmp-promise "^3.0.2" +"@marijn/find-cluster-break@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" + integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g== + "@napi-rs/wasm-runtime@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz#c3705ab549d176b8dc5172723d6156c3dc426af2" @@ -5236,6 +5376,19 @@ clone@^1.0.2: resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +codemirror@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.2.tgz#4d3fea1ad60b6753f97ca835f2f48c6936a8946e" + integrity sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/commands" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/search" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -5555,6 +5708,11 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +crelt@^1.0.5, crelt@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== + cross-spawn@^7.0.0, cross-spawn@^7.0.1: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -10743,6 +10901,11 @@ strtok3@^10.3.4: dependencies: "@tokenizer/token" "^0.3.0" +style-mod@^4.0.0, style-mod@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.3.tgz#6e9012255bb799bdac37e288f7671b5d71bf9f73" + integrity sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ== + stylelint-config-html@>=1.0.0, stylelint-config-html@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/stylelint-config-html/-/stylelint-config-html-1.1.0.tgz#999db19aea713b7ff6dde92ada76e4c1bd812b66" @@ -11668,6 +11831,11 @@ vue@^3.5.21, vue@^3.5.26: "@vue/server-renderer" "3.5.26" "@vue/shared" "3.5.26" +w3c-keyname@^2.2.4: + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== + walk-up-path@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-4.0.0.tgz#590666dcf8146e2d72318164f1f2ac6ef51d4198"