From baa8885774243b5d00e68e8d8f1d9af0ff7f8f86 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Tue, 27 Oct 2026 12:30:43 +0800 Subject: [PATCH 1/8] Add reusable content snippets --- build.gradle | 17 + .../contenttools/ContentToolsPlugin.java | 18 +- .../extension/ContentSnippet.java | 39 + ui/package.json | 4 +- ui/pnpm-lock.yaml | 1283 +++++++++++++---- ui/src/api/generated/.gitignore | 4 + ui/src/api/generated/.npmignore | 1 + .../api/generated/.openapi-generator-ignore | 23 + ui/src/api/generated/.openapi-generator/FILES | 22 + .../api/generated/.openapi-generator/VERSION | 1 + ui/src/api/generated/api.ts | 15 + .../api/content-snippet-v1alpha1-api.ts | 902 ++++++++++++ ui/src/api/generated/base.ts | 91 ++ ui/src/api/generated/common.ts | 187 +++ ui/src/api/generated/configuration.ts | 124 ++ ui/src/api/generated/git_push.sh | 57 + ui/src/api/generated/index.ts | 17 + ui/src/api/generated/models/add-operation.ts | 45 + .../generated/models/content-snippet-list.ts | 79 + .../generated/models/content-snippet-spec.ts | 39 + .../api/generated/models/content-snippet.ts | 52 + ui/src/api/generated/models/copy-operation.ts | 45 + ui/src/api/generated/models/index.ts | 11 + .../api/generated/models/json-patch-inner.ts | 39 + ui/src/api/generated/models/metadata.ts | 69 + ui/src/api/generated/models/move-operation.ts | 45 + .../api/generated/models/remove-operation.ts | 40 + .../api/generated/models/replace-operation.ts | 46 + ui/src/api/generated/models/test-operation.ts | 45 + ui/src/api/index.ts | 8 + .../snippet/SaveSnippetBubbleItem.vue | 35 + .../components/snippet/SaveSnippetModal.vue | 129 ++ .../components/snippet/SnippetPickerModal.vue | 166 +++ .../components/snippet/openSnippetPicker.ts | 45 + ui/src/editor/contentSnippetExtension.ts | 60 + ui/src/index.ts | 48 + ui/src/utils/snippet.ts | 11 + .../views/snippets/ContentSnippetEditor.vue | 272 ++++ ui/src/views/snippets/ContentSnippetList.vue | 222 +++ 39 files changed, 4089 insertions(+), 267 deletions(-) create mode 100644 src/main/java/cc/ryanc/contenttools/extension/ContentSnippet.java create mode 100644 ui/src/api/generated/.gitignore create mode 100644 ui/src/api/generated/.npmignore create mode 100644 ui/src/api/generated/.openapi-generator-ignore create mode 100644 ui/src/api/generated/.openapi-generator/FILES create mode 100644 ui/src/api/generated/.openapi-generator/VERSION create mode 100644 ui/src/api/generated/api.ts create mode 100644 ui/src/api/generated/api/content-snippet-v1alpha1-api.ts create mode 100644 ui/src/api/generated/base.ts create mode 100644 ui/src/api/generated/common.ts create mode 100644 ui/src/api/generated/configuration.ts create mode 100644 ui/src/api/generated/git_push.sh create mode 100644 ui/src/api/generated/index.ts create mode 100644 ui/src/api/generated/models/add-operation.ts create mode 100644 ui/src/api/generated/models/content-snippet-list.ts create mode 100644 ui/src/api/generated/models/content-snippet-spec.ts create mode 100644 ui/src/api/generated/models/content-snippet.ts create mode 100644 ui/src/api/generated/models/copy-operation.ts create mode 100644 ui/src/api/generated/models/index.ts create mode 100644 ui/src/api/generated/models/json-patch-inner.ts create mode 100644 ui/src/api/generated/models/metadata.ts create mode 100644 ui/src/api/generated/models/move-operation.ts create mode 100644 ui/src/api/generated/models/remove-operation.ts create mode 100644 ui/src/api/generated/models/replace-operation.ts create mode 100644 ui/src/api/generated/models/test-operation.ts create mode 100644 ui/src/api/index.ts create mode 100644 ui/src/components/snippet/SaveSnippetBubbleItem.vue create mode 100644 ui/src/components/snippet/SaveSnippetModal.vue create mode 100644 ui/src/components/snippet/SnippetPickerModal.vue create mode 100644 ui/src/components/snippet/openSnippetPicker.ts create mode 100644 ui/src/editor/contentSnippetExtension.ts create mode 100644 ui/src/utils/snippet.ts create mode 100644 ui/src/views/snippets/ContentSnippetEditor.vue create mode 100644 ui/src/views/snippets/ContentSnippetList.vue diff --git a/build.gradle b/build.gradle index 823ca5c..2a89815 100644 --- a/build.gradle +++ b/build.gradle @@ -46,6 +46,23 @@ tasks.named('classes') { } halo { + port = 8091 version = '2.26.0' } +haloPlugin { + openApi { + groupingRules { + contentSnippetApis { + displayName = 'Content Snippet API for content-tools' + pathsToMatch = ['/apis/content-tools.halo.run/v1alpha1/**'] + } + } + groupedApiMappings = [ + '/v3/api-docs/contentSnippetApis': 'contentSnippetApis.json' + ] + generator { + outputDir = file("${projectDir}/ui/src/api/generated") + } + } +} diff --git a/src/main/java/cc/ryanc/contenttools/ContentToolsPlugin.java b/src/main/java/cc/ryanc/contenttools/ContentToolsPlugin.java index 497e26f..a06f3e1 100644 --- a/src/main/java/cc/ryanc/contenttools/ContentToolsPlugin.java +++ b/src/main/java/cc/ryanc/contenttools/ContentToolsPlugin.java @@ -1,6 +1,9 @@ package cc.ryanc.contenttools; +import cc.ryanc.contenttools.extension.ContentSnippet; import org.springframework.stereotype.Component; +import run.halo.app.extension.Scheme; +import run.halo.app.extension.SchemeManager; import run.halo.app.plugin.BasePlugin; import run.halo.app.plugin.PluginContext; @@ -10,7 +13,20 @@ @Component public class ContentToolsPlugin extends BasePlugin { - public ContentToolsPlugin(PluginContext pluginContext) { + private final SchemeManager schemeManager; + + public ContentToolsPlugin(PluginContext pluginContext, SchemeManager schemeManager) { super(pluginContext); + this.schemeManager = schemeManager; + } + + @Override + public void start() { + schemeManager.register(ContentSnippet.class); + } + + @Override + public void stop() { + schemeManager.unregister(Scheme.buildFromType(ContentSnippet.class)); } } diff --git a/src/main/java/cc/ryanc/contenttools/extension/ContentSnippet.java b/src/main/java/cc/ryanc/contenttools/extension/ContentSnippet.java new file mode 100644 index 0000000..0cdb4fc --- /dev/null +++ b/src/main/java/cc/ryanc/contenttools/extension/ContentSnippet.java @@ -0,0 +1,39 @@ +package cc.ryanc.contenttools.extension; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import run.halo.app.extension.AbstractExtension; +import run.halo.app.extension.GVK; + +/** + * A reusable piece of rich text content. + * + * @author ryanwang + */ +@Data +@EqualsAndHashCode(callSuper = true) +@GVK(group = "content-tools.halo.run", + version = "v1alpha1", + kind = "ContentSnippet", + plural = "contentsnippets", + singular = "contentsnippet") +public class ContentSnippet extends AbstractExtension { + + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) + private Spec spec; + + @Data + @Schema(name = "ContentSnippetSpec") + public static class Spec { + + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, maxLength = 100) + private String displayName; + + @Schema(maxLength = 500) + private String description; + + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) + private String content; + } +} diff --git a/ui/package.json b/ui/package.json index 8aa92b7..cd4009a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -22,6 +22,7 @@ "dependencies": { "@halo-dev/api-client": "^2.26.0", "@halo-dev/components": "^2.26.0", + "@halo-dev/richtext-editor": "2.26.0", "@halo-dev/ui-shared": "^2.26.0", "@joplin/turndown-plugin-gfm": "^1.0.64", "@tanstack/vue-query": "4", @@ -37,7 +38,8 @@ "markdown-it-anchor": "^9.2.0", "turndown": "^7.2.4", "vue": "^3.5.41", - "vue-reactive-queue": "^0.0.1" + "vue-reactive-queue": "^0.0.1", + "vue-router": "~5.1.0" }, "devDependencies": { "@halo-dev/ui-plugin-bundler-kit": "^2.26.0", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index 64ee57f..d084ed8 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -13,10 +13,13 @@ importers: version: 2.26.0(axios@1.15.2) '@halo-dev/components': specifier: ^2.26.0 - version: 2.26.0(vue-router@4.2.5(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) + version: 2.26.0(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) + '@halo-dev/richtext-editor': + specifier: 2.26.0 + version: 2.26.0(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33))(axios@1.15.2)(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33) '@halo-dev/ui-shared': specifier: ^2.26.0 - version: 2.26.0(@tiptap/pm@3.30.1)(axios@1.15.2)(vue-router@4.2.5(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) + version: 2.26.0(@tiptap/pm@3.32.0)(axios@1.15.2)(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) '@joplin/turndown-plugin-gfm': specifier: ^1.0.64 version: 1.0.64 @@ -28,7 +31,7 @@ importers: version: 14.4.0(vue@3.5.41(typescript@5.5.4)) '@vueuse/router': specifier: ^14.4.0 - version: 14.4.0(vue-router@4.2.5(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) + version: 14.4.0(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) axios: specifier: ^1.15.2 version: 1.15.2 @@ -62,10 +65,13 @@ importers: vue-reactive-queue: specifier: ^0.0.1 version: 0.0.1(vue@3.5.41(typescript@5.5.4)) + vue-router: + specifier: ~5.1.0 + version: 5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)) devDependencies: '@halo-dev/ui-plugin-bundler-kit': specifier: ^2.26.0 - version: 2.26.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rsbuild/plugin-vue@2.0.1(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(vue@3.5.41(typescript@5.5.4)))(@vitejs/plugin-vue@6.0.8(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0))(vue@3.5.41(typescript@5.5.4)))(axios@1.15.2)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)) + version: 2.26.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rsbuild/plugin-vue@2.0.1(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(vue@3.5.41(typescript@5.5.4)))(@vitejs/plugin-vue@6.0.8(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(axios@1.15.2)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1)) '@iconify-json/mingcute': specifier: ^1.2.8 version: 1.2.8 @@ -122,16 +128,16 @@ importers: version: 5.5.4 unocss: specifier: ^66.7.5 - version: 66.7.5(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)) + version: 66.7.5(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1)) unplugin-icons: specifier: ^23.0.1 version: 23.0.1(@vue/compiler-sfc@3.5.41) vite: specifier: ^8.2.1 - version: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0) + version: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1) vite-plugin-node-polyfills: specifier: ^0.28.0 - version: 0.28.0(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)) + version: 0.28.0(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1)) vue-tsc: specifier: ^3.3.9 version: 3.3.9(typescript@5.5.4) @@ -145,40 +151,44 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} + '@babel/generator@8.0.6': + resolution: {integrity: sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@8.0.6': + resolution: {integrity: sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/helper-validator-identifier@8.0.6': + resolution: {integrity: sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/parser@7.29.8': resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} + '@babel/parser@8.0.7': + resolution: {integrity: sha512-UkDwEbPO1px2JQSrdh4qIgaH1JgG7GO/pFeJkpxhDxIETkT/QvGpnigXIw75ViHYPtIgKITmVUJqLjiO+JuWjA==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true '@babel/types@7.29.8': resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} + '@babel/types@8.0.6': + resolution: {integrity: sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==} + engines: {node: ^22.18.0 || >=24.11.0} + '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -206,14 +216,17 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} '@floating-ui/dom@1.1.1': resolution: {integrity: sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==} - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} '@halo-dev/api-client@2.26.0': resolution: {integrity: sha512-z80aGP8sbTcX+s9//Q1XdF7iUByKUylAH3fJuO58pN1plQAWkClRaEiIXn56PBwL3/iPUd/RnuI7BMVTBj5Ysg==} @@ -226,6 +239,11 @@ packages: vue: ^3.5.x vue-router: ~5.1.0 + '@halo-dev/richtext-editor@2.26.0': + resolution: {integrity: sha512-4mUGWSZA6A2WvMqQ6UGkiu7lDEtGa7bKS3oc57908b9yOGirSkHFCXXBPkkXX7MrKU39KzL24i4YeL2XfRXfYg==} + peerDependencies: + vue: ^3.5.x + '@halo-dev/ui-plugin-bundler-kit@2.26.0': resolution: {integrity: sha512-AcWsOrmFtalPlyyUEmqqkB3meDECRD/YGxBVw1hKS0M8M1ebYNnf7jYQlVv3UFKyt+hOTKHtbKLEDPObFFTB5w==} engines: {node: ^18.0.0 || >=20.0.0} @@ -260,9 +278,6 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} - '@iconify/utils@3.1.4': resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} @@ -272,6 +287,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.4.0-beta.0': + resolution: {integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==} + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -285,9 +303,15 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} @@ -537,6 +561,9 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@rolldown/binding-android-arm64@1.2.3': resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -759,13 +786,228 @@ packages: '@vue/composition-api': optional: true - '@tiptap/core@3.30.1': - resolution: {integrity: sha512-HWEO6Qi8fI8Zt8X4atVV6GxthJx7Vrjr6L5YFq4OkjYJ7HG2/bFw6IKsDA3jOYgY4DM9lv8IadaiWUQ2JJRIBA==} + '@tiptap/core@3.32.0': + resolution: {integrity: sha512-Ghh2h02GKSqzytQGcLV4espYOG4EHxjj0MsrUB2Vnr47xmlZYRf6r7k2J09H+JpBdaGrWwrTkyBEi5i3c3yy2Q==} + peerDependencies: + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-audio@3.29.0': + resolution: {integrity: sha512-udekTbs3HgcUcE1dGTgwl2oSEs2y5WoDO7tZ9x+rXGfEWklsmwO5f/PO4SAOgppoM1jlc6wluFE71Wgy8i+qjQ==} + peerDependencies: + '@tiptap/core': 3.29.0 + + '@tiptap/extension-blockquote@3.32.0': + resolution: {integrity: sha512-wmuthEdlYVArNoUbqFPH35giutBABFu7fqEB0lTD1k0UXJUs4dFvcbRyGWWgnHFZgP3TT4u8e+xiayYw0eQ0NQ==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-bold@3.32.0': + resolution: {integrity: sha512-SQYewnYDoIBN+8oH53IDcD8p+Pz+Jnyq3hrxjy/FAo5ctc+96d3ZLdqc9gzLVSqFFo/SUINv2FVGoq9PvU7yqw==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-bubble-menu@3.32.0': + resolution: {integrity: sha512-X3ll8i9Z8QNvt7+tcqlwopJG+68ugO13Av0Ox4Ico+jXcTnFdDuKQJBSI9sLuMR5vTQOeTHhKYXhjF88aahMSA==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-code-block@3.32.0': + resolution: {integrity: sha512-9NZW/yXP9j9XKr+hRS5m58xiyZI+tQo1PJ7eLHXjGNFWaF601NG/h6741mbKh5uCY51XsbyqG+7que+RavngPA==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-code@3.32.0': + resolution: {integrity: sha512-I+aEVl0dTmkfnU6HzBGEefb9U7ja2MkucwBBwrmoMwU+uIKpC4xw8NcHC9X6sjAcom3Pxs2HX+8WEo4Vp13R/Q==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-collaboration@3.32.0': + resolution: {integrity: sha512-db7VPDksD13zsYVi/Hao2Je5ZMwGRuXxVBDFv182Kr06aixxAWjBJ5JvYf6AgcrDKFx/dPPpDjctKQjJPtw6VA==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + '@tiptap/y-tiptap': ^3.0.7 + yjs: ^13 + + '@tiptap/extension-color@3.32.0': + resolution: {integrity: sha512-whRpuiEZ94FXBbFryWAYJ9rOQrLe4CVQ7GAjWDh+fpm5MJfjtshFvMXtGFIlcmo3e1XBzCcAetmk0zMKoIU0RA==} + peerDependencies: + '@tiptap/extension-text-style': 3.32.0 + + '@tiptap/extension-details@3.32.0': + resolution: {integrity: sha512-U9ZvyPr5S+xklYYAyfHNfFf0EmvFyPZ0ue3z2GYMK355lgdqA7/oXBgl7i75Wc2x90UwL2pHGNF8GYxARTtDjA==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/extension-text-style': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-document@3.32.0': + resolution: {integrity: sha512-GugeKE6AnZDluRXJUNBuX43TPcaJxy5wck6vT2J4a0/EnKStJ43suSZZf1IPfb1ij9EL9bYvAwg9DOcrvdEzTQ==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-drag-handle-vue-3@3.32.0': + resolution: {integrity: sha512-UP4DMZIU/lc6DINmUbd77s5oiC4Z2NrldTdHgAjGVV3NuIAUMfRhZnjr+AK1sEsYDKiYZL/VP2jKIoD2x3Cxiw==} + peerDependencies: + '@tiptap/extension-drag-handle': 3.32.0 + '@tiptap/pm': 3.32.0 + '@tiptap/vue-3': 3.32.0 + vue: ^3.0.0 + + '@tiptap/extension-drag-handle@3.32.0': + resolution: {integrity: sha512-yV6rTZlkS6Fjd6gXzd3zXxMvq82Nu7+DqdmyRtuaSKiRepvJPZvLijfS5ZgN6cjj75mrWCM+cgRODYVCDh11mA==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/extension-collaboration': 3.32.0 + '@tiptap/extension-node-range': 3.32.0 + '@tiptap/pm': 3.32.0 + '@tiptap/y-tiptap': ^3.0.7 + + '@tiptap/extension-find-and-replace@3.29.0': + resolution: {integrity: sha512-mbTZGKJ2QrkMobYIYLiXhVRcYQ6Hlno7tW+xbAa/gfHVmfkXWYQlGiv6/NggbyUjU9tU7hs69Wap+g+w5XVWnw==} + peerDependencies: + '@tiptap/core': 3.29.0 + '@tiptap/pm': 3.29.0 + + '@tiptap/extension-floating-menu@3.32.0': + resolution: {integrity: sha512-AzKCWceL+4Q1pTc8Whw1kPqN/aYGPQ70/jXPsblWl501t/pXi6Kz0Pi/NggKkuu73VGjykh68YYf/dcOJ/mPZQ==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-hard-break@3.32.0': + resolution: {integrity: sha512-IKUYvK+bO2hGrDWhhTVg0CSh9C2belWg9GyLzvpyd3SZyQ9EgdccLfoytNjOBKbAE/TQ4Oo3kSP+XF6RsUIKPA==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-heading@3.32.0': + resolution: {integrity: sha512-XRiZxZuhfjvbgwCvoBHj04gOsPANEXxxRwrFCQVuFi5yeTHYIzMEioc81j6iAH9pV7aQeJCwLxuh6VHNz3dXEQ==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-highlight@3.32.0': + resolution: {integrity: sha512-6q75QUC3iT7+TlMLhBSJASlpyO/f+Y22tB68hcdbg5hFW8fl8zv8np/oRzxoeAnis+4FZw9D5WfhOdwu1C+MWw==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-horizontal-rule@3.32.0': + resolution: {integrity: sha512-Iry7ynsG4xgcxnH1cm+uXJnEtUzoop4sGA10NUN9I+08TOjhj/GrDiRKMQHKAiVI/R7t2MVav1MJlxFf2FdzGw==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-image@3.32.0': + resolution: {integrity: sha512-nv/YlOMwFUp2ItffQbHb14yAJjrn9sdxKl0WK5rH8PPiNoXVkvasieoBLNTHan9gjhrSp7LjVG2ZsMoSe/I7gg==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-italic@3.32.0': + resolution: {integrity: sha512-KB/i1xoHilbBGcQ+UotDWhi60KpdCde3RzRIpl2na0Yol4z4Fe2IRWg8ljIrlsssDRwel/fsHJbG7a13EP8oKA==} peerDependencies: - '@tiptap/pm': 3.30.1 + '@tiptap/core': 3.32.0 - '@tiptap/pm@3.30.1': - resolution: {integrity: sha512-2bHY+ihexKpfBURbAD+ahY0+lWle0TueTK80GAGYqZ/G7ErAPOmzN5RVAGMyZJI4wDkcFycRNLi3k0/3VT9a1A==} + '@tiptap/extension-link@3.32.0': + resolution: {integrity: sha512-DRdQSgWPSEjrDg5EDBB5yxRygHtUVLhceVGzAsTz8RziiFyvcwAvzBHCO9hd9jutjCXQ2DLIuZB8P+aHhFWnpg==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-list@3.32.0': + resolution: {integrity: sha512-QdzS5nFz9agAQhBgIuQluobWib39W2cMKx1XB6tYSue7bHMJdgPFP0EnGfFajaeVX42CG6RXtQWrNfyQGKhBvg==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-node-range@3.29.0': + resolution: {integrity: sha512-WALScqny5fDEf7Q5+gjz7o2wYs6fvVKk8ljSQ8OUP5xR1iOhM1TYtW2Wpevkutd6fPdqyx2CttaDLGHlF3N2tg==} + peerDependencies: + '@tiptap/core': 3.29.0 + '@tiptap/pm': 3.29.0 + + '@tiptap/extension-paragraph@3.32.0': + resolution: {integrity: sha512-afKLMc7fWMkkar9H5FilizStSbhFzUoCzdwwdZf6DDsn3LUt8tJlFHACK78cAyx/TzMJBo0N8/8T1u9bL+N67Q==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-strike@3.32.0': + resolution: {integrity: sha512-J9Vw6wmh/wV6SxSsN9RhurvAGcXSY5J3p4EQrROD5PARBl0VOnDFi7/UVoz1RkSdqOKPgAiqDZpaLRgtdBO9Rg==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-subscript@3.32.0': + resolution: {integrity: sha512-f1NeIyTB3AkQTyC9xM8QVFDPsGekwJqHhcMfd5TW/sDv6BV39yT2zAjRjEICAEx298cJt8AnNflxvFs5A3mTfQ==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-superscript@3.32.0': + resolution: {integrity: sha512-4Xv6yTVEnn9rPa6eZ18q4wqw/pGTkw3aNI5aaCrder8XH5uuO5HfL42CPhRKWWFaer/WPwEL1lkUlskgbx+lLg==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-table@3.32.0': + resolution: {integrity: sha512-uOqCzWzxXvMccapZo+1CDxp3JGegxqNl11Lj8XiiWLxwmg81B/bKwMJW7+YlIdffgGNYJETk5YwL8T0IVBD2QQ==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-text-align@3.32.0': + resolution: {integrity: sha512-DdV/V86ds9VtQ1MkbovgI28xwSvOW03I8SexsaKljGqSN/HovBXEjlefSnbK4tlWmQLJPH9eNsxRcpHJMftYCA==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-text-style@3.32.0': + resolution: {integrity: sha512-+U8FkrNAU45+fHgo4DYfndS/WuhhyttZ+zTyObF1W4VJ8wDiAYqXkl71nQcmMJyyK47yeNUY9CfjUomIaEHhpA==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-text@3.32.0': + resolution: {integrity: sha512-sF0jIK67IHdZMnzv2mz5vPTyK7R0ui6/YZgFg+/bLnFCNmweVAoYcHZLlC7ISRnwu0mqJr+epNtzJepY1ZDCjg==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extension-underline@3.32.0': + resolution: {integrity: sha512-rMLdd4vg6sed/JnaXnaupLbCtYiWikTnQ8qir9ItKOXwf1Ui9P1Y4G0bYU4+gcnMsFzaSGtrOhMqG4/c66AogQ==} + peerDependencies: + '@tiptap/core': 3.32.0 + + '@tiptap/extensions@3.32.0': + resolution: {integrity: sha512-qO+ndNvlOjzU2MWCtQHoRg1tIortCXLvqPjDx58F1pUYFNCOVZegXi+jqLGDODUA31er+TVz66umzRbbN1bO1Q==} + peerDependencies: + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/pm@3.32.0': + resolution: {integrity: sha512-H9eN+xHFboJybE7KPGVsu24S8aBlCIgYz38vCHRSnNv17nwmqm06owq/IQ5scza0n3Y7IfUfpgPOtm9SgeHmNQ==} + + '@tiptap/suggestion@3.32.0': + resolution: {integrity: sha512-5PbouU06zaZ7n4uyYzeNN/jBFVmGsHZ6c56MvN7M33echERAhu1L1X71Up0U6GK/pJfyugX7WbluBehJDPQeSQ==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + + '@tiptap/vue-3@3.32.0': + resolution: {integrity: sha512-FpYquLlZpfFzgWcQuOrXuUXDNn8YYomD3dLx92b61XxVMlwKkOH3p1XS/wlNNRBLaA7oSB5VRzy5E7EXtfgqpg==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + vue: ^3.0.0 + + '@tiptap/y-tiptap@3.0.10': + resolution: {integrity: sha512-vJtwYVoBBk+e8KyUVoH9WSsfUfKTXf1Uh+tk2UNTlD8wim9j7XVTuc7sakWUYuznB7DkXThT9w5uQTGH2SN0Kg==} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 '@tsconfig/node20@20.1.9': resolution: {integrity: sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==} @@ -782,6 +1024,9 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -904,6 +1149,7 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unocss/cli@66.7.5': resolution: {integrity: sha512-fgWkECRn2LGVo9sEpmjk/KJ3NSKUDitaZCNrJcEYM93DG+ELriTHcL+VWBlF4rcZf9fdGlq1nKbbRHUZirFCHQ==} @@ -1006,15 +1252,18 @@ packages: '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} - '@vue/compiler-core@3.5.32': - resolution: {integrity: sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==} + '@vue-macros/common@3.1.4': + resolution: {integrity: sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==} + engines: {node: '>=20.19.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true '@vue/compiler-core@3.5.41': resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==} - '@vue/compiler-dom@3.5.32': - resolution: {integrity: sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==} - '@vue/compiler-dom@3.5.41': resolution: {integrity: sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==} @@ -1027,6 +1276,15 @@ packages: '@vue/devtools-api@6.5.0': resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + '@vue/devtools-api@8.2.1': + resolution: {integrity: sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==} + + '@vue/devtools-kit@8.2.1': + resolution: {integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==} + + '@vue/devtools-shared@8.2.1': + resolution: {integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==} + '@vue/eslint-config-prettier@9.0.0': resolution: {integrity: sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==} peerDependencies: @@ -1059,9 +1317,6 @@ packages: '@vue/server-renderer@3.5.41': resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==} - '@vue/shared@3.5.32': - resolution: {integrity: sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==} - '@vue/shared@3.5.41': resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==} @@ -1102,6 +1357,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.19.0: + resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.1: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} @@ -1136,6 +1396,14 @@ packages: assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + + ast-walker-scope@0.9.0: + resolution: {integrity: sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==} + engines: {node: '>=20.19.0'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1156,6 +1424,9 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} @@ -1272,15 +1543,15 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.2: - resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -1312,6 +1583,9 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + crelt@1.0.7: + resolution: {integrity: sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1532,9 +1806,6 @@ packages: evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} @@ -1610,10 +1881,6 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} @@ -1637,6 +1904,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + github-markdown-css@5.9.0: + resolution: {integrity: sha512-tmT5sY+zvg2302XLYEfH2mtkViIM1SWf2nvYoF5N1ZsO0V6B2qZTiw3GOzw4vpjLygK/KG35qRlPFweHqfzz5w==} + engines: {node: '>=10'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1647,7 +1918,7 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -1698,10 +1969,6 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -1709,6 +1976,9 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -1816,6 +2086,9 @@ packages: resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} engines: {node: '>=10'} + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -1837,12 +2110,22 @@ packages: canvas: optional: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -1854,6 +2137,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lib0@0.2.119: + resolution: {integrity: sha512-vh+TiejVy8Xm+hCdnRfn9BthGNvNUZdEXltNjVZL3TzRIKP3s1lnQh8pWd/Q0wCgY0FPAGVVjFF4ZiHUV3LFgA==} + engines: {node: '>=16'} + hasBin: true + lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -1934,10 +2222,17 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkifyjs@4.4.0: + resolution: {integrity: sha512-InTexvtbai+2c+dEVGcc6O6P2DMVIiwD9a/i4zFroazOIYLOS6FSVmAJ7kFeumnCMx6/gQqNAkbUvgMubV4+MA==} + local-pkg@1.1.2: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1954,6 +2249,10 @@ packages: magic-regexp@0.10.0: resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} + magic-string-ast@1.0.3: + resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} + engines: {node: '>=20.19.0'} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -2028,6 +2327,9 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} @@ -2174,18 +2476,14 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} - picomatch@4.0.5: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pkg-dir@5.0.0: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} @@ -2193,9 +2491,6 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - pkg-types@2.3.1: resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} @@ -2241,20 +2536,23 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - prosemirror-changeset@2.4.1: - resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} + prosemirror-changeset@2.4.4: + resolution: {integrity: sha512-Gyuz9jYdrAeA9I7AholyOes9KUmv/lEwsC5O9s5xF5VB3EgTPsXMGUxz4+H1B+wKVPdZbvRcg1Cp3x8qX+8ofA==} - prosemirror-commands@1.7.1: - resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} - prosemirror-dropcursor@1.8.2: - resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + prosemirror-commands@1.7.2: + resolution: {integrity: sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==} + + prosemirror-dropcursor@1.8.4: + resolution: {integrity: sha512-VmKxhcA6a+h5oPSYmfF1ZNeQqPbyYaIxqZsKqeYCyTlPtrjUgNaHL3P8vVaO19oqAV0zuaM/axkowZHrB1P3Tg==} prosemirror-gapcursor@1.4.1: resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} - prosemirror-history@1.5.0: - resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + prosemirror-history@1.5.1: + resolution: {integrity: sha512-onlwnqKvgtFg6srZOmDOAhlAy1FIHQpOExORybX0S+DvJepE5tPALrB9iGet/2sqqqrelSnB10OoiOJqAvu2DA==} prosemirror-inputrules@1.5.1: resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} @@ -2262,8 +2560,17 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-model@1.25.11: - resolution: {integrity: sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==} + prosemirror-markdown@1.13.9: + resolution: {integrity: sha512-qAI3I9YdtjWHjTCBErc08ivr24KSrUjcTh5dYncCxFM+JS02kT0iHeWYjO35xeTPwt5t8rhFrelewXhXz16WZQ==} + + prosemirror-menu@1.3.2: + resolution: {integrity: sha512-6VgUJTYod0nMBlCaYJGhXGLu7Gt4AvcwcOq0YfJCY/6Uh+3S7UsWhpy6rJFCBFOmonq1hD8KyWOtZhkppd4YPg==} + + prosemirror-model@1.25.12: + resolution: {integrity: sha512-Ue2gTmXMa7EhpLNhC7J+h4+ykD8ha12K6rrZFFKKJHBForfIStw5gJ6Zrf1mqqAa9NmpmEB4wp9bKmA4eUVjWg==} + + prosemirror-schema-basic@1.2.5: + resolution: {integrity: sha512-McBWhfgOfThyu3Nltbs8SOUbM4t/h0pxteibaaHd1QR4S+F1t0u7M1ETaCE6/cveFoF+2fowTIBNkJOyeZQjNg==} prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -2274,11 +2581,18 @@ packages: prosemirror-tables@1.8.5: resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} - prosemirror-transform@1.12.0: - resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.12.4: + resolution: {integrity: sha512-2/WuPum3pn+O/Vi2vzpi8210ICUe2kIPXdLYjQ09Pv5DtT5bcKWMJhAKPBwvpPjpp5iOYUVwVEr0gOM1BY1Mgw==} - prosemirror-view@1.42.2: - resolution: {integrity: sha512-Pdg0l5kXm8aLDquFAnQFTCITg0q44sLqBlHlpsVLD9segdOao8TOfQdAhCrCXyVgPSRr6UDDROOIWA3bIrN9YQ==} + prosemirror-view@1.42.7: + resolution: {integrity: sha512-aTIAUN4zdD+VS7gsv9Po9Sty81B6yl6D3HggCosry9DLYTmVo4omjcqICDIOPnPJmskRUsqLInxBjaH7I+BQ4Q==} proxy-from-env@2.1.0: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} @@ -2301,10 +2615,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} - engines: {node: '>=0.6'} - qs@6.15.3: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} @@ -2331,6 +2641,10 @@ packages: randomfill@1.0.4: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + re2js@2.9.0: + resolution: {integrity: sha512-rZpqkd4ETP3GrQ5mDLzADr14OleeKdb/40lG84WE8absRfsVLJpWt2ifjtYYeoPqeouIkcxhTlurxIXfR5kR5Q==} + engines: {node: '>=20.0.0'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -2426,15 +2740,16 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -2459,10 +2774,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - side-channel-list@1.0.1: resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} @@ -2475,10 +2786,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - side-channel@1.1.1: resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} @@ -2563,10 +2870,6 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -2631,6 +2934,9 @@ packages: ufo@1.6.2: resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} @@ -2682,10 +2988,50 @@ packages: resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} engines: {node: '>=20.19.0'} + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} + unplugin@3.4.0: + resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rsbuild/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rsbuild/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2783,10 +3129,23 @@ packages: peerDependencies: vue: ^3.0.0 - vue-router@4.2.5: - resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==} + vue-router@5.1.0: + resolution: {integrity: sha512-HAbiLzLEHQwxPgvsbOJDAwtavszEgLwri6XfyrsPECIFez8+59xc9LofWVdc/HEaSRT822lJ8H9Ns38VVond5g==} peerDependencies: - vue: ^3.2.0 + '@pinia/colada': '>=0.21.2' + '@vue/compiler-sfc': ^3.5.34 + pinia: ^3.0.4 + vite: ^7.0.0 || ^8.0.0 + vue: ^3.5.34 + peerDependenciesMeta: + '@pinia/colada': + optional: true + '@vue/compiler-sfc': + optional: true + pinia: + optional: true + vite: + optional: true vue-tsc@3.3.9: resolution: {integrity: sha512-TS3Y1ux/IRoE8OCP2PpACAeOseuIs0UvWrcr7u+w3PmfY+SlCfEf8zjrBgnQksHUgLpthi5vHlffcQTQTdPBZA==} @@ -2872,6 +3231,21 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y-protocols@1.0.7: + resolution: {integrity: sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + + yjs@13.6.33: + resolution: {integrity: sha512-q/UYvr1gOk4XII+Cu1CW2dINjYqJJFifTzogEaIARznrvX7uOlHsdTEXcnOBMuIsrCGEEKdNxi74kyMLZlKVfw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2885,32 +3259,41 @@ snapshots: package-manager-detector: 1.3.0 tinyexec: 1.0.1 - '@babel/helper-string-parser@7.27.1': {} + '@babel/generator@8.0.6': + dependencies: + '@babel/parser': 8.0.7 + '@babel/types': 8.0.6 + '@jridgewell/gen-mapping': 0.4.0-beta.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-string-parser@8.0.6': {} '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.2': - dependencies: - '@babel/types': 7.29.0 + '@babel/helper-validator-identifier@8.0.6': {} '@babel/parser@7.29.8': dependencies: '@babel/types': 7.29.8 - '@babel/types@7.29.0': + '@babel/parser@8.0.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/types': 8.0.6 '@babel/types@7.29.8': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@babel/types@8.0.6': + dependencies: + '@babel/helper-string-parser': 8.0.6 + '@babel/helper-validator-identifier': 8.0.6 + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -2950,51 +3333,117 @@ snapshots: '@eslint/js@8.57.1': {} - '@floating-ui/core@1.7.5': + '@floating-ui/core@1.8.0': dependencies: - '@floating-ui/utils': 0.2.11 + '@floating-ui/utils': 0.2.12 '@floating-ui/dom@1.1.1': dependencies: - '@floating-ui/core': 1.7.5 + '@floating-ui/core': 1.8.0 + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 - '@floating-ui/utils@0.2.11': {} + '@floating-ui/utils@0.2.12': {} '@halo-dev/api-client@2.26.0(axios@1.15.2)': dependencies: axios: 1.15.2 qs: 6.15.3 - '@halo-dev/components@2.26.0(vue-router@4.2.5(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))': + '@halo-dev/components@2.26.0(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))': dependencies: floating-vue: 5.2.2(vue@3.5.41(typescript@5.5.4)) vue: 3.5.41(typescript@5.5.4) - vue-router: 4.2.5(vue@3.5.41(typescript@5.5.4)) + vue-router: 5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)) transitivePeerDependencies: - '@nuxt/kit' - '@halo-dev/ui-plugin-bundler-kit@2.26.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rsbuild/plugin-vue@2.0.1(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(vue@3.5.41(typescript@5.5.4)))(@vitejs/plugin-vue@6.0.8(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0))(vue@3.5.41(typescript@5.5.4)))(axios@1.15.2)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0))': + '@halo-dev/richtext-editor@2.26.0(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33))(axios@1.15.2)(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33)': + dependencies: + '@floating-ui/dom': 1.8.0 + '@halo-dev/api-client': 2.26.0(axios@1.15.2) + '@halo-dev/components': 2.26.0(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) + '@halo-dev/ui-shared': 2.26.0(@tiptap/pm@3.32.0)(axios@1.15.2)(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/extension-audio': 3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-blockquote': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-bold': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-code': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-code-block': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-color': 3.32.0(@tiptap/extension-text-style@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))) + '@tiptap/extension-details': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-text-style@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)))(@tiptap/pm@3.32.0) + '@tiptap/extension-document': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-drag-handle': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33))(@tiptap/extension-node-range@3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33)) + '@tiptap/extension-drag-handle-vue-3': 3.32.0(@tiptap/extension-drag-handle@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33))(@tiptap/extension-node-range@3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33)))(@tiptap/pm@3.32.0)(@tiptap/vue-3@3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4)) + '@tiptap/extension-find-and-replace': 3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-hard-break': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-heading': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-highlight': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-horizontal-rule': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-image': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-italic': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-link': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-list': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-node-range': 3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-paragraph': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-strike': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-subscript': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-superscript': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-table': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-text': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-text-align': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-text-style': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-underline': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extensions': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + '@tiptap/suggestion': 3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/vue-3': 3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(vue@3.5.41(typescript@5.5.4)) + '@tiptap/y-tiptap': 3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33) + github-markdown-css: 5.9.0 + linkifyjs: 4.4.0 + prosemirror-collab: 1.3.1 + prosemirror-markdown: 1.13.9 + prosemirror-menu: 1.3.2 + prosemirror-schema-basic: 1.2.5 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7) + scroll-into-view-if-needed: 3.1.0 + vue: 3.5.41(typescript@5.5.4) + transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/extension-collaboration' + - axios + - prosemirror-model + - prosemirror-state + - prosemirror-view + - vue-router + - y-protocols + - yjs + + '@halo-dev/ui-plugin-bundler-kit@2.26.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rsbuild/plugin-vue@2.0.1(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(vue@3.5.41(typescript@5.5.4)))(@vitejs/plugin-vue@6.0.8(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(axios@1.15.2)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))': dependencies: '@halo-dev/api-client': 2.26.0(axios@1.15.2) '@rsbuild/core': 2.0.0(core-js@3.47.0) '@rsbuild/plugin-vue': 2.0.1(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(vue@3.5.41(typescript@5.5.4)) - '@vitejs/plugin-vue': 6.0.8(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0))(vue@3.5.41(typescript@5.5.4)) + '@vitejs/plugin-vue': 6.0.8(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)) es-module-lexer: 2.3.1 exsolve: 1.1.1 js-yaml: 4.1.1 pkg-types: 2.3.1 semver: 7.8.5 - vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0) + vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1) transitivePeerDependencies: - axios - '@halo-dev/ui-shared@2.26.0(@tiptap/pm@3.30.1)(axios@1.15.2)(vue-router@4.2.5(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))': + '@halo-dev/ui-shared@2.26.0(@tiptap/pm@3.32.0)(axios@1.15.2)(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))': dependencies: '@halo-dev/api-client': 2.26.0(axios@1.15.2) - '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) mitt: 3.0.1 vue: 3.5.41(typescript@5.5.4) - vue-router: 4.2.5(vue@3.5.41(typescript@5.5.4)) + vue-router: 5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)) transitivePeerDependencies: - '@tiptap/pm' - axios @@ -3017,12 +3466,6 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.0': - dependencies: - '@antfu/install-pkg': 1.1.0 - '@iconify/types': 2.0.0 - mlly: 1.8.0 - '@iconify/utils@3.1.4': dependencies: '@antfu/install-pkg': 1.1.0 @@ -3036,6 +3479,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/gen-mapping@0.4.0-beta.0': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -3051,11 +3499,18 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 + '@mixmark-io/domino@2.2.0': {} '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': @@ -3212,6 +3667,8 @@ snapshots: dependencies: quansync: 1.0.0 + '@remirror/core-constants@3.0.0': {} + '@rolldown/binding-android-arm64@1.2.3': optional: true @@ -3362,25 +3819,215 @@ snapshots: vue: 3.5.41(typescript@5.5.4) vue-demi: 0.13.11(vue@3.5.41(typescript@5.5.4)) - '@tiptap/core@3.30.1(@tiptap/pm@3.30.1)': + '@tiptap/core@3.32.0(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-audio@3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/pm': 3.30.1 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/pm@3.30.1': + '@tiptap/extension-blockquote@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - prosemirror-changeset: 2.4.1 - prosemirror-commands: 1.7.1 - prosemirror-dropcursor: 1.8.2 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-bold@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-bubble-menu@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + optional: true + + '@tiptap/extension-code-block@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-code@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + '@tiptap/y-tiptap': 3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33) + yjs: 13.6.33 + + '@tiptap/extension-color@3.32.0(@tiptap/extension-text-style@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)))': + dependencies: + '@tiptap/extension-text-style': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + + '@tiptap/extension-details@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-text-style@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/extension-text-style': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-document@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-drag-handle-vue-3@3.32.0(@tiptap/extension-drag-handle@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33))(@tiptap/extension-node-range@3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33)))(@tiptap/pm@3.32.0)(@tiptap/vue-3@3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))': + dependencies: + '@tiptap/extension-drag-handle': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33))(@tiptap/extension-node-range@3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33)) + '@tiptap/pm': 3.32.0 + '@tiptap/vue-3': 3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(vue@3.5.41(typescript@5.5.4)) + vue: 3.5.41(typescript@5.5.4) + + '@tiptap/extension-drag-handle@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33))(@tiptap/extension-node-range@3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))': + dependencies: + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/extension-collaboration': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33))(yjs@13.6.33) + '@tiptap/extension-node-range': 3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + '@tiptap/y-tiptap': 3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33) + + '@tiptap/extension-find-and-replace@3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + re2js: 2.9.0 + + '@tiptap/extension-floating-menu@3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + optional: true + + '@tiptap/extension-hard-break@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-heading@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-highlight@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-horizontal-rule@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-image@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-italic@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-link@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + linkifyjs: 4.4.0 + + '@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-node-range@3.29.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-paragraph@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-strike@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-subscript@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-superscript@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-table@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/extension-text-align@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-text-style@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-text@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extension-underline@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + + '@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/pm@3.32.0': + dependencies: + prosemirror-changeset: 2.4.4 + prosemirror-commands: 1.7.2 + prosemirror-dropcursor: 1.8.4 prosemirror-gapcursor: 1.4.1 - prosemirror-history: 1.5.0 + prosemirror-history: 1.5.1 prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.2 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.7 + + '@tiptap/suggestion@3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/vue-3@3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(vue@3.5.41(typescript@5.5.4))': + dependencies: + '@floating-ui/dom': 1.8.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + vue: 3.5.41(typescript@5.5.4) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-floating-menu': 3.32.0(@floating-ui/dom@1.8.0)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + + '@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7)(y-protocols@1.0.7(yjs@13.6.33))(yjs@13.6.33)': + dependencies: + lib0: 0.2.119 + prosemirror-model: 1.25.12 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.7 + y-protocols: 1.0.7(yjs@13.6.33) + yjs: 13.6.33 '@tsconfig/node20@20.1.9': {} @@ -3399,6 +4046,8 @@ snapshots: '@types/js-yaml@4.0.9': {} + '@types/jsesc@2.5.1': {} + '@types/json-schema@7.0.15': optional: true @@ -3501,7 +4150,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.8.5 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 @@ -3516,8 +4165,8 @@ snapshots: '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.7.3 - tinyglobby: 0.2.16 + semver: 7.8.5 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: @@ -3680,7 +4329,7 @@ snapshots: '@unocss/rule-utils@66.6.8': dependencies: - '@unocss/core': 66.6.8 + '@unocss/core': 66.7.5 magic-string: 0.30.21 '@unocss/rule-utils@66.7.5': @@ -3708,7 +4357,7 @@ snapshots: dependencies: '@unocss/core': 66.7.5 - '@unocss/vite@66.7.5(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0))': + '@unocss/vite@66.7.5(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))': dependencies: '@jridgewell/remapping': 2.3.5 '@unocss/config': 66.7.5 @@ -3719,12 +4368,12 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.17 unplugin-utils: 0.3.1 - vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0) + vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1) - '@vitejs/plugin-vue@6.0.8(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0))(vue@3.5.41(typescript@5.5.4))': + '@vitejs/plugin-vue@6.0.8(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0) + vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1) vue: 3.5.41(typescript@5.5.4) '@volar/language-core@2.4.28': @@ -3739,13 +4388,15 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.0.8 - '@vue/compiler-core@3.5.32': + '@vue-macros/common@3.1.4(vue@3.5.41(typescript@5.5.4))': dependencies: - '@babel/parser': 7.29.2 - '@vue/shared': 3.5.32 - entities: 7.0.1 - estree-walker: 2.0.2 - source-map-js: 1.2.1 + '@vue/compiler-sfc': 3.5.41 + ast-kit: 2.2.0 + local-pkg: 1.2.1 + magic-string-ast: 1.0.3 + unplugin-utils: 0.3.2 + optionalDependencies: + vue: 3.5.41(typescript@5.5.4) '@vue/compiler-core@3.5.41': dependencies: @@ -3755,11 +4406,6 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.32': - dependencies: - '@vue/compiler-core': 3.5.32 - '@vue/shared': 3.5.32 - '@vue/compiler-dom@3.5.41': dependencies: '@vue/compiler-core': 3.5.41 @@ -3784,6 +4430,19 @@ snapshots: '@vue/devtools-api@6.5.0': {} + '@vue/devtools-api@8.2.1': + dependencies: + '@vue/devtools-kit': 8.2.1 + + '@vue/devtools-kit@8.2.1': + dependencies: + '@vue/devtools-shared': 8.2.1 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + + '@vue/devtools-shared@8.2.1': {} + '@vue/eslint-config-prettier@9.0.0(@types/eslint@9.6.1)(eslint@8.57.1)(prettier@3.9.6)': dependencies: eslint: 8.57.1 @@ -3808,8 +4467,8 @@ snapshots: '@vue/language-core@3.3.9': dependencies: '@volar/language-core': 2.4.28 - '@vue/compiler-dom': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/compiler-dom': 3.5.41 + '@vue/shared': 3.5.41 alien-signals: 3.2.1 muggle-string: 0.4.1 path-browserify: 1.0.1 @@ -3837,8 +4496,6 @@ snapshots: '@vue/runtime-dom': 3.5.41 '@vue/shared': 3.5.41 - '@vue/shared@3.5.32': {} - '@vue/shared@3.5.41': {} '@vue/tsconfig@0.5.1': {} @@ -3852,11 +4509,11 @@ snapshots: '@vueuse/metadata@14.4.0': {} - '@vueuse/router@14.4.0(vue-router@4.2.5(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))': + '@vueuse/router@14.4.0(vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)))(vue@3.5.41(typescript@5.5.4))': dependencies: '@vueuse/shared': 14.4.0(vue@3.5.41(typescript@5.5.4)) vue: 3.5.41(typescript@5.5.4) - vue-router: 4.2.5(vue@3.5.41(typescript@5.5.4)) + vue-router: 5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)) '@vueuse/shared@14.4.0(vue@3.5.41(typescript@5.5.4))': dependencies: @@ -3870,6 +4527,8 @@ snapshots: acorn@8.15.0: {} + acorn@8.19.0: {} + agent-base@7.1.1: dependencies: debug: 4.4.3 @@ -3913,6 +4572,17 @@ snapshots: object.assign: 4.1.5 util: 0.12.5 + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.29.8 + pathe: 2.0.3 + + ast-walker-scope@0.9.0: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + ast-kit: 2.2.0 + asynckit@0.4.0: {} available-typed-arrays@1.0.7: @@ -3933,6 +4603,8 @@ snapshots: base64-js@1.5.1: {} + birpc@2.9.0: {} + bluebird@3.4.7: {} bn.js@4.12.0: {} @@ -4077,12 +4749,12 @@ snapshots: commander@2.20.3: optional: true + compute-scroll-into-view@3.1.1: {} + concat-map@0.0.1: {} confbox@0.1.8: {} - confbox@0.2.2: {} - confbox@0.2.4: {} consola@3.4.2: {} @@ -4120,6 +4792,8 @@ snapshots: create-require@1.1.1: {} + crelt@1.0.7: {} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -4254,7 +4928,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.4 es-toolkit@1.46.0: {} @@ -4282,7 +4956,7 @@ snapshots: natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.0 - semver: 7.7.3 + semver: 7.8.5 vue-eslint-parser: 9.4.3(eslint@8.57.1) xml-name-validator: 4.0.0 transitivePeerDependencies: @@ -4373,8 +5047,6 @@ snapshots: md5.js: 1.3.5 safe-buffer: 5.2.1 - exsolve@1.0.8: {} - exsolve@1.1.1: {} extend-shallow@2.0.1: @@ -4401,10 +5073,6 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.5.0(picomatch@4.0.4): - optionalDependencies: - picomatch: 4.0.4 - fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 @@ -4441,20 +5109,12 @@ snapshots: dependencies: is-callable: 1.2.7 - form-data@4.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.2 + hasown: 2.0.4 mime-types: 2.1.35 fs.realpath@1.0.0: {} @@ -4474,7 +5134,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -4482,6 +5142,8 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + github-markdown-css@5.9.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4555,10 +5217,6 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -4569,6 +5227,8 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + hookable@5.5.3: {} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -4662,6 +5322,8 @@ snapshots: isomorphic-timers-promises@1.0.1: {} + isomorphic.js@0.2.5: {} + jiti@2.6.1: {} js-yaml@3.14.1: @@ -4678,7 +5340,7 @@ snapshots: cssstyle: 4.0.1 data-urls: 5.0.0 decimal.js: 10.4.3 - form-data: 4.0.4 + form-data: 4.0.5 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 @@ -4701,10 +5363,14 @@ snapshots: - supports-color - utf-8-validate + jsesc@3.1.0: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -4719,6 +5385,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lib0@0.2.119: + dependencies: + isomorphic.js: 0.2.5 + lie@3.3.0: dependencies: immediate: 3.0.6 @@ -4776,10 +5446,18 @@ snapshots: dependencies: uc.micro: 2.1.0 + linkifyjs@4.4.0: {} + local-pkg@1.1.2: dependencies: mlly: 1.8.0 - pkg-types: 2.3.0 + pkg-types: 2.3.1 + quansync: 0.2.11 + + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 quansync: 0.2.11 locate-path@6.0.0: @@ -4806,6 +5484,10 @@ snapshots: ufo: 1.6.2 unplugin: 2.3.11 + magic-string-ast@1.0.3: + dependencies: + magic-string: 0.30.21 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4892,6 +5574,13 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.2 + mlly@1.8.2: + dependencies: + acorn: 8.19.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + mrmime@2.0.0: {} ms@2.1.3: {} @@ -5073,12 +5762,10 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.3: {} - - picomatch@4.0.4: {} - picomatch@4.0.5: {} + picomatch@4.0.7: {} + pkg-dir@5.0.0: dependencies: find-up: 5.0.0 @@ -5089,12 +5776,6 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 - pkg-types@2.3.0: - dependencies: - confbox: 0.2.2 - exsolve: 1.0.8 - pathe: 2.0.3 - pkg-types@2.3.1: dependencies: confbox: 0.2.4 @@ -5133,79 +5814,108 @@ snapshots: process@0.11.10: {} - prosemirror-changeset@2.4.1: + prosemirror-changeset@2.4.4: + dependencies: + prosemirror-transform: 1.12.4 + + prosemirror-collab@1.3.1: dependencies: - prosemirror-transform: 1.12.0 + prosemirror-state: 1.4.4 - prosemirror-commands@1.7.1: + prosemirror-commands@1.7.2: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.4 - prosemirror-dropcursor@1.8.2: + prosemirror-dropcursor@1.8.4: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.2 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.7 prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-view: 1.42.2 + prosemirror-view: 1.42.7 - prosemirror-history@1.5.0: + prosemirror-history@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.2 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.7 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.4 prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-model@1.25.11: + prosemirror-markdown@1.13.9: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.1 + prosemirror-model: 1.25.12 + + prosemirror-menu@1.3.2: + dependencies: + crelt: 1.0.7 + prosemirror-commands: 1.7.2 + prosemirror-history: 1.5.1 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.12: dependencies: orderedmap: 2.1.1 + prosemirror-schema-basic@1.2.5: + dependencies: + prosemirror-model: 1.25.12 + prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.4 prosemirror-state@1.4.4: dependencies: - prosemirror-model: 1.25.11 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.2 + prosemirror-model: 1.25.12 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.7 prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.2 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.7 - prosemirror-transform@1.12.0: + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.7): dependencies: - prosemirror-model: 1.25.11 + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.12 + prosemirror-state: 1.4.4 + prosemirror-view: 1.42.7 + + prosemirror-transform@1.12.4: + dependencies: + prosemirror-model: 1.25.12 - prosemirror-view@1.42.2: + prosemirror-view@1.42.7: dependencies: - prosemirror-model: 1.25.11 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.4 proxy-from-env@2.1.0: {} @@ -5226,10 +5936,6 @@ snapshots: punycode@2.3.1: {} - qs@6.14.1: - dependencies: - side-channel: 1.1.0 - qs@6.15.3: dependencies: es-define-property: 1.0.1 @@ -5254,6 +5960,8 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.2.1 + re2js@2.9.0: {} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -5358,13 +6066,17 @@ snapshots: dependencies: xmlchars: 2.2.0 + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + scule@1.3.0: {} + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - semver@7.7.3: {} - semver@7.8.5: {} set-function-length@1.2.2: @@ -5389,11 +6101,6 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 @@ -5414,14 +6121,6 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - side-channel@1.1.1: dependencies: es-errors: 1.3.0 @@ -5499,7 +6198,7 @@ snapshots: terser@5.42.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.15.0 + acorn: 8.19.0 commander: 2.20.3 source-map-support: 0.5.21 optional: true @@ -5512,11 +6211,6 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.5) @@ -5569,6 +6263,8 @@ snapshots: ufo@1.6.2: {} + ufo@1.6.4: {} + unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 @@ -5588,7 +6284,7 @@ snapshots: universalify@0.2.0: {} - unocss@66.7.5(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)): + unocss@66.7.5(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1)): dependencies: '@unocss/cli': 66.7.5 '@unocss/core': 66.7.5 @@ -5606,14 +6302,14 @@ snapshots: '@unocss/transformer-compile-class': 66.7.5 '@unocss/transformer-directives': 66.7.5 '@unocss/transformer-variant-group': 66.7.5 - '@unocss/vite': 66.7.5(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)) + '@unocss/vite': 66.7.5(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1)) transitivePeerDependencies: - vite unplugin-icons@23.0.1(@vue/compiler-sfc@3.5.41): dependencies: '@antfu/install-pkg': 1.1.0 - '@iconify/utils': 3.1.0 + '@iconify/utils': 3.1.4 local-pkg: 1.1.2 obug: 2.1.4 unplugin: 2.3.11 @@ -5623,7 +6319,12 @@ snapshots: unplugin-utils@0.3.1: dependencies: pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.5 + + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.7 unplugin@2.3.11: dependencies: @@ -5632,6 +6333,17 @@ snapshots: picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 + unplugin@3.4.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1)): + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.7 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + '@rsbuild/core': 2.0.0(core-js@3.47.0) + '@rspack/core': 2.0.0(@swc/helpers@0.5.21) + rolldown: 1.2.3 + vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1) + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -5644,7 +6356,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.14.1 + qs: 6.15.3 util-deprecate@1.0.2: {} @@ -5656,15 +6368,15 @@ snapshots: is-typed-array: 1.1.13 which-typed-array: 1.1.15 - vite-plugin-node-polyfills@0.28.0(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)): + vite-plugin-node-polyfills@0.28.0(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1)): dependencies: '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.3.1 - vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0) + vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1) transitivePeerDependencies: - rollup - vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0): + vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -5677,6 +6389,7 @@ snapshots: jiti: 2.6.1 sass: 1.80.3 terser: 5.42.0 + yaml: 2.9.1 vm-browserify@1.1.2: {} @@ -5695,7 +6408,7 @@ snapshots: espree: 9.6.1 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.7.3 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -5707,10 +6420,39 @@ snapshots: dependencies: vue: 3.5.41(typescript@5.5.4) - vue-router@4.2.5(vue@3.5.41(typescript@5.5.4)): + vue-router@5.1.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(@vue/compiler-sfc@3.5.41)(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1))(vue@3.5.41(typescript@5.5.4)): dependencies: - '@vue/devtools-api': 6.5.0 + '@babel/generator': 8.0.6 + '@vue-macros/common': 3.1.4(vue@3.5.41(typescript@5.5.4)) + '@vue/devtools-api': 8.2.1 + ast-walker-scope: 0.9.0 + chokidar: 5.0.0 + json5: 2.2.3 + local-pkg: 1.2.1 + magic-string: 0.30.21 + mlly: 1.8.2 + muggle-string: 0.4.1 + pathe: 2.0.3 + picomatch: 4.0.7 + scule: 1.3.0 + tinyglobby: 0.2.17 + unplugin: 3.4.0(@rsbuild/core@2.0.0(core-js@3.47.0))(@rspack/core@2.0.0(@swc/helpers@0.5.21))(rolldown@1.2.3)(vite@8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1)) + unplugin-utils: 0.3.2 vue: 3.5.41(typescript@5.5.4) + yaml: 2.9.1 + optionalDependencies: + '@vue/compiler-sfc': 3.5.41 + vite: 8.2.1(@types/node@24.12.2)(jiti@2.6.1)(sass@1.80.3)(terser@5.42.0)(yaml@2.9.1) + transitivePeerDependencies: + - '@farmfe/core' + - '@rsbuild/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rolldown + - rollup + - unloader + - webpack vue-tsc@3.3.9(typescript@5.5.4): dependencies: @@ -5775,4 +6517,15 @@ snapshots: xtend@4.0.2: {} + y-protocols@1.0.7(yjs@13.6.33): + dependencies: + lib0: 0.2.119 + yjs: 13.6.33 + + yaml@2.9.1: {} + + yjs@13.6.33: + dependencies: + lib0: 0.2.119 + yocto-queue@0.1.0: {} diff --git a/ui/src/api/generated/.gitignore b/ui/src/api/generated/.gitignore new file mode 100644 index 0000000..149b576 --- /dev/null +++ b/ui/src/api/generated/.gitignore @@ -0,0 +1,4 @@ +wwwroot/*.js +node_modules +typings +dist diff --git a/ui/src/api/generated/.npmignore b/ui/src/api/generated/.npmignore new file mode 100644 index 0000000..999d88d --- /dev/null +++ b/ui/src/api/generated/.npmignore @@ -0,0 +1 @@ +# empty npmignore to ensure all required files (e.g., in the dist folder) are published by npm \ No newline at end of file diff --git a/ui/src/api/generated/.openapi-generator-ignore b/ui/src/api/generated/.openapi-generator-ignore new file mode 100644 index 0000000..7484ee5 --- /dev/null +++ b/ui/src/api/generated/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/ui/src/api/generated/.openapi-generator/FILES b/ui/src/api/generated/.openapi-generator/FILES new file mode 100644 index 0000000..fd051d8 --- /dev/null +++ b/ui/src/api/generated/.openapi-generator/FILES @@ -0,0 +1,22 @@ +.gitignore +.npmignore +.openapi-generator-ignore +api.ts +api/content-snippet-v1alpha1-api.ts +base.ts +common.ts +configuration.ts +git_push.sh +index.ts +models/add-operation.ts +models/content-snippet-list.ts +models/content-snippet-spec.ts +models/content-snippet.ts +models/copy-operation.ts +models/index.ts +models/json-patch-inner.ts +models/metadata.ts +models/move-operation.ts +models/remove-operation.ts +models/replace-operation.ts +models/test-operation.ts diff --git a/ui/src/api/generated/.openapi-generator/VERSION b/ui/src/api/generated/.openapi-generator/VERSION new file mode 100644 index 0000000..1985849 --- /dev/null +++ b/ui/src/api/generated/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.7.0 diff --git a/ui/src/api/generated/api.ts b/ui/src/api/generated/api.ts new file mode 100644 index 0000000..a906525 --- /dev/null +++ b/ui/src/api/generated/api.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export * from './api/content-snippet-v1alpha1-api'; diff --git a/ui/src/api/generated/api/content-snippet-v1alpha1-api.ts b/ui/src/api/generated/api/content-snippet-v1alpha1-api.ts new file mode 100644 index 0000000..ff0e57d --- /dev/null +++ b/ui/src/api/generated/api/content-snippet-v1alpha1-api.ts @@ -0,0 +1,902 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import type { AxiosInstance, AxiosPromise, RawAxiosRequestConfig } from 'axios'; +import globalAxios from 'axios'; +import type { Configuration } from '../configuration'; +// Some imports not used depending on template conditions +// @ts-ignore +import { + DUMMY_BASE_URL, + assertParamExists, + createRequestFunction, + serializeDataIfNeeded, + setBasicAuthToObject, + setBearerAuthToObject, + setSearchParams, + toPathString, +} from '../common'; +// @ts-ignore +import { BASE_PATH, BaseAPI, RequiredError, operationServerMap, type RequestArgs } from '../base'; +// @ts-ignore +import type { ContentSnippet } from '../models'; +// @ts-ignore +import type { ContentSnippetList } from '../models'; +// @ts-ignore +import type { JsonPatchInner } from '../models'; +/** + * ContentSnippetV1alpha1Api - axios parameter creator + * @export + */ +export const ContentSnippetV1alpha1ApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * Create ContentSnippet + * @param {ContentSnippet} [contentSnippet] Fresh contentsnippet + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createContentSnippet: async ( + contentSnippet?: ContentSnippet, + options: RawAxiosRequestConfig = {} + ): Promise => { + const localVarPath = `/apis/content-tools.halo.run/v1alpha1/contentsnippets`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication basicAuth required + // http basic authentication required + setBasicAuthToObject(localVarRequestOptions, configuration); + + // authentication bearerAuth required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration); + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + localVarRequestOptions.data = serializeDataIfNeeded( + contentSnippet, + localVarRequestOptions, + configuration + ); + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Delete ContentSnippet + * @param {string} name Name of contentsnippet + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteContentSnippet: async ( + name: string, + options: RawAxiosRequestConfig = {} + ): Promise => { + // verify required parameter 'name' is not null or undefined + assertParamExists('deleteContentSnippet', 'name', name); + const localVarPath = `/apis/content-tools.halo.run/v1alpha1/contentsnippets/{name}`.replace( + `{${'name'}}`, + encodeURIComponent(String(name)) + ); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication basicAuth required + // http basic authentication required + setBasicAuthToObject(localVarRequestOptions, configuration); + + // authentication bearerAuth required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration); + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Get ContentSnippet + * @param {string} name Name of contentsnippet + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getContentSnippet: async ( + name: string, + options: RawAxiosRequestConfig = {} + ): Promise => { + // verify required parameter 'name' is not null or undefined + assertParamExists('getContentSnippet', 'name', name); + const localVarPath = `/apis/content-tools.halo.run/v1alpha1/contentsnippets/{name}`.replace( + `{${'name'}}`, + encodeURIComponent(String(name)) + ); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication basicAuth required + // http basic authentication required + setBasicAuthToObject(localVarRequestOptions, configuration); + + // authentication bearerAuth required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration); + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List ContentSnippet + * @param {number} [page] Page number. Default is 0. + * @param {number} [size] Size number. Default is 0. + * @param {Array} [labelSelector] Label selector. e.g.: hidden!=true + * @param {Array} [fieldSelector] Field selector. e.g.: metadata.name==halo + * @param {Array} [sort] Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listContentSnippet: async ( + page?: number, + size?: number, + labelSelector?: Array, + fieldSelector?: Array, + sort?: Array, + options: RawAxiosRequestConfig = {} + ): Promise => { + const localVarPath = `/apis/content-tools.halo.run/v1alpha1/contentsnippets`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication basicAuth required + // http basic authentication required + setBasicAuthToObject(localVarRequestOptions, configuration); + + // authentication bearerAuth required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration); + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (size !== undefined) { + localVarQueryParameter['size'] = size; + } + + if (labelSelector) { + localVarQueryParameter['labelSelector'] = labelSelector; + } + + if (fieldSelector) { + localVarQueryParameter['fieldSelector'] = fieldSelector; + } + + if (sort) { + localVarQueryParameter['sort'] = sort; + } + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Patch ContentSnippet + * @param {string} name Name of contentsnippet + * @param {Array} [jsonPatchInner] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + patchContentSnippet: async ( + name: string, + jsonPatchInner?: Array, + options: RawAxiosRequestConfig = {} + ): Promise => { + // verify required parameter 'name' is not null or undefined + assertParamExists('patchContentSnippet', 'name', name); + const localVarPath = `/apis/content-tools.halo.run/v1alpha1/contentsnippets/{name}`.replace( + `{${'name'}}`, + encodeURIComponent(String(name)) + ); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication basicAuth required + // http basic authentication required + setBasicAuthToObject(localVarRequestOptions, configuration); + + // authentication bearerAuth required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration); + + localVarHeaderParameter['Content-Type'] = 'application/json-patch+json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + localVarRequestOptions.data = serializeDataIfNeeded( + jsonPatchInner, + localVarRequestOptions, + configuration + ); + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Update ContentSnippet + * @param {string} name Name of contentsnippet + * @param {ContentSnippet} [contentSnippet] Updated contentsnippet + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateContentSnippet: async ( + name: string, + contentSnippet?: ContentSnippet, + options: RawAxiosRequestConfig = {} + ): Promise => { + // verify required parameter 'name' is not null or undefined + assertParamExists('updateContentSnippet', 'name', name); + const localVarPath = `/apis/content-tools.halo.run/v1alpha1/contentsnippets/{name}`.replace( + `{${'name'}}`, + encodeURIComponent(String(name)) + ); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options }; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication basicAuth required + // http basic authentication required + setBasicAuthToObject(localVarRequestOptions, configuration); + + // authentication bearerAuth required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration); + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = { + ...localVarHeaderParameter, + ...headersFromBaseOptions, + ...options.headers, + }; + localVarRequestOptions.data = serializeDataIfNeeded( + contentSnippet, + localVarRequestOptions, + configuration + ); + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + }; +}; + +/** + * ContentSnippetV1alpha1Api - functional programming interface + * @export + */ +export const ContentSnippetV1alpha1ApiFp = function (configuration?: Configuration) { + const localVarAxiosParamCreator = ContentSnippetV1alpha1ApiAxiosParamCreator(configuration); + return { + /** + * Create ContentSnippet + * @param {ContentSnippet} [contentSnippet] Fresh contentsnippet + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createContentSnippet( + contentSnippet?: ContentSnippet, + options?: RawAxiosRequestConfig + ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createContentSnippet( + contentSnippet, + options + ); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = + operationServerMap['ContentSnippetV1alpha1Api.createContentSnippet']?.[ + localVarOperationServerIndex + ]?.url; + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Delete ContentSnippet + * @param {string} name Name of contentsnippet + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteContentSnippet( + name: string, + options?: RawAxiosRequestConfig + ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteContentSnippet(name, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = + operationServerMap['ContentSnippetV1alpha1Api.deleteContentSnippet']?.[ + localVarOperationServerIndex + ]?.url; + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Get ContentSnippet + * @param {string} name Name of contentsnippet + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getContentSnippet( + name: string, + options?: RawAxiosRequestConfig + ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getContentSnippet(name, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = + operationServerMap['ContentSnippetV1alpha1Api.getContentSnippet']?.[ + localVarOperationServerIndex + ]?.url; + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath); + }, + /** + * List ContentSnippet + * @param {number} [page] Page number. Default is 0. + * @param {number} [size] Size number. Default is 0. + * @param {Array} [labelSelector] Label selector. e.g.: hidden!=true + * @param {Array} [fieldSelector] Field selector. e.g.: metadata.name==halo + * @param {Array} [sort] Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listContentSnippet( + page?: number, + size?: number, + labelSelector?: Array, + fieldSelector?: Array, + sort?: Array, + options?: RawAxiosRequestConfig + ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listContentSnippet( + page, + size, + labelSelector, + fieldSelector, + sort, + options + ); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = + operationServerMap['ContentSnippetV1alpha1Api.listContentSnippet']?.[ + localVarOperationServerIndex + ]?.url; + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Patch ContentSnippet + * @param {string} name Name of contentsnippet + * @param {Array} [jsonPatchInner] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async patchContentSnippet( + name: string, + jsonPatchInner?: Array, + options?: RawAxiosRequestConfig + ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.patchContentSnippet( + name, + jsonPatchInner, + options + ); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = + operationServerMap['ContentSnippetV1alpha1Api.patchContentSnippet']?.[ + localVarOperationServerIndex + ]?.url; + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Update ContentSnippet + * @param {string} name Name of contentsnippet + * @param {ContentSnippet} [contentSnippet] Updated contentsnippet + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateContentSnippet( + name: string, + contentSnippet?: ContentSnippet, + options?: RawAxiosRequestConfig + ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateContentSnippet( + name, + contentSnippet, + options + ); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = + operationServerMap['ContentSnippetV1alpha1Api.updateContentSnippet']?.[ + localVarOperationServerIndex + ]?.url; + return (axios, basePath) => + createRequestFunction( + localVarAxiosArgs, + globalAxios, + BASE_PATH, + configuration + )(axios, localVarOperationServerBasePath || basePath); + }, + }; +}; + +/** + * ContentSnippetV1alpha1Api - factory interface + * @export + */ +export const ContentSnippetV1alpha1ApiFactory = function ( + configuration?: Configuration, + basePath?: string, + axios?: AxiosInstance +) { + const localVarFp = ContentSnippetV1alpha1ApiFp(configuration); + return { + /** + * Create ContentSnippet + * @param {ContentSnippetV1alpha1ApiCreateContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiCreateContentSnippetRequest = {}, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .createContentSnippet(requestParameters.contentSnippet, options) + .then((request) => request(axios, basePath)); + }, + /** + * Delete ContentSnippet + * @param {ContentSnippetV1alpha1ApiDeleteContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiDeleteContentSnippetRequest, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .deleteContentSnippet(requestParameters.name, options) + .then((request) => request(axios, basePath)); + }, + /** + * Get ContentSnippet + * @param {ContentSnippetV1alpha1ApiGetContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiGetContentSnippetRequest, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .getContentSnippet(requestParameters.name, options) + .then((request) => request(axios, basePath)); + }, + /** + * List ContentSnippet + * @param {ContentSnippetV1alpha1ApiListContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiListContentSnippetRequest = {}, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .listContentSnippet( + requestParameters.page, + requestParameters.size, + requestParameters.labelSelector, + requestParameters.fieldSelector, + requestParameters.sort, + options + ) + .then((request) => request(axios, basePath)); + }, + /** + * Patch ContentSnippet + * @param {ContentSnippetV1alpha1ApiPatchContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + patchContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiPatchContentSnippetRequest, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .patchContentSnippet(requestParameters.name, requestParameters.jsonPatchInner, options) + .then((request) => request(axios, basePath)); + }, + /** + * Update ContentSnippet + * @param {ContentSnippetV1alpha1ApiUpdateContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiUpdateContentSnippetRequest, + options?: RawAxiosRequestConfig + ): AxiosPromise { + return localVarFp + .updateContentSnippet(requestParameters.name, requestParameters.contentSnippet, options) + .then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * Request parameters for createContentSnippet operation in ContentSnippetV1alpha1Api. + * @export + * @interface ContentSnippetV1alpha1ApiCreateContentSnippetRequest + */ +export interface ContentSnippetV1alpha1ApiCreateContentSnippetRequest { + /** + * Fresh contentsnippet + * @type {ContentSnippet} + * @memberof ContentSnippetV1alpha1ApiCreateContentSnippet + */ + readonly contentSnippet?: ContentSnippet; +} + +/** + * Request parameters for deleteContentSnippet operation in ContentSnippetV1alpha1Api. + * @export + * @interface ContentSnippetV1alpha1ApiDeleteContentSnippetRequest + */ +export interface ContentSnippetV1alpha1ApiDeleteContentSnippetRequest { + /** + * Name of contentsnippet + * @type {string} + * @memberof ContentSnippetV1alpha1ApiDeleteContentSnippet + */ + readonly name: string; +} + +/** + * Request parameters for getContentSnippet operation in ContentSnippetV1alpha1Api. + * @export + * @interface ContentSnippetV1alpha1ApiGetContentSnippetRequest + */ +export interface ContentSnippetV1alpha1ApiGetContentSnippetRequest { + /** + * Name of contentsnippet + * @type {string} + * @memberof ContentSnippetV1alpha1ApiGetContentSnippet + */ + readonly name: string; +} + +/** + * Request parameters for listContentSnippet operation in ContentSnippetV1alpha1Api. + * @export + * @interface ContentSnippetV1alpha1ApiListContentSnippetRequest + */ +export interface ContentSnippetV1alpha1ApiListContentSnippetRequest { + /** + * Page number. Default is 0. + * @type {number} + * @memberof ContentSnippetV1alpha1ApiListContentSnippet + */ + readonly page?: number; + + /** + * Size number. Default is 0. + * @type {number} + * @memberof ContentSnippetV1alpha1ApiListContentSnippet + */ + readonly size?: number; + + /** + * Label selector. e.g.: hidden!=true + * @type {Array} + * @memberof ContentSnippetV1alpha1ApiListContentSnippet + */ + readonly labelSelector?: Array; + + /** + * Field selector. e.g.: metadata.name==halo + * @type {Array} + * @memberof ContentSnippetV1alpha1ApiListContentSnippet + */ + readonly fieldSelector?: Array; + + /** + * Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported. + * @type {Array} + * @memberof ContentSnippetV1alpha1ApiListContentSnippet + */ + readonly sort?: Array; +} + +/** + * Request parameters for patchContentSnippet operation in ContentSnippetV1alpha1Api. + * @export + * @interface ContentSnippetV1alpha1ApiPatchContentSnippetRequest + */ +export interface ContentSnippetV1alpha1ApiPatchContentSnippetRequest { + /** + * Name of contentsnippet + * @type {string} + * @memberof ContentSnippetV1alpha1ApiPatchContentSnippet + */ + readonly name: string; + + /** + * + * @type {Array} + * @memberof ContentSnippetV1alpha1ApiPatchContentSnippet + */ + readonly jsonPatchInner?: Array; +} + +/** + * Request parameters for updateContentSnippet operation in ContentSnippetV1alpha1Api. + * @export + * @interface ContentSnippetV1alpha1ApiUpdateContentSnippetRequest + */ +export interface ContentSnippetV1alpha1ApiUpdateContentSnippetRequest { + /** + * Name of contentsnippet + * @type {string} + * @memberof ContentSnippetV1alpha1ApiUpdateContentSnippet + */ + readonly name: string; + + /** + * Updated contentsnippet + * @type {ContentSnippet} + * @memberof ContentSnippetV1alpha1ApiUpdateContentSnippet + */ + readonly contentSnippet?: ContentSnippet; +} + +/** + * ContentSnippetV1alpha1Api - object-oriented interface + * @export + * @class ContentSnippetV1alpha1Api + * @extends {BaseAPI} + */ +export class ContentSnippetV1alpha1Api extends BaseAPI { + /** + * Create ContentSnippet + * @param {ContentSnippetV1alpha1ApiCreateContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ContentSnippetV1alpha1Api + */ + public createContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiCreateContentSnippetRequest = {}, + options?: RawAxiosRequestConfig + ) { + return ContentSnippetV1alpha1ApiFp(this.configuration) + .createContentSnippet(requestParameters.contentSnippet, options) + .then((request) => request(this.axios, this.basePath)); + } + + /** + * Delete ContentSnippet + * @param {ContentSnippetV1alpha1ApiDeleteContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ContentSnippetV1alpha1Api + */ + public deleteContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiDeleteContentSnippetRequest, + options?: RawAxiosRequestConfig + ) { + return ContentSnippetV1alpha1ApiFp(this.configuration) + .deleteContentSnippet(requestParameters.name, options) + .then((request) => request(this.axios, this.basePath)); + } + + /** + * Get ContentSnippet + * @param {ContentSnippetV1alpha1ApiGetContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ContentSnippetV1alpha1Api + */ + public getContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiGetContentSnippetRequest, + options?: RawAxiosRequestConfig + ) { + return ContentSnippetV1alpha1ApiFp(this.configuration) + .getContentSnippet(requestParameters.name, options) + .then((request) => request(this.axios, this.basePath)); + } + + /** + * List ContentSnippet + * @param {ContentSnippetV1alpha1ApiListContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ContentSnippetV1alpha1Api + */ + public listContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiListContentSnippetRequest = {}, + options?: RawAxiosRequestConfig + ) { + return ContentSnippetV1alpha1ApiFp(this.configuration) + .listContentSnippet( + requestParameters.page, + requestParameters.size, + requestParameters.labelSelector, + requestParameters.fieldSelector, + requestParameters.sort, + options + ) + .then((request) => request(this.axios, this.basePath)); + } + + /** + * Patch ContentSnippet + * @param {ContentSnippetV1alpha1ApiPatchContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ContentSnippetV1alpha1Api + */ + public patchContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiPatchContentSnippetRequest, + options?: RawAxiosRequestConfig + ) { + return ContentSnippetV1alpha1ApiFp(this.configuration) + .patchContentSnippet(requestParameters.name, requestParameters.jsonPatchInner, options) + .then((request) => request(this.axios, this.basePath)); + } + + /** + * Update ContentSnippet + * @param {ContentSnippetV1alpha1ApiUpdateContentSnippetRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ContentSnippetV1alpha1Api + */ + public updateContentSnippet( + requestParameters: ContentSnippetV1alpha1ApiUpdateContentSnippetRequest, + options?: RawAxiosRequestConfig + ) { + return ContentSnippetV1alpha1ApiFp(this.configuration) + .updateContentSnippet(requestParameters.name, requestParameters.contentSnippet, options) + .then((request) => request(this.axios, this.basePath)); + } +} diff --git a/ui/src/api/generated/base.ts b/ui/src/api/generated/base.ts new file mode 100644 index 0000000..002ace3 --- /dev/null +++ b/ui/src/api/generated/base.ts @@ -0,0 +1,91 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import type { Configuration } from './configuration'; +// Some imports not used depending on template conditions +// @ts-ignore +import type { AxiosInstance, RawAxiosRequestConfig } from 'axios'; +import globalAxios from 'axios'; + +export const BASE_PATH = 'http://localhost:31438'.replace(/\/+$/, ''); + +/** + * + * @export + */ +export const COLLECTION_FORMATS = { + csv: ',', + ssv: ' ', + tsv: '\t', + pipes: '|', +}; + +/** + * + * @export + * @interface RequestArgs + */ +export interface RequestArgs { + url: string; + options: RawAxiosRequestConfig; +} + +/** + * + * @export + * @class BaseAPI + */ +export class BaseAPI { + protected configuration: Configuration | undefined; + + constructor( + configuration?: Configuration, + protected basePath: string = BASE_PATH, + protected axios: AxiosInstance = globalAxios + ) { + if (configuration) { + this.configuration = configuration; + this.basePath = configuration.basePath ?? basePath; + } + } +} + +/** + * + * @export + * @class RequiredError + * @extends {Error} + */ +export class RequiredError extends Error { + constructor( + public field: string, + msg?: string + ) { + super(msg); + this.name = 'RequiredError'; + } +} + +interface ServerMap { + [key: string]: { + url: string; + description: string; + }[]; +} + +/** + * + * @export + */ +export const operationServerMap: ServerMap = {}; diff --git a/ui/src/api/generated/common.ts b/ui/src/api/generated/common.ts new file mode 100644 index 0000000..18742a6 --- /dev/null +++ b/ui/src/api/generated/common.ts @@ -0,0 +1,187 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import type { AxiosInstance, AxiosResponse } from 'axios'; +import type { RequestArgs } from './base'; +import { RequiredError } from './base'; +import type { Configuration } from './configuration'; + +/** + * + * @export + */ +export const DUMMY_BASE_URL = 'https://example.com'; + +/** + * + * @throws {RequiredError} + * @export + */ +export const assertParamExists = function ( + functionName: string, + paramName: string, + paramValue: unknown +) { + if (paramValue === null || paramValue === undefined) { + throw new RequiredError( + paramName, + `Required parameter ${paramName} was null or undefined when calling ${functionName}.` + ); + } +}; + +/** + * + * @export + */ +export const setApiKeyToObject = async function ( + object: any, + keyParamName: string, + configuration?: Configuration +) { + if (configuration && configuration.apiKey) { + const localVarApiKeyValue = + typeof configuration.apiKey === 'function' + ? await configuration.apiKey(keyParamName) + : await configuration.apiKey; + object[keyParamName] = localVarApiKeyValue; + } +}; + +/** + * + * @export + */ +export const setBasicAuthToObject = function (object: any, configuration?: Configuration) { + if (configuration && (configuration.username || configuration.password)) { + object['auth'] = { username: configuration.username, password: configuration.password }; + } +}; + +/** + * + * @export + */ +export const setBearerAuthToObject = async function (object: any, configuration?: Configuration) { + if (configuration && configuration.accessToken) { + const accessToken = + typeof configuration.accessToken === 'function' + ? await configuration.accessToken() + : await configuration.accessToken; + object['Authorization'] = 'Bearer ' + accessToken; + } +}; + +/** + * + * @export + */ +export const setOAuthToObject = async function ( + object: any, + name: string, + scopes: string[], + configuration?: Configuration +) { + if (configuration && configuration.accessToken) { + const localVarAccessTokenValue = + typeof configuration.accessToken === 'function' + ? await configuration.accessToken(name, scopes) + : await configuration.accessToken; + object['Authorization'] = 'Bearer ' + localVarAccessTokenValue; + } +}; + +function setFlattenedQueryParams( + urlSearchParams: URLSearchParams, + parameter: any, + key: string = '' +): void { + if (parameter == null) return; + if (typeof parameter === 'object') { + if (Array.isArray(parameter)) { + (parameter as any[]).forEach((item) => setFlattenedQueryParams(urlSearchParams, item, key)); + } else { + Object.keys(parameter).forEach((currentKey) => + setFlattenedQueryParams( + urlSearchParams, + parameter[currentKey], + `${key}${key !== '' ? '.' : ''}${currentKey}` + ) + ); + } + } else { + if (urlSearchParams.has(key)) { + urlSearchParams.append(key, parameter); + } else { + urlSearchParams.set(key, parameter); + } + } +} + +/** + * + * @export + */ +export const setSearchParams = function (url: URL, ...objects: any[]) { + const searchParams = new URLSearchParams(url.search); + setFlattenedQueryParams(searchParams, objects); + url.search = searchParams.toString(); +}; + +/** + * + * @export + */ +export const serializeDataIfNeeded = function ( + value: any, + requestOptions: any, + configuration?: Configuration +) { + const nonString = typeof value !== 'string'; + const needsSerialization = + nonString && configuration && configuration.isJsonMime + ? configuration.isJsonMime(requestOptions.headers['Content-Type']) + : nonString; + return needsSerialization ? JSON.stringify(value !== undefined ? value : {}) : value || ''; +}; + +/** + * + * @export + */ +export const toPathString = function (url: URL) { + return url.pathname + url.search + url.hash; +}; + +/** + * + * @export + */ +export const createRequestFunction = function ( + axiosArgs: RequestArgs, + globalAxios: AxiosInstance, + BASE_PATH: string, + configuration?: Configuration +) { + return >( + axios: AxiosInstance = globalAxios, + basePath: string = BASE_PATH + ) => { + const axiosRequestArgs = { + ...axiosArgs.options, + url: (axios.defaults.baseURL ? '' : (configuration?.basePath ?? basePath)) + axiosArgs.url, + }; + return axios.request(axiosRequestArgs); + }; +}; diff --git a/ui/src/api/generated/configuration.ts b/ui/src/api/generated/configuration.ts new file mode 100644 index 0000000..a1dcab1 --- /dev/null +++ b/ui/src/api/generated/configuration.ts @@ -0,0 +1,124 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface ConfigurationParameters { + apiKey?: + string | Promise | ((name: string) => string) | ((name: string) => Promise); + username?: string; + password?: string; + accessToken?: + | string + | Promise + | ((name?: string, scopes?: string[]) => string) + | ((name?: string, scopes?: string[]) => Promise); + basePath?: string; + serverIndex?: number; + baseOptions?: any; + formDataCtor?: new () => any; +} + +export class Configuration { + /** + * parameter for apiKey security + * @param name security name + * @memberof Configuration + */ + apiKey?: + string | Promise | ((name: string) => string) | ((name: string) => Promise); + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + username?: string; + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + password?: string; + /** + * parameter for oauth2 security + * @param name security name + * @param scopes oauth2 scope + * @memberof Configuration + */ + accessToken?: + | string + | Promise + | ((name?: string, scopes?: string[]) => string) + | ((name?: string, scopes?: string[]) => Promise); + /** + * override base path + * + * @type {string} + * @memberof Configuration + */ + basePath?: string; + /** + * override server index + * + * @type {number} + * @memberof Configuration + */ + serverIndex?: number; + /** + * base options for axios calls + * + * @type {any} + * @memberof Configuration + */ + baseOptions?: any; + /** + * The FormData constructor that will be used to create multipart form data + * requests. You can inject this here so that execution environments that + * do not support the FormData class can still run the generated client. + * + * @type {new () => FormData} + */ + formDataCtor?: new () => any; + + constructor(param: ConfigurationParameters = {}) { + this.apiKey = param.apiKey; + this.username = param.username; + this.password = param.password; + this.accessToken = param.accessToken; + this.basePath = param.basePath; + this.serverIndex = param.serverIndex; + this.baseOptions = param.baseOptions; + this.formDataCtor = param.formDataCtor; + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * application/vnd.company+json + * @param mime - MIME (Multipurpose Internet Mail Extensions) + * @return True if the given MIME is JSON, false otherwise. + */ + public isJsonMime(mime: string): boolean { + const jsonMime: RegExp = new RegExp( + '^(application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(;.*)?$', + 'i' + ); + return ( + mime !== null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json') + ); + } +} diff --git a/ui/src/api/generated/git_push.sh b/ui/src/api/generated/git_push.sh new file mode 100644 index 0000000..f53a75d --- /dev/null +++ b/ui/src/api/generated/git_push.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ +# +# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 +git_host=$4 + +if [ "$git_host" = "" ]; then + git_host="github.com" + echo "[INFO] No command line input provided. Set \$git_host to $git_host" +fi + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + echo "[INFO] No command line input provided. Set \$release_note to $release_note" +fi + +# Initialize the local directory as a Git repository +git init + +# Adds the files in the local repository and stages them for commit. +git add . + +# Commits the tracked changes and prepares them to be pushed to a remote repository. +git commit -m "$release_note" + +# Sets the new remote +git_remote=$(git remote) +if [ "$git_remote" = "" ]; then # git remote not defined + + if [ "$GIT_TOKEN" = "" ]; then + echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." + git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git + fi + +fi + +git pull origin master + +# Pushes (Forces) the changes in the local repository up to the remote repository +echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' diff --git a/ui/src/api/generated/index.ts b/ui/src/api/generated/index.ts new file mode 100644 index 0000000..b7a4b53 --- /dev/null +++ b/ui/src/api/generated/index.ts @@ -0,0 +1,17 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export * from './api'; +export * from './configuration'; +export * from './models'; diff --git a/ui/src/api/generated/models/add-operation.ts b/ui/src/api/generated/models/add-operation.ts new file mode 100644 index 0000000..1fd55d0 --- /dev/null +++ b/ui/src/api/generated/models/add-operation.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * + * @export + * @interface AddOperation + */ +export interface AddOperation { + /** + * + * @type {string} + * @memberof AddOperation + */ + op: AddOperationOpEnum; + /** + * A JSON Pointer path pointing to the location to move/copy from. + * @type {string} + * @memberof AddOperation + */ + path: string; + /** + * Value can be any JSON value + * @type {any} + * @memberof AddOperation + */ + value: any; +} + +export const AddOperationOpEnum = { + Add: 'add', +} as const; + +export type AddOperationOpEnum = (typeof AddOperationOpEnum)[keyof typeof AddOperationOpEnum]; diff --git a/ui/src/api/generated/models/content-snippet-list.ts b/ui/src/api/generated/models/content-snippet-list.ts new file mode 100644 index 0000000..5f459e5 --- /dev/null +++ b/ui/src/api/generated/models/content-snippet-list.ts @@ -0,0 +1,79 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +// May contain unused imports in some cases +// @ts-ignore +import type { ContentSnippet } from './content-snippet'; + +/** + * + * @export + * @interface ContentSnippetList + */ +export interface ContentSnippetList { + /** + * Indicates whether current page is the first page. + * @type {boolean} + * @memberof ContentSnippetList + */ + first: boolean; + /** + * Indicates whether current page has next page. + * @type {boolean} + * @memberof ContentSnippetList + */ + hasNext: boolean; + /** + * Indicates whether current page has previous page. + * @type {boolean} + * @memberof ContentSnippetList + */ + hasPrevious: boolean; + /** + * A chunk of items. + * @type {Array} + * @memberof ContentSnippetList + */ + items: Array; + /** + * Indicates whether current page is the last page. + * @type {boolean} + * @memberof ContentSnippetList + */ + last: boolean; + /** + * Page number, starts from 1. If not set or equal to 0, it means no pagination. + * @type {number} + * @memberof ContentSnippetList + */ + page: number; + /** + * Size of each page. If not set or equal to 0, it means no pagination. + * @type {number} + * @memberof ContentSnippetList + */ + size: number; + /** + * Total elements. + * @type {number} + * @memberof ContentSnippetList + */ + total: number; + /** + * Indicates total pages. + * @type {number} + * @memberof ContentSnippetList + */ + totalPages: number; +} diff --git a/ui/src/api/generated/models/content-snippet-spec.ts b/ui/src/api/generated/models/content-snippet-spec.ts new file mode 100644 index 0000000..407b072 --- /dev/null +++ b/ui/src/api/generated/models/content-snippet-spec.ts @@ -0,0 +1,39 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * + * @export + * @interface ContentSnippetSpec + */ +export interface ContentSnippetSpec { + /** + * + * @type {string} + * @memberof ContentSnippetSpec + */ + content: string; + /** + * + * @type {string} + * @memberof ContentSnippetSpec + */ + description?: string; + /** + * + * @type {string} + * @memberof ContentSnippetSpec + */ + displayName: string; +} diff --git a/ui/src/api/generated/models/content-snippet.ts b/ui/src/api/generated/models/content-snippet.ts new file mode 100644 index 0000000..f8044b8 --- /dev/null +++ b/ui/src/api/generated/models/content-snippet.ts @@ -0,0 +1,52 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +// May contain unused imports in some cases +// @ts-ignore +import type { ContentSnippetSpec } from './content-snippet-spec'; +// May contain unused imports in some cases +// @ts-ignore +import type { Metadata } from './metadata'; + +/** + * + * @export + * @interface ContentSnippet + */ +export interface ContentSnippet { + /** + * + * @type {string} + * @memberof ContentSnippet + */ + apiVersion: string; + /** + * + * @type {string} + * @memberof ContentSnippet + */ + kind: string; + /** + * + * @type {Metadata} + * @memberof ContentSnippet + */ + metadata: Metadata; + /** + * + * @type {ContentSnippetSpec} + * @memberof ContentSnippet + */ + spec: ContentSnippetSpec; +} diff --git a/ui/src/api/generated/models/copy-operation.ts b/ui/src/api/generated/models/copy-operation.ts new file mode 100644 index 0000000..0a6a698 --- /dev/null +++ b/ui/src/api/generated/models/copy-operation.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * + * @export + * @interface CopyOperation + */ +export interface CopyOperation { + /** + * A JSON Pointer path pointing to the location to move/copy from. + * @type {string} + * @memberof CopyOperation + */ + from: string; + /** + * + * @type {string} + * @memberof CopyOperation + */ + op: CopyOperationOpEnum; + /** + * A JSON Pointer path pointing to the location to move/copy from. + * @type {string} + * @memberof CopyOperation + */ + path: string; +} + +export const CopyOperationOpEnum = { + Copy: 'copy', +} as const; + +export type CopyOperationOpEnum = (typeof CopyOperationOpEnum)[keyof typeof CopyOperationOpEnum]; diff --git a/ui/src/api/generated/models/index.ts b/ui/src/api/generated/models/index.ts new file mode 100644 index 0000000..5a3ac58 --- /dev/null +++ b/ui/src/api/generated/models/index.ts @@ -0,0 +1,11 @@ +export * from './add-operation'; +export * from './content-snippet'; +export * from './content-snippet-list'; +export * from './content-snippet-spec'; +export * from './copy-operation'; +export * from './json-patch-inner'; +export * from './metadata'; +export * from './move-operation'; +export * from './remove-operation'; +export * from './replace-operation'; +export * from './test-operation'; diff --git a/ui/src/api/generated/models/json-patch-inner.ts b/ui/src/api/generated/models/json-patch-inner.ts new file mode 100644 index 0000000..e61b494 --- /dev/null +++ b/ui/src/api/generated/models/json-patch-inner.ts @@ -0,0 +1,39 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +// May contain unused imports in some cases +// @ts-ignore +import type { AddOperation } from './add-operation'; +// May contain unused imports in some cases +// @ts-ignore +import type { CopyOperation } from './copy-operation'; +// May contain unused imports in some cases +// @ts-ignore +import type { MoveOperation } from './move-operation'; +// May contain unused imports in some cases +// @ts-ignore +import type { RemoveOperation } from './remove-operation'; +// May contain unused imports in some cases +// @ts-ignore +import type { ReplaceOperation } from './replace-operation'; +// May contain unused imports in some cases +// @ts-ignore +import type { TestOperation } from './test-operation'; + +/** + * @type JsonPatchInner + * @export + */ +export type JsonPatchInner = + AddOperation | CopyOperation | MoveOperation | RemoveOperation | ReplaceOperation | TestOperation; diff --git a/ui/src/api/generated/models/metadata.ts b/ui/src/api/generated/models/metadata.ts new file mode 100644 index 0000000..de4c672 --- /dev/null +++ b/ui/src/api/generated/models/metadata.ts @@ -0,0 +1,69 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * Metadata of Extension. + * @export + * @interface Metadata + */ +export interface Metadata { + /** + * Annotations are like key-value format. + * @type {{ [key: string]: string; }} + * @memberof Metadata + */ + annotations?: { [key: string]: string }; + /** + * Creation timestamp of the Extension. + * @type {string} + * @memberof Metadata + */ + creationTimestamp?: string | null; + /** + * Deletion timestamp of the Extension. + * @type {string} + * @memberof Metadata + */ + deletionTimestamp?: string | null; + /** + * + * @type {Array} + * @memberof Metadata + */ + finalizers?: Array | null; + /** + * The name field will be generated automatically according to the given generateName field + * @type {string} + * @memberof Metadata + */ + generateName?: string; + /** + * Labels are like key-value format. + * @type {{ [key: string]: string; }} + * @memberof Metadata + */ + labels?: { [key: string]: string }; + /** + * Metadata name + * @type {string} + * @memberof Metadata + */ + name: string; + /** + * Current version of the Extension. It will be bumped up every update. + * @type {number} + * @memberof Metadata + */ + version?: number | null; +} diff --git a/ui/src/api/generated/models/move-operation.ts b/ui/src/api/generated/models/move-operation.ts new file mode 100644 index 0000000..7f6a2b4 --- /dev/null +++ b/ui/src/api/generated/models/move-operation.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * + * @export + * @interface MoveOperation + */ +export interface MoveOperation { + /** + * A JSON Pointer path pointing to the location to move/copy from. + * @type {string} + * @memberof MoveOperation + */ + from: string; + /** + * + * @type {string} + * @memberof MoveOperation + */ + op: MoveOperationOpEnum; + /** + * A JSON Pointer path pointing to the location to move/copy from. + * @type {string} + * @memberof MoveOperation + */ + path: string; +} + +export const MoveOperationOpEnum = { + Move: 'move', +} as const; + +export type MoveOperationOpEnum = (typeof MoveOperationOpEnum)[keyof typeof MoveOperationOpEnum]; diff --git a/ui/src/api/generated/models/remove-operation.ts b/ui/src/api/generated/models/remove-operation.ts new file mode 100644 index 0000000..bf56d64 --- /dev/null +++ b/ui/src/api/generated/models/remove-operation.ts @@ -0,0 +1,40 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * + * @export + * @interface RemoveOperation + */ +export interface RemoveOperation { + /** + * + * @type {string} + * @memberof RemoveOperation + */ + op: RemoveOperationOpEnum; + /** + * A JSON Pointer path pointing to the location to move/copy from. + * @type {string} + * @memberof RemoveOperation + */ + path: string; +} + +export const RemoveOperationOpEnum = { + Remove: 'remove', +} as const; + +export type RemoveOperationOpEnum = + (typeof RemoveOperationOpEnum)[keyof typeof RemoveOperationOpEnum]; diff --git a/ui/src/api/generated/models/replace-operation.ts b/ui/src/api/generated/models/replace-operation.ts new file mode 100644 index 0000000..5641498 --- /dev/null +++ b/ui/src/api/generated/models/replace-operation.ts @@ -0,0 +1,46 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * + * @export + * @interface ReplaceOperation + */ +export interface ReplaceOperation { + /** + * + * @type {string} + * @memberof ReplaceOperation + */ + op: ReplaceOperationOpEnum; + /** + * A JSON Pointer path pointing to the location to move/copy from. + * @type {string} + * @memberof ReplaceOperation + */ + path: string; + /** + * Value can be any JSON value + * @type {any} + * @memberof ReplaceOperation + */ + value: any; +} + +export const ReplaceOperationOpEnum = { + Replace: 'replace', +} as const; + +export type ReplaceOperationOpEnum = + (typeof ReplaceOperationOpEnum)[keyof typeof ReplaceOperationOpEnum]; diff --git a/ui/src/api/generated/models/test-operation.ts b/ui/src/api/generated/models/test-operation.ts new file mode 100644 index 0000000..d36a2de --- /dev/null +++ b/ui/src/api/generated/models/test-operation.ts @@ -0,0 +1,45 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Halo + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2.26.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +/** + * + * @export + * @interface TestOperation + */ +export interface TestOperation { + /** + * + * @type {string} + * @memberof TestOperation + */ + op: TestOperationOpEnum; + /** + * A JSON Pointer path pointing to the location to move/copy from. + * @type {string} + * @memberof TestOperation + */ + path: string; + /** + * Value can be any JSON value + * @type {any} + * @memberof TestOperation + */ + value: any; +} + +export const TestOperationOpEnum = { + Test: 'test', +} as const; + +export type TestOperationOpEnum = (typeof TestOperationOpEnum)[keyof typeof TestOperationOpEnum]; diff --git a/ui/src/api/index.ts b/ui/src/api/index.ts new file mode 100644 index 0000000..cf018e1 --- /dev/null +++ b/ui/src/api/index.ts @@ -0,0 +1,8 @@ +import { axiosInstance } from '@halo-dev/api-client'; +import { ContentSnippetV1alpha1Api } from './generated'; + +export const contentSnippetApiClient = { + contentSnippet: new ContentSnippetV1alpha1Api(undefined, '', axiosInstance), +}; + +export type { ContentSnippet, ContentSnippetList, ContentSnippetSpec } from './generated'; diff --git a/ui/src/components/snippet/SaveSnippetBubbleItem.vue b/ui/src/components/snippet/SaveSnippetBubbleItem.vue new file mode 100644 index 0000000..b6d4420 --- /dev/null +++ b/ui/src/components/snippet/SaveSnippetBubbleItem.vue @@ -0,0 +1,35 @@ + + + diff --git a/ui/src/components/snippet/SaveSnippetModal.vue b/ui/src/components/snippet/SaveSnippetModal.vue new file mode 100644 index 0000000..693e022 --- /dev/null +++ b/ui/src/components/snippet/SaveSnippetModal.vue @@ -0,0 +1,129 @@ + + + diff --git a/ui/src/components/snippet/SnippetPickerModal.vue b/ui/src/components/snippet/SnippetPickerModal.vue new file mode 100644 index 0000000..95fc30f --- /dev/null +++ b/ui/src/components/snippet/SnippetPickerModal.vue @@ -0,0 +1,166 @@ + + + diff --git a/ui/src/components/snippet/openSnippetPicker.ts b/ui/src/components/snippet/openSnippetPicker.ts new file mode 100644 index 0000000..80d3c94 --- /dev/null +++ b/ui/src/components/snippet/openSnippetPicker.ts @@ -0,0 +1,45 @@ +import type { Editor, Range } from '@halo-dev/richtext-editor'; +import { createApp, h, type App } from 'vue'; + +let pickerApp: App | undefined; +let pickerContainer: HTMLDivElement | undefined; +let requestId = 0; + +export function closeSnippetPicker() { + pickerApp?.unmount(); + pickerContainer?.remove(); + pickerApp = undefined; + pickerContainer = undefined; +} + +export async function openSnippetPicker(editor: Editor, range?: Range) { + closeSnippetPicker(); + + const currentRequestId = ++requestId; + + try { + const { default: SnippetPickerModal } = await import('./SnippetPickerModal.vue'); + + if (currentRequestId !== requestId) { + return; + } + + const container = document.createElement('div'); + document.body.appendChild(container); + + const app = createApp({ + render: () => + h(SnippetPickerModal, { + editor, + range, + onClose: closeSnippetPicker, + }), + }); + + pickerApp = app; + pickerContainer = container; + app.mount(container); + } catch (error) { + console.error('Failed to open content snippet picker', error); + } +} diff --git a/ui/src/editor/contentSnippetExtension.ts b/ui/src/editor/contentSnippetExtension.ts new file mode 100644 index 0000000..e34cc98 --- /dev/null +++ b/ui/src/editor/contentSnippetExtension.ts @@ -0,0 +1,60 @@ +import { openSnippetPicker } from '@/components/snippet/openSnippetPicker'; +import SaveSnippetBubbleItem from '@/components/snippet/SaveSnippetBubbleItem.vue'; +import { + Extension, + TEXT_BUBBLE_MENU_KEY, + ToolboxItem, + type Editor, + type ExtensionOptions, + type Range, +} from '@halo-dev/richtext-editor'; +import { markRaw } from 'vue'; +import MingcuteCopy2Line from '~icons/mingcute/copy-2-line'; + +export const ContentSnippetExtension = Extension.create({ + name: 'contentSnippet', + + addOptions() { + return { + ...this.parent?.(), + getCommandMenuItems() { + return { + priority: 75, + icon: markRaw(MingcuteCopy2Line), + title: '内容片段', + keywords: ['snippet', 'pianduan', 'neirongpianduan', 'fragment'], + command: ({ editor, range }: { editor: Editor; range: Range }) => { + void openSnippetPicker(editor, range); + }, + }; + }, + getBubbleMenu() { + return { + extendsKey: TEXT_BUBBLE_MENU_KEY, + items: [ + { + key: 'save-content-snippet', + priority: 150, + component: markRaw(SaveSnippetBubbleItem), + }, + ], + }; + }, + getToolboxItems({ editor }: { editor: Editor }) { + return { + priority: 45, + component: markRaw(ToolboxItem), + props: { + editor, + icon: markRaw(MingcuteCopy2Line), + title: '内容片段', + description: '插入可复用的内容片段', + action: () => { + void openSnippetPicker(editor); + }, + }, + }; + }, + }; + }, +}); diff --git a/ui/src/index.ts b/ui/src/index.ts index 0a9101d..28dd0c1 100644 --- a/ui/src/index.ts +++ b/ui/src/index.ts @@ -2,7 +2,9 @@ import { consoleApiClient, type ListedPost } from '@halo-dev/api-client'; import { Dialog, VDropdownDivider, VDropdownItem, VLoading } from '@halo-dev/components'; import { definePlugin } from '@halo-dev/ui-shared'; import { defineAsyncComponent, h, markRaw, type Ref } from 'vue'; +import MingcuteCopy2Line from '~icons/mingcute/copy-2-line'; import MingcuteFileImportLine from '~icons/mingcute/file-import-line'; +import { ContentSnippetExtension } from './editor/contentSnippetExtension'; const POST_EDITOR_PATH = '/console/posts/editor'; @@ -28,8 +30,54 @@ export default definePlugin({ }, }, }, + { + parentName: 'ToolsRoot', + route: { + path: 'content-snippets', + name: 'ContentSnippets', + component: () => import('./views/snippets/ContentSnippetList.vue'), + meta: { + title: '内容片段', + description: '管理可复用的内容片段', + searchable: true, + permissions: ['*'], + menu: { + name: '内容片段', + icon: markRaw(MingcuteCopy2Line), + priority: 1, + }, + }, + }, + }, + { + parentName: 'ToolsRoot', + route: { + path: 'content-snippets/create', + name: 'ContentSnippetCreate', + component: () => import('./views/snippets/ContentSnippetEditor.vue'), + meta: { + title: '新建内容片段', + permissions: ['*'], + }, + }, + }, + { + parentName: 'ToolsRoot', + route: { + path: 'content-snippets/:name/edit', + name: 'ContentSnippetEdit', + component: () => import('./views/snippets/ContentSnippetEditor.vue'), + meta: { + title: '编辑内容片段', + permissions: ['*'], + }, + }, + }, ], extensionPoints: { + 'default:editor:extension:create': () => { + return [ContentSnippetExtension]; + }, 'editor:create': async () => { const urlParams = new URLSearchParams(window.location.search); const name = urlParams.get('name'); diff --git a/ui/src/utils/snippet.ts b/ui/src/utils/snippet.ts new file mode 100644 index 0000000..a7a82df --- /dev/null +++ b/ui/src/utils/snippet.ts @@ -0,0 +1,11 @@ +export function getSnippetTextPreview(html: string, maxLength = 120) { + const element = document.createElement('div'); + element.innerHTML = html; + const text = (element.textContent || '').replace(/\s+/g, ' ').trim(); + + if (text.length <= maxLength) { + return text; + } + + return `${text.slice(0, maxLength)}…`; +} diff --git a/ui/src/views/snippets/ContentSnippetEditor.vue b/ui/src/views/snippets/ContentSnippetEditor.vue new file mode 100644 index 0000000..fe570da --- /dev/null +++ b/ui/src/views/snippets/ContentSnippetEditor.vue @@ -0,0 +1,272 @@ + + + diff --git a/ui/src/views/snippets/ContentSnippetList.vue b/ui/src/views/snippets/ContentSnippetList.vue new file mode 100644 index 0000000..42dc447 --- /dev/null +++ b/ui/src/views/snippets/ContentSnippetList.vue @@ -0,0 +1,222 @@ + + + From e5f8f830fa73c6b70313d97b1dd71abb8a1bc6d4 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Tue, 27 Oct 2026 13:45:39 +0800 Subject: [PATCH 2/8] Improve snippet management in editor picker --- .../components/snippet/SnippetEditorModal.vue | 243 ++++++++++++++++++ .../components/snippet/SnippetPickerModal.vue | 194 +++++++++++--- .../components/snippet/openSnippetPicker.ts | 32 +-- 3 files changed, 419 insertions(+), 50 deletions(-) create mode 100644 ui/src/components/snippet/SnippetEditorModal.vue diff --git a/ui/src/components/snippet/SnippetEditorModal.vue b/ui/src/components/snippet/SnippetEditorModal.vue new file mode 100644 index 0000000..0dee204 --- /dev/null +++ b/ui/src/components/snippet/SnippetEditorModal.vue @@ -0,0 +1,243 @@ + + + diff --git a/ui/src/components/snippet/SnippetPickerModal.vue b/ui/src/components/snippet/SnippetPickerModal.vue index 95fc30f..1255889 100644 --- a/ui/src/components/snippet/SnippetPickerModal.vue +++ b/ui/src/components/snippet/SnippetPickerModal.vue @@ -2,10 +2,23 @@ import type { ContentSnippet } from '@/api'; import { contentSnippetApiClient } from '@/api'; import { getSnippetTextPreview } from '@/utils/snippet'; -import { IconArrowRight, IconSearch, Toast, VEmpty, VLoading, VModal } from '@halo-dev/components'; +import { + Dialog, + IconAddCircle, + IconArrowRight, + IconSearch, + Toast, + VButton, + VEmpty, + VLoading, + VModal, +} from '@halo-dev/components'; import type { Editor, Range } from '@halo-dev/richtext-editor'; -import { computed, nextTick, onMounted, ref, type PropType } from 'vue'; +import { computed, nextTick, onMounted, ref, shallowRef, type PropType } from 'vue'; import MingcuteCopy2Line from '~icons/mingcute/copy-2-line'; +import MingcuteDelete2Line from '~icons/mingcute/delete-2-line'; +import MingcuteEdit2Line from '~icons/mingcute/edit-2-line'; +import SnippetEditorModal from './SnippetEditorModal.vue'; const props = defineProps({ editor: { @@ -28,6 +41,8 @@ const loading = ref(true); const snippets = ref([]); const keyword = ref(''); const searchInputRef = ref(); +const snippetEditorVisible = shallowRef(false); +const activeSnippet = shallowRef(); const filteredSnippets = computed(() => { const value = keyword.value.trim().toLowerCase(); @@ -59,6 +74,65 @@ async function fetchSnippets() { } } +function handleCreate() { + activeSnippet.value = undefined; + snippetEditorVisible.value = true; +} + +function handleEdit(snippet: ContentSnippet) { + activeSnippet.value = snippet; + snippetEditorVisible.value = true; +} + +function closeSnippetEditor() { + snippetEditorVisible.value = false; + activeSnippet.value = undefined; + nextTick(() => searchInputRef.value?.focus()); +} + +function handleSaved(saved: ContentSnippet) { + const isNew = !activeSnippet.value; + const exists = snippets.value.some((item) => item.metadata.name === saved.metadata.name); + + if (exists) { + snippets.value = snippets.value.map((item) => + item.metadata.name === saved.metadata.name ? saved : item + ); + } else { + snippets.value = [saved, ...snippets.value]; + } + + if (isNew) { + keyword.value = ''; + } + + closeSnippetEditor(); +} + +function handleDelete(snippet: ContentSnippet) { + Dialog.warning({ + title: '删除内容片段', + description: `确定要删除「${snippet.spec.displayName}」吗?删除后无法恢复,已插入文章中的内容不会受到影响。`, + confirmType: 'danger', + confirmText: '删除', + cancelText: '取消', + onConfirm: async () => { + try { + await contentSnippetApiClient.contentSnippet.deleteContentSnippet({ + name: snippet.metadata.name, + }); + Toast.success('删除成功'); + snippets.value = snippets.value.filter( + (item) => item.metadata.name !== snippet.metadata.name + ); + } catch (error) { + console.error('Failed to delete content snippet', error); + Toast.error('删除内容片段失败'); + } + }, + }); +} + function handleSelect(snippet: ContentSnippet) { const chain = props.editor.chain().focus(); @@ -92,18 +166,26 @@ onMounted(() => { @close="emit('close')" >
-
- - +
+
+ + +
+ + + 新建片段 +
@@ -120,34 +202,71 @@ onMounted(() => { + :message="keyword ? '试试其他关键词,或清除当前搜索' : '新建后即可插入到当前文章'" + > + +
- +
@@ -163,4 +282,11 @@ onMounted(() => {
+ + diff --git a/ui/src/components/snippet/openSnippetPicker.ts b/ui/src/components/snippet/openSnippetPicker.ts index 80d3c94..7ee109e 100644 --- a/ui/src/components/snippet/openSnippetPicker.ts +++ b/ui/src/components/snippet/openSnippetPicker.ts @@ -1,15 +1,15 @@ -import type { Editor, Range } from '@halo-dev/richtext-editor'; -import { createApp, h, type App } from 'vue'; +import { VueEditor, type Editor, type Range } from '@halo-dev/richtext-editor'; +import { h, render } from 'vue'; -let pickerApp: App | undefined; let pickerContainer: HTMLDivElement | undefined; let requestId = 0; export function closeSnippetPicker() { - pickerApp?.unmount(); - pickerContainer?.remove(); - pickerApp = undefined; - pickerContainer = undefined; + if (pickerContainer) { + render(null, pickerContainer); + pickerContainer.remove(); + pickerContainer = undefined; + } } export async function openSnippetPicker(editor: Editor, range?: Range) { @@ -27,18 +27,18 @@ export async function openSnippetPicker(editor: Editor, range?: Range) { const container = document.createElement('div'); document.body.appendChild(container); - const app = createApp({ - render: () => - h(SnippetPickerModal, { - editor, - range, - onClose: closeSnippetPicker, - }), + const vnode = h(SnippetPickerModal, { + editor, + range, + onClose: closeSnippetPicker, }); - pickerApp = app; + if (editor instanceof VueEditor) { + vnode.appContext = editor.appContext; + } + pickerContainer = container; - app.mount(container); + render(vnode, container); } catch (error) { console.error('Failed to open content snippet picker', error); } From 55b8e7a4aa6154f5fb5f0f5f1f3c26d163311e19 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Tue, 27 Oct 2026 17:12:01 +0800 Subject: [PATCH 3/8] Enhance snippet insertion in editor --- ui/package.json | 1 + ui/pnpm-lock.yaml | 10 +- .../snippet/SaveSnippetBubbleItem.vue | 5 +- .../components/snippet/SaveSnippetModal.vue | 165 +++++++++++++++++- .../components/snippet/SnippetPickerModal.vue | 38 ++-- .../components/snippet/openSnippetPicker.ts | 3 +- ui/src/editor/contentSnippetExtension.ts | 48 ++++- ui/src/utils/snippet.ts | 24 +++ ui/src/utils/snippetCommand.ts | 83 +++++++++ ui/src/utils/snippetSearch.ts | 55 ++++++ 10 files changed, 405 insertions(+), 27 deletions(-) create mode 100644 ui/src/utils/snippetCommand.ts create mode 100644 ui/src/utils/snippetSearch.ts diff --git a/ui/package.json b/ui/package.json index cd4009a..863fb5e 100644 --- a/ui/package.json +++ b/ui/package.json @@ -36,6 +36,7 @@ "mammoth": "^1.12.0", "markdown-it": "^14.1.1", "markdown-it-anchor": "^9.2.0", + "pinyin-pro": "^3.29.5", "turndown": "^7.2.4", "vue": "^3.5.41", "vue-reactive-queue": "^0.0.1", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index d084ed8..b4fbd24 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: markdown-it-anchor: specifier: ^9.2.0 version: 9.2.0(@types/markdown-it@14.1.2)(markdown-it@14.1.1) + pinyin-pro: + specifier: ^3.29.5 + version: 3.29.5 turndown: specifier: ^7.2.4 version: 7.2.4 @@ -2484,6 +2487,9 @@ packages: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} + pinyin-pro@3.29.5: + resolution: {integrity: sha512-Fk5YoRmtdHqJWqAuzYVG/NzvzeCbaG+ZEwbY6Nbps3QAIrvQQEtcm49frcyCM8i2b5najnzPDtYqrHRYTTiuwQ==} + pkg-dir@5.0.0: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} @@ -3494,7 +3500,7 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 optional: true '@jridgewell/sourcemap-codec@1.5.5': {} @@ -5766,6 +5772,8 @@ snapshots: picomatch@4.0.7: {} + pinyin-pro@3.29.5: {} + pkg-dir@5.0.0: dependencies: find-up: 5.0.0 diff --git a/ui/src/components/snippet/SaveSnippetBubbleItem.vue b/ui/src/components/snippet/SaveSnippetBubbleItem.vue index b6d4420..dcee86c 100644 --- a/ui/src/components/snippet/SaveSnippetBubbleItem.vue +++ b/ui/src/components/snippet/SaveSnippetBubbleItem.vue @@ -5,9 +5,10 @@ import { getHTMLFromFragment, type BubbleItemComponentProps, } from '@halo-dev/richtext-editor'; -import { shallowRef } from 'vue'; +import { defineAsyncComponent, shallowRef } from 'vue'; import MingcuteSave2Line from '~icons/mingcute/save-2-line'; -import SaveSnippetModal from './SaveSnippetModal.vue'; + +const SaveSnippetModal = defineAsyncComponent(() => import('./SaveSnippetModal.vue')); const { editor } = defineProps(); diff --git a/ui/src/components/snippet/SaveSnippetModal.vue b/ui/src/components/snippet/SaveSnippetModal.vue index 693e022..2e412b3 100644 --- a/ui/src/components/snippet/SaveSnippetModal.vue +++ b/ui/src/components/snippet/SaveSnippetModal.vue @@ -1,9 +1,15 @@