@vigilkids/section-renderer-vue 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +88 -0
- package/dist/assets/images/article/arrow.svg +3 -0
- package/dist/assets/images/article/hot.svg +3 -0
- package/dist/assets/images/article/notice-info-icon.svg +5 -0
- package/dist/assets/images/article/notice-info.svg +3 -0
- package/dist/assets/images/article/notice-warning-icon.svg +5 -0
- package/dist/assets/images/article/notice-warning.svg +10 -0
- package/dist/assets/images/article/question.svg +10 -0
- package/dist/composables/useInlineEdit.d.ts +30 -0
- package/dist/composables/useInlineEdit.mjs +94 -0
- package/dist/composables/useLazyRender.d.ts +18 -0
- package/dist/composables/useLazyRender.mjs +33 -0
- package/dist/composables/useRegistry.d.ts +38 -0
- package/dist/composables/useRegistry.mjs +60 -0
- package/dist/composables/useSectionSEO.d.ts +26 -0
- package/dist/composables/useSectionSEO.mjs +122 -0
- package/dist/composables/useSectionStyle.d.ts +23 -0
- package/dist/composables/useSectionStyle.mjs +111 -0
- package/dist/editor.d.ts +4 -0
- package/dist/editor.mjs +9 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.mjs +14 -0
- package/dist/plugin.d.ts +6 -0
- package/dist/plugin.mjs +14 -0
- package/dist/preview/createPreviewApp.d.ts +20 -0
- package/dist/preview/createPreviewApp.mjs +161 -0
- package/dist/renderer/FallbackSection.d.vue.ts +8 -0
- package/dist/renderer/FallbackSection.vue +17 -0
- package/dist/renderer/FallbackSection.vue.d.ts +8 -0
- package/dist/renderer/LazySection.d.vue.ts +60 -0
- package/dist/renderer/LazySection.vue +115 -0
- package/dist/renderer/LazySection.vue.d.ts +60 -0
- package/dist/renderer/SectionErrorBoundary.d.vue.ts +16 -0
- package/dist/renderer/SectionErrorBoundary.vue +38 -0
- package/dist/renderer/SectionErrorBoundary.vue.d.ts +16 -0
- package/dist/renderer/SectionRenderer.d.vue.ts +29 -0
- package/dist/renderer/SectionRenderer.vue +99 -0
- package/dist/renderer/SectionRenderer.vue.d.ts +29 -0
- package/dist/renderer/SectionWrapper.d.vue.ts +24 -0
- package/dist/renderer/SectionWrapper.vue +52 -0
- package/dist/renderer/SectionWrapper.vue.d.ts +24 -0
- package/dist/sections/RichTextSection.d.vue.ts +9 -0
- package/dist/sections/RichTextSection.vue +135 -0
- package/dist/sections/RichTextSection.vue.d.ts +9 -0
- package/dist/sections/article/index.d.ts +2 -0
- package/dist/sections/article/index.mjs +174 -0
- package/dist/sections/article/prosemirror.d.ts +2 -0
- package/dist/sections/article/prosemirror.mjs +65 -0
- package/dist/sections/article/shared/ArticleCustomHtml.d.vue.ts +9 -0
- package/dist/sections/article/shared/ArticleCustomHtml.vue +32 -0
- package/dist/sections/article/shared/ArticleCustomHtml.vue.d.ts +9 -0
- package/dist/sections/article/shared/ArticleImage.d.vue.ts +21 -0
- package/dist/sections/article/shared/ArticleImage.vue +53 -0
- package/dist/sections/article/shared/ArticleImage.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleBulletList.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleBulletList.vue +48 -0
- package/dist/sections/article/vigilkids/ArticleBulletList.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleCta.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleCta.vue +126 -0
- package/dist/sections/article/vigilkids/ArticleCta.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleFaq.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleFaq.vue +62 -0
- package/dist/sections/article/vigilkids/ArticleFaq.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleFaqItem.d.vue.ts +5 -0
- package/dist/sections/article/vigilkids/ArticleFaqItem.vue +24 -0
- package/dist/sections/article/vigilkids/ArticleFaqItem.vue.d.ts +5 -0
- package/dist/sections/article/vigilkids/ArticleFeature.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleFeature.vue +77 -0
- package/dist/sections/article/vigilkids/ArticleFeature.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleHeading.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleHeading.vue +53 -0
- package/dist/sections/article/vigilkids/ArticleHeading.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleNotice.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleNotice.vue +81 -0
- package/dist/sections/article/vigilkids/ArticleNotice.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleProsCons.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleProsCons.vue +74 -0
- package/dist/sections/article/vigilkids/ArticleProsCons.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleQuestion.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleQuestion.vue +58 -0
- package/dist/sections/article/vigilkids/ArticleQuestion.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleQuote.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleQuote.vue +50 -0
- package/dist/sections/article/vigilkids/ArticleQuote.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleStepList.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleStepList.vue +49 -0
- package/dist/sections/article/vigilkids/ArticleStepList.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleSubheading.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleSubheading.vue +56 -0
- package/dist/sections/article/vigilkids/ArticleSubheading.vue.d.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleTable.d.vue.ts +9 -0
- package/dist/sections/article/vigilkids/ArticleTable.vue +75 -0
- package/dist/sections/article/vigilkids/ArticleTable.vue.d.ts +9 -0
- package/dist/sections/article/vigilkids/ArticleToc.d.vue.ts +21 -0
- package/dist/sections/article/vigilkids/ArticleToc.vue +102 -0
- package/dist/sections/article/vigilkids/ArticleToc.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleBulletList.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleBulletList.vue +48 -0
- package/dist/sections/article/visiva/ArticleBulletList.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleCta.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleCta.vue +148 -0
- package/dist/sections/article/visiva/ArticleCta.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleFaq.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleFaq.vue +76 -0
- package/dist/sections/article/visiva/ArticleFaq.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleFeature.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleFeature.vue +79 -0
- package/dist/sections/article/visiva/ArticleFeature.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleHeading.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleHeading.vue +61 -0
- package/dist/sections/article/visiva/ArticleHeading.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleNotice.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleNotice.vue +102 -0
- package/dist/sections/article/visiva/ArticleNotice.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleProsCons.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleProsCons.vue +98 -0
- package/dist/sections/article/visiva/ArticleProsCons.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleQuestion.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleQuestion.vue +80 -0
- package/dist/sections/article/visiva/ArticleQuestion.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleQuote.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleQuote.vue +50 -0
- package/dist/sections/article/visiva/ArticleQuote.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleStepList.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleStepList.vue +48 -0
- package/dist/sections/article/visiva/ArticleStepList.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleSubheading.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleSubheading.vue +91 -0
- package/dist/sections/article/visiva/ArticleSubheading.vue.d.ts +21 -0
- package/dist/sections/article/visiva/ArticleTable.d.vue.ts +9 -0
- package/dist/sections/article/visiva/ArticleTable.vue +140 -0
- package/dist/sections/article/visiva/ArticleTable.vue.d.ts +9 -0
- package/dist/sections/article/visiva/ArticleToc.d.vue.ts +21 -0
- package/dist/sections/article/visiva/ArticleToc.vue +116 -0
- package/dist/sections/article/visiva/ArticleToc.vue.d.ts +21 -0
- package/dist/shims-css.d.ts +4 -0
- package/dist/styles/products/vigilkids.css +1 -0
- package/dist/styles/products/visiva.css +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { BlockData } from '@vigilkids/section-core'
|
|
3
|
+
|
|
4
|
+
import { safeUrl } from '@vigilkids/section-core'
|
|
5
|
+
import { computed } from 'vue'
|
|
6
|
+
|
|
7
|
+
import { useInlineEdit } from '../../../composables/useInlineEdit'
|
|
8
|
+
|
|
9
|
+
const props = defineProps<{
|
|
10
|
+
blockOrder: string[]
|
|
11
|
+
blocks: Record<string, BlockData>
|
|
12
|
+
editorMode?: boolean
|
|
13
|
+
settings: Record<string, unknown>
|
|
14
|
+
}>()
|
|
15
|
+
|
|
16
|
+
const emit = defineEmits<{
|
|
17
|
+
(e: 'update:setting', key: string, value: unknown): void
|
|
18
|
+
(e: 'update:block-setting', blockId: string, key: string, value: unknown): void
|
|
19
|
+
(e: 'inline-edit-start', key: string): void
|
|
20
|
+
(e: 'inline-edit-end'): void
|
|
21
|
+
(e: 'undo-redo', action: 'redo' | 'undo'): void
|
|
22
|
+
}>()
|
|
23
|
+
|
|
24
|
+
const s = computed(() => props.settings)
|
|
25
|
+
const variant = computed(() => String(s.value.variant || 'default'))
|
|
26
|
+
|
|
27
|
+
const { editableAttrs, blockEditableAttrs } = useInlineEdit({
|
|
28
|
+
editorMode: () => !!props.editorMode,
|
|
29
|
+
onSettingUpdate: (key, value) => emit('update:setting', key, value),
|
|
30
|
+
onBlockSettingUpdate: (blockId, key, value) => emit('update:block-setting', blockId, key, value),
|
|
31
|
+
onEditStart: (key) => emit('inline-edit-start', key),
|
|
32
|
+
onEditEnd: () => emit('inline-edit-end'),
|
|
33
|
+
onUndoRedo: (action) => emit('undo-redo', action),
|
|
34
|
+
})
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<template>
|
|
38
|
+
<!-- light / dark 变体:图片+特性列表+CTA (Visiva) -->
|
|
39
|
+
<div
|
|
40
|
+
v-if="variant === 'light' || variant === 'dark'"
|
|
41
|
+
:class="['feature-card', { 'feature-card--dark': variant === 'dark' }]"
|
|
42
|
+
>
|
|
43
|
+
<div class="feature-card__text">
|
|
44
|
+
<h2 v-if="s.title" class="feature-card__title" v-bind="editableAttrs('title')">{{ s.title }}</h2>
|
|
45
|
+
<ul class="feature-card__list">
|
|
46
|
+
<template v-for="blockId in blockOrder" :key="blockId">
|
|
47
|
+
<li v-if="blocks[blockId]" v-bind="blockEditableAttrs(blockId, 'text')">{{ blocks[blockId]!.settings.text }}</li>
|
|
48
|
+
</template>
|
|
49
|
+
</ul>
|
|
50
|
+
<a
|
|
51
|
+
v-if="s.button_text"
|
|
52
|
+
:href="safeUrl(String(s.button_url || ''))"
|
|
53
|
+
class="feature-card__btn"
|
|
54
|
+
v-bind="editableAttrs('button_text')"
|
|
55
|
+
>
|
|
56
|
+
{{ s.button_text }}
|
|
57
|
+
</a>
|
|
58
|
+
</div>
|
|
59
|
+
<div v-if="s.image_src" class="feature-card__image">
|
|
60
|
+
<img :src="String(s.image_src)" alt="" loading="lazy" />
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<!-- default 变体:原有灰色特性框 (VigilKids,完全不动) -->
|
|
65
|
+
<div v-else class="article-feature">
|
|
66
|
+
<p v-if="s.title" class="article-feature-title" v-bind="editableAttrs('title')">{{ s.title }}</p>
|
|
67
|
+
<ul class="article-feature-list">
|
|
68
|
+
<template v-for="blockId in blockOrder" :key="blockId">
|
|
69
|
+
<li v-if="blocks[blockId]" v-bind="blockEditableAttrs(blockId, 'text')">{{ blocks[blockId]!.settings.text }}</li>
|
|
70
|
+
</template>
|
|
71
|
+
</ul>
|
|
72
|
+
</div>
|
|
73
|
+
</template>
|
|
74
|
+
|
|
75
|
+
<style scoped>
|
|
76
|
+
.article-feature{background:var(--article-bg-gray,#f3f5f7);border-radius:10px;color:var(--article-text,#3a4259);margin-top:30px;padding:30px 60px}.article-feature-title{font-size:20px;font-weight:700;line-height:23px;margin-bottom:20px;margin-top:0}.article-feature-list{line-height:32px;list-style-type:disc;padding-left:20px}@media (max-width:768px){.article-feature{padding:20px 16px}}.feature-card{align-items:center;background:var(--article-bg-light,#f3f4f6);border-radius:10px;display:flex;flex-direction:column;gap:20px;margin-top:40px;padding:28px 12px}.feature-card--dark{background:var(--article-bg-dark,#1f2937);color:#fff}.feature-card__text{max-width:426px}.feature-card__title{font-size:18px;font-weight:700;margin:0 0 16px}.feature-card__list{font-size:14px;font-weight:300;line-height:1.8;list-style-type:disc;margin:0 0 20px;padding-left:16px}.feature-card--dark .feature-card__list{color:#d1d5db}.feature-card:not(.feature-card--dark) .feature-card__list{color:var(--article-text-muted,#6b7280)}.feature-card__btn{align-items:center;background:linear-gradient(to right,var(--article-gradient-start,#24c790),var(--article-gradient-end,#1ba97a));border-radius:40px;color:#000;display:inline-flex;font-size:16px;font-weight:700;height:60px;justify-content:center;min-width:260px;text-decoration:none;transition:opacity .2s}.feature-card__btn:hover{opacity:.9}.feature-card__image img{border-radius:10px;height:auto;max-width:411px;-o-object-fit:cover;object-fit:cover;width:100%}@media (min-width:769px){.feature-card{border-radius:20px;flex-direction:row;justify-content:space-between;padding:40px}.feature-card__title{font-size:20px}.feature-card__list{margin-bottom:28px}.feature-card__image img{border-radius:20px}}
|
|
77
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { BlockData } from '@vigilkids/section-core'
|
|
3
|
+
|
|
4
|
+
import { computed } from 'vue'
|
|
5
|
+
|
|
6
|
+
import { useInlineEdit } from '../../../composables/useInlineEdit'
|
|
7
|
+
|
|
8
|
+
const props = defineProps<{
|
|
9
|
+
blockOrder: string[]
|
|
10
|
+
blocks: Record<string, BlockData>
|
|
11
|
+
editorMode?: boolean
|
|
12
|
+
settings: Record<string, unknown>
|
|
13
|
+
}>()
|
|
14
|
+
|
|
15
|
+
const emit = defineEmits<{
|
|
16
|
+
(e: 'update:setting', key: string, value: unknown): void
|
|
17
|
+
(e: 'update:block-setting', blockId: string, key: string, value: unknown): void
|
|
18
|
+
(e: 'inline-edit-start', key: string): void
|
|
19
|
+
(e: 'inline-edit-end'): void
|
|
20
|
+
(e: 'undo-redo', action: 'redo' | 'undo'): void
|
|
21
|
+
}>()
|
|
22
|
+
|
|
23
|
+
const s = computed(() => props.settings)
|
|
24
|
+
const variant = computed(() => (s.value.variant as string) || 'default')
|
|
25
|
+
|
|
26
|
+
const { editableAttrs } = useInlineEdit({
|
|
27
|
+
editorMode: () => !!props.editorMode,
|
|
28
|
+
onSettingUpdate: (key, value) => emit('update:setting', key, value),
|
|
29
|
+
onBlockSettingUpdate: (blockId, key, value) => emit('update:block-setting', blockId, key, value),
|
|
30
|
+
onEditStart: (key) => emit('inline-edit-start', key),
|
|
31
|
+
onEditEnd: () => emit('inline-edit-end'),
|
|
32
|
+
onUndoRedo: (action) => emit('undo-redo', action),
|
|
33
|
+
})
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<template>
|
|
37
|
+
<h2
|
|
38
|
+
:id="String(s.anchor || '')"
|
|
39
|
+
:class="[
|
|
40
|
+
'article-heading',
|
|
41
|
+
{
|
|
42
|
+
'article-heading--plain': variant === 'plain',
|
|
43
|
+
'article-heading--accent': variant === 'accent',
|
|
44
|
+
},
|
|
45
|
+
]"
|
|
46
|
+
>
|
|
47
|
+
<span v-bind="editableAttrs('title')">{{ s.title }}</span>
|
|
48
|
+
</h2>
|
|
49
|
+
</template>
|
|
50
|
+
|
|
51
|
+
<style scoped>
|
|
52
|
+
.article-heading{background:var(--article-bg-light,#f5f9fc);font-size:28px;font-weight:var(--article-heading-weight,700);line-height:36px;margin-bottom:30px;margin-top:var(--article-heading-mt,30px);padding:14px 30px;position:relative}.article-heading:not(.article-heading--plain):not(.article-heading--accent):before{background:var(--article-primary,#24c790);content:"";height:100%;left:0;position:absolute;top:0;width:10px}.article-heading--plain{font-size:28px;line-height:36px;padding:0}.article-heading--accent,.article-heading--plain{background:transparent;color:var(--article-text,#3a4259)}.article-heading--accent{font-size:30px;font-weight:var(--article-heading-weight,700);line-height:1.2;padding:0 0 0 16px}.article-heading--accent:before{background:var(--article-primary,#24c790);border-radius:0;content:"";height:25px;left:0;position:absolute;top:4px;width:5px}.article-heading[id]{scroll-margin-top:80px}@media (max-width:768px){.article-heading{font-size:20px;line-height:23px;margin-bottom:20px;margin-top:20px;padding:16px}.article-heading:not(.article-heading--plain):not(.article-heading--accent):before{height:100%;width:4px}.article-heading--plain{font-size:20px;line-height:23px}.article-heading--accent{font-size:22px;line-height:1.2;padding-left:10px}.article-heading--accent:before{height:18px;width:4px}}
|
|
53
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { BlockData } from '@vigilkids/section-core'
|
|
3
|
+
|
|
4
|
+
import { computed } from 'vue'
|
|
5
|
+
|
|
6
|
+
import { useInlineEdit } from '../../../composables/useInlineEdit'
|
|
7
|
+
|
|
8
|
+
const props = defineProps<{
|
|
9
|
+
blockOrder: string[]
|
|
10
|
+
blocks: Record<string, BlockData>
|
|
11
|
+
editorMode?: boolean
|
|
12
|
+
settings: Record<string, unknown>
|
|
13
|
+
}>()
|
|
14
|
+
|
|
15
|
+
const emit = defineEmits<{
|
|
16
|
+
(e: 'update:setting', key: string, value: unknown): void
|
|
17
|
+
(e: 'update:block-setting', blockId: string, key: string, value: unknown): void
|
|
18
|
+
(e: 'inline-edit-start', key: string): void
|
|
19
|
+
(e: 'inline-edit-end'): void
|
|
20
|
+
(e: 'undo-redo', action: 'redo' | 'undo'): void
|
|
21
|
+
}>()
|
|
22
|
+
|
|
23
|
+
const s = computed(() => props.settings)
|
|
24
|
+
const variant = computed(() => String(s.value.variant || 'default'))
|
|
25
|
+
const isWarning = computed(() => variant.value === 'warning')
|
|
26
|
+
const isRow = computed(() => String(s.value.layout) === 'row')
|
|
27
|
+
|
|
28
|
+
const { editableAttrs, blockEditableAttrs } = useInlineEdit({
|
|
29
|
+
editorMode: () => !!props.editorMode,
|
|
30
|
+
onSettingUpdate: (key, value) => emit('update:setting', key, value),
|
|
31
|
+
onBlockSettingUpdate: (blockId, key, value) => emit('update:block-setting', blockId, key, value),
|
|
32
|
+
onEditStart: (key) => emit('inline-edit-start', key),
|
|
33
|
+
onEditEnd: () => emit('inline-edit-end'),
|
|
34
|
+
onUndoRedo: (action) => emit('undo-redo', action),
|
|
35
|
+
})
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<template>
|
|
39
|
+
<!-- tips / note 变体:角标样式 (Visiva) -->
|
|
40
|
+
<div v-if="variant === 'tips' || variant === 'note'" class="notice-badge">
|
|
41
|
+
<div class="notice-badge__tag">
|
|
42
|
+
<span class="notice-badge__label" v-bind="editableAttrs('title')">{{ s.title || 'Tips' }}</span>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="notice-badge__content">
|
|
45
|
+
<template v-for="blockId in blockOrder" :key="blockId">
|
|
46
|
+
<p v-if="blocks[blockId]" v-bind="blockEditableAttrs(blockId, 'text')">{{ blocks[blockId]!.settings.text }}</p>
|
|
47
|
+
</template>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<!-- info 变体:圆角卡片+图标标题 (Visiva) -->
|
|
52
|
+
<div v-else-if="variant === 'info'" class="notice-card">
|
|
53
|
+
<div v-if="s.title" class="notice-card__header">
|
|
54
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg>
|
|
55
|
+
<h3 class="notice-card__title" v-bind="editableAttrs('title')">{{ s.title }}</h3>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="notice-card__content">
|
|
58
|
+
<template v-for="blockId in blockOrder" :key="blockId">
|
|
59
|
+
<p v-if="blocks[blockId]" v-bind="blockEditableAttrs(blockId, 'text')">{{ blocks[blockId]!.settings.text }}</p>
|
|
60
|
+
</template>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<!-- default / warning 变体:虚线框样式 (VigilKids 原有,完全不动) -->
|
|
65
|
+
<div
|
|
66
|
+
v-else
|
|
67
|
+
class="notice-info"
|
|
68
|
+
:class="{
|
|
69
|
+
warning: isWarning,
|
|
70
|
+
'notice-info--row-child': isRow,
|
|
71
|
+
}"
|
|
72
|
+
>
|
|
73
|
+
<template v-for="blockId in blockOrder" :key="blockId">
|
|
74
|
+
<p v-if="blocks[blockId]" v-bind="blockEditableAttrs(blockId, 'text')">{{ blocks[blockId]!.settings.text }}</p>
|
|
75
|
+
</template>
|
|
76
|
+
</div>
|
|
77
|
+
</template>
|
|
78
|
+
|
|
79
|
+
<style scoped>
|
|
80
|
+
.notice-info{background:color-mix(in srgb,var(--article-primary-hover,#1ba97a) 10%,transparent);border:2px dashed var(--article-primary-hover,#1ba97a);border-radius:10px;font-size:18px;line-height:21px;margin-bottom:20px;margin-top:30px;padding:60px 40px 40px 108px;position:relative}.notice-info:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='142' height='40' fill='none' viewBox='0 0 142 40'%3E%3Cpath fill='%2324c790' d='M0 0h142l-9.079 27.62a18 18 0 0 1-17.1 12.38H26.179a18 18 0 0 1-17.1-12.38z'/%3E%3Cpath fill='%23fff' d='M51.153 30.957h-.033c-1.017-.011-2.037-.011-3.057-.011h-1.556c-1.039 0-2.078 0-3.12-.014a4.8 4.8 0 0 1-1.681-.355c-.91-.356-1.43-1.149-1.428-2.18l.003-3.866c0-2.141 0-4.285.02-6.426.002-.582.377-1.129.697-1.416 1.238-1.132 2.584-2.543 3.147-4.446.156-.53.216-1.116.279-1.734.126-1.23.924-2.031 1.99-2.031q.63.002 1.247.369c.823.495 1.373 1.271 1.676 2.379.487 1.758.238 3.464-.035 4.927v.005a.555.555 0 0 0 .544.66h3.555c.612 0 1.49.076 2.031.732.394.479.506 1.124.34 1.977-.51 2.622-1.133 5.267-1.729 7.73-.186.769-.495 1.48-.793 2.169l-.128.295c-.34.798-1.04 1.236-1.969 1.236M35.91 30.7h-.325a2.145 2.145 0 0 1-2.139-2.139v-9.529c0-1.176.963-2.138 2.139-2.138h.325c1.176 0 2.138.962 2.138 2.138v9.527a2.14 2.14 0 0 1-2.138 2.14M76.807 21.932h-3.623v-2.285h3.623q.84 0 1.367-.274.527-.284.771-.781.245-.498.245-1.123 0-.634-.245-1.182a1.97 1.97 0 0 0-.771-.879q-.528-.332-1.367-.332h-2.608V27h-2.93V12.781h5.538q1.67 0 2.861.606 1.2.595 1.836 1.65.635 1.054.635 2.412 0 1.377-.635 2.383-.634 1.005-1.836 1.553-1.191.547-2.861.547m9.99-3.194V27h-2.813V16.434h2.647zm3.184-2.373-.05 2.608a7 7 0 0 0-.497-.05 5 5 0 0 0-.518-.028 3.1 3.1 0 0 0-1.035.156 1.85 1.85 0 0 0-.723.44 1.9 1.9 0 0 0-.43.712q-.136.42-.156.957l-.566-.176q0-1.025.205-1.884.205-.87.596-1.514.4-.645.976-.996a2.5 2.5 0 0 1 1.319-.352q.234 0 .478.04.244.028.4.087m.585 5.46v-.206q0-1.162.332-2.139a4.95 4.95 0 0 1 .967-1.709 4.3 4.3 0 0 1 1.563-1.123q.927-.41 2.129-.41 1.2 0 2.138.41.938.4 1.573 1.124a4.9 4.9 0 0 1 .976 1.709q.332.975.332 2.138v.205q0 1.152-.332 2.139a5 5 0 0 1-.976 1.709 4.3 4.3 0 0 1-1.563 1.123q-.927.4-2.129.4-1.2 0-2.138-.4a4.4 4.4 0 0 1-1.573-1.123 5.1 5.1 0 0 1-.967-1.71 6.7 6.7 0 0 1-.332-2.138m2.813-.206v.205q0 .664.117 1.24.117.577.371 1.016.264.43.684.674t1.025.244q.585 0 1.006-.244.42-.245.674-.674.255-.44.371-1.015.127-.577.127-1.24v-.206q0-.645-.127-1.21a3.2 3.2 0 0 0-.38-1.016q-.255-.45-.675-.704t-1.015-.253-1.016.253q-.41.255-.674.704a3.4 3.4 0 0 0-.37 1.015 6 6 0 0 0-.118 1.211m14.639 2.461a.9.9 0 0 0-.176-.547q-.175-.244-.654-.449-.469-.215-1.358-.39a10.6 10.6 0 0 1-1.494-.44 5.2 5.2 0 0 1-1.191-.654 2.8 2.8 0 0 1-.782-.899 2.5 2.5 0 0 1-.283-1.201q0-.665.283-1.25.294-.586.83-1.035a3.9 3.9 0 0 1 1.328-.713 5.6 5.6 0 0 1 1.778-.264q1.377 0 2.363.44.996.44 1.524 1.21.537.762.537 1.739h-2.813q0-.41-.176-.732a1.16 1.16 0 0 0-.527-.518q-.351-.195-.918-.195-.469 0-.81.166a1.25 1.25 0 0 0-.528.43 1.03 1.03 0 0 0-.176.585q0 .245.098.44.108.185.342.341t.605.294q.381.126.938.234a10.8 10.8 0 0 1 2.041.615q.898.372 1.426 1.016.527.635.527 1.67 0 .702-.313 1.289-.312.585-.898 1.025a4.6 4.6 0 0 1-1.406.674 6.6 6.6 0 0 1-1.826.234q-1.475 0-2.5-.527-1.016-.528-1.543-1.338-.518-.82-.518-1.68h2.666q.02.577.293.928.283.352.713.508.44.156.947.156.548 0 .908-.146.362-.157.547-.41a1 1 0 0 0 .196-.606'/%3E%3C/svg%3E") no-repeat 50%;background-size:cover;content:"";height:40px;left:40px;position:absolute;top:0;width:142px}.notice-info :deep(p){color:var(--article-text,#3a4259);margin-top:0;position:relative}.notice-info :deep(p:not(:last-child)){margin-bottom:16px}.notice-info :deep(p:before){background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' fill='none' viewBox='0 0 30 30'%3E%3Cpath fill='%2324c790' d='M14.947 1.897C7.722 1.897 1.844 7.775 1.844 15S7.72 28.103 14.947 28.103c7.225 0 13.103-5.878 13.103-13.103S22.172 1.897 14.946 1.897m6.323 10.942-7.528 7.609-.007.005q-.003.004-.006.008c-.06.058-.134.094-.204.133-.034.02-.063.05-.1.064a.95.95 0 0 1-.706-.002c-.038-.016-.068-.048-.104-.067-.07-.04-.142-.075-.202-.134l-.005-.007-.007-.006-3.702-3.805a.94.94 0 1 1 1.348-1.31l3.034 3.117 6.853-6.928a.94.94 0 1 1 1.336 1.322'/%3E%3C/svg%3E") no-repeat 50%;content:"";height:30px;left:-38px;position:absolute;top:-4.5px;width:30px}.notice-info.warning{background:color-mix(in srgb,var(--article-warning,#f1631c) 10%,transparent);border-color:var(--article-warning,#f1631c)}.notice-info.warning:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='142' height='40' fill='none' viewBox='0 0 142 40'%3E%3Cpath fill='%23f1631c' d='M0 0h142l-9.079 27.62a18 18 0 0 1-17.1 12.38H26.179a18 18 0 0 1-17.1-12.38z'/%3E%3Cpath fill='%23fff' d='M38.14 8.478h.033c1.017.01 2.037.01 3.057.01h1.556c1.039 0 2.078 0 3.12.014a4.8 4.8 0 0 1 1.681.356c.91.355 1.43 1.148 1.427 2.18l-.002 3.865c0 2.141 0 4.285-.02 6.426-.002.583-.377 1.13-.697 1.417-1.238 1.132-2.584 2.543-3.147 4.446-.156.53-.216 1.115-.279 1.733-.126 1.23-.924 2.032-1.99 2.032-.419 0-.837-.126-1.247-.37-.823-.494-1.373-1.27-1.676-2.378-.487-1.758-.238-3.465.035-4.927v-.006a.555.555 0 0 0-.544-.659h-3.555c-.612 0-1.49-.076-2.032-.733-.393-.478-.505-1.123-.338-1.977.508-2.622 1.132-5.266 1.728-7.73.185-.768.495-1.479.793-2.168l.128-.295c.34-.799 1.04-1.236 1.969-1.236m15.244.257h.325c1.176 0 2.139.962 2.139 2.138v9.53a2.145 2.145 0 0 1-2.139 2.138h-.325a2.145 2.145 0 0 1-2.138-2.139v-9.526a2.14 2.14 0 0 1 2.138-2.141M79.512 22.283h2.92q-.089 1.436-.791 2.549-.694 1.114-1.944 1.738-1.24.625-2.988.625-1.367 0-2.451-.468a5.2 5.2 0 0 1-1.856-1.368q-.762-.888-1.162-2.148t-.4-2.822v-.987q0-1.562.41-2.822.42-1.27 1.191-2.158a5.3 5.3 0 0 1 1.866-1.367q1.084-.48 2.421-.479 1.778 0 2.999.645 1.23.645 1.904 1.777.684 1.133.82 2.578h-2.93q-.048-.86-.341-1.455a1.94 1.94 0 0 0-.889-.908q-.585-.313-1.562-.313-.733 0-1.28.274-.546.273-.918.83-.371.557-.556 1.406-.177.84-.176 1.973v1.006q0 1.103.166 1.943.166.83.508 1.406.351.567.898.86.556.283 1.338.283.918 0 1.514-.293t.908-.87q.323-.575.38-1.435m4.219-.459v-.205q0-1.162.332-2.139a4.95 4.95 0 0 1 .966-1.709 4.3 4.3 0 0 1 1.563-1.123q.927-.41 2.129-.41 1.2 0 2.138.41.938.4 1.573 1.124.645.721.976 1.709.332.975.332 2.138v.205q0 1.152-.332 2.139a5 5 0 0 1-.976 1.709 4.3 4.3 0 0 1-1.563 1.123q-.927.4-2.129.4-1.2 0-2.138-.4a4.4 4.4 0 0 1-1.573-1.123 5.1 5.1 0 0 1-.966-1.71 6.7 6.7 0 0 1-.332-2.138m2.812-.205v.205q0 .664.117 1.24.117.577.371 1.016.264.43.684.674t1.025.244q.585 0 1.006-.244.42-.245.674-.674a3.4 3.4 0 0 0 .371-1.015q.127-.577.127-1.24v-.206q0-.645-.127-1.21a3.2 3.2 0 0 0-.38-1.016 1.9 1.9 0 0 0-.675-.704q-.42-.253-1.015-.253-.596 0-1.016.253-.41.255-.674.704-.254.44-.37 1.015a6 6 0 0 0-.118 1.211m11.68-2.93V27H95.41V16.434h2.637zm-.41 2.657h-.762q0-1.173.302-2.11.304-.947.85-1.611a3.65 3.65 0 0 1 1.299-1.025 3.9 3.9 0 0 1 1.699-.362q.742 0 1.358.215.615.214 1.054.684.45.468.684 1.24.244.771.244 1.885V27h-2.832v-6.748q0-.703-.195-1.094a1.1 1.1 0 0 0-.576-.547q-.372-.166-.918-.166-.567 0-.987.225-.41.225-.683.625a3 3 0 0 0-.4.918q-.138.527-.138 1.133m14.58 2.734a.9.9 0 0 0-.176-.547q-.175-.244-.655-.449-.468-.215-1.357-.39a10.6 10.6 0 0 1-1.494-.44 5.2 5.2 0 0 1-1.191-.654 2.85 2.85 0 0 1-.782-.899 2.5 2.5 0 0 1-.283-1.201q0-.665.283-1.25.294-.586.83-1.035a3.9 3.9 0 0 1 1.328-.713 5.6 5.6 0 0 1 1.778-.264q1.377 0 2.363.44.996.44 1.524 1.21.537.762.537 1.739h-2.813q0-.41-.176-.732a1.16 1.16 0 0 0-.527-.518q-.351-.195-.918-.195-.469 0-.81.166a1.25 1.25 0 0 0-.528.43 1.03 1.03 0 0 0-.176.585q0 .245.098.44.108.185.342.341t.605.294q.381.126.938.234a10.8 10.8 0 0 1 2.041.615q.898.372 1.426 1.016.527.635.527 1.67 0 .702-.313 1.289-.312.585-.898 1.025a4.6 4.6 0 0 1-1.406.674 6.6 6.6 0 0 1-1.826.234q-1.475 0-2.5-.527-1.016-.528-1.543-1.338-.518-.82-.518-1.68h2.666q.02.577.293.928.283.352.713.508.44.156.947.156.548 0 .908-.146.362-.157.547-.41a1 1 0 0 0 .196-.606'/%3E%3C/svg%3E") no-repeat 50%;background-size:cover}.notice-info.warning :deep(p:before){background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' fill='none' viewBox='0 0 30 30'%3E%3Cg clip-path='url(%23a)'%3E%3Cpath fill='%23f1631c' d='M15 1.875C7.751 1.875 1.875 7.751 1.875 15S7.751 28.125 15 28.125 28.125 22.249 28.125 15 22.249 1.875 15 1.875m6.299 17.931a1.06 1.06 0 0 1 0 1.493 1.06 1.06 0 0 1-1.492 0L15 16.49 10.195 21.3a1.06 1.06 0 0 1-1.494 0 1.06 1.06 0 0 1 0-1.492l4.805-4.804L8.7 10.195a1.058 1.058 0 0 1 .747-1.803c.28 0 .549.111.747.31L15 13.508l4.805-4.805a1.06 1.06 0 0 1 1.494-.003 1.06 1.06 0 0 1 0 1.494L16.49 15z'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='a'%3E%3Cpath fill='%23fff' d='M0 0h30v30H0z'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat 50%}@media (max-width:768px){.notice-info{line-height:19px;padding:44px 16px 30px 44px}.notice-info:before{background-size:cover!important;height:32px;left:16px;width:114px}.notice-info :deep(p:before){background-size:cover;height:24px;left:-30px;top:-2px;width:24px}}.notice-badge{background:var(--article-bg-light,#f3f4f6);border-radius:0 0 5px 5px;margin-top:40px;padding:36px 16px 20px;position:relative}.notice-badge__tag{align-items:center;background:var(--article-badge,#24c790);border-radius:5px 0 10px 0;display:flex;gap:4px;height:24px;left:0;padding:0 8px;position:absolute;top:0}.notice-badge__label{color:#fff;font-size:14px;font-weight:700}.notice-badge__content{color:var(--article-text-muted,#6b7280);font-size:14px;font-weight:300;line-height:1.6}.notice-badge__content p{margin:0 0 8px}.notice-badge__content p:last-child{margin-bottom:0}.notice-card{background:var(--article-bg-light,#f3f4f6);border-radius:10px;margin-top:40px;padding:20px 16px}.notice-card__header{align-items:center;display:flex;gap:12px;margin-bottom:12px}.notice-card__title{color:var(--article-text,#1f2937);font-size:16px;font-weight:600;margin:0}.notice-card__content{color:var(--article-text-muted,#6b7280);font-size:14px;font-weight:300;line-height:1.6}.notice-card__content p{margin:0 0 8px}.notice-card__content p:last-child{margin-bottom:0}@media (min-width:769px){.notice-badge{padding:36px 16px 20px}.notice-card{padding:24px}.notice-badge__content,.notice-card__content{font-size:16px}}
|
|
81
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { BlockData } from '@vigilkids/section-core'
|
|
3
|
+
|
|
4
|
+
import { computed } from 'vue'
|
|
5
|
+
|
|
6
|
+
import { useInlineEdit } from '../../../composables/useInlineEdit'
|
|
7
|
+
|
|
8
|
+
const props = defineProps<{
|
|
9
|
+
blockOrder: string[]
|
|
10
|
+
blocks: Record<string, BlockData>
|
|
11
|
+
editorMode?: boolean
|
|
12
|
+
settings: Record<string, unknown>
|
|
13
|
+
}>()
|
|
14
|
+
|
|
15
|
+
const emit = defineEmits<{
|
|
16
|
+
(e: 'update:setting', key: string, value: unknown): void
|
|
17
|
+
(e: 'update:block-setting', blockId: string, key: string, value: unknown): void
|
|
18
|
+
(e: 'inline-edit-start', key: string): void
|
|
19
|
+
(e: 'inline-edit-end'): void
|
|
20
|
+
(e: 'undo-redo', action: 'redo' | 'undo'): void
|
|
21
|
+
}>()
|
|
22
|
+
|
|
23
|
+
const s = computed(() => props.settings)
|
|
24
|
+
|
|
25
|
+
const pros = computed(() =>
|
|
26
|
+
props.blockOrder
|
|
27
|
+
.filter((id) => props.blocks[id]?.type === 'pro')
|
|
28
|
+
.map((id) => ({ id, block: props.blocks[id]! })),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
const cons = computed(() =>
|
|
32
|
+
props.blockOrder
|
|
33
|
+
.filter((id) => props.blocks[id]?.type === 'con')
|
|
34
|
+
.map((id) => ({ id, block: props.blocks[id]! })),
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
const isDashed = computed(() => String(s.value.variant) === 'dashed')
|
|
38
|
+
|
|
39
|
+
const { editableAttrs, blockEditableAttrs } = useInlineEdit({
|
|
40
|
+
editorMode: () => !!props.editorMode,
|
|
41
|
+
onSettingUpdate: (key, value) => emit('update:setting', key, value),
|
|
42
|
+
onBlockSettingUpdate: (blockId, key, value) => emit('update:block-setting', blockId, key, value),
|
|
43
|
+
onEditStart: (key) => emit('inline-edit-start', key),
|
|
44
|
+
onEditEnd: () => emit('inline-edit-end'),
|
|
45
|
+
onUndoRedo: (action) => emit('undo-redo', action),
|
|
46
|
+
})
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<template>
|
|
50
|
+
<div :class="isDashed ? 'props-dashed' : 'props-solid'">
|
|
51
|
+
<!-- Pros -->
|
|
52
|
+
<div class="props-left">
|
|
53
|
+
<span v-bind="editableAttrs('pros_title')">{{ s.pros_title || 'Pros' }}</span>
|
|
54
|
+
<ul>
|
|
55
|
+
<li v-for="(item, idx) in pros" :key="item.id" v-bind="blockEditableAttrs(item.id, 'text')">
|
|
56
|
+
{{ idx + 1 }}. {{ item.block.settings.text }}
|
|
57
|
+
</li>
|
|
58
|
+
</ul>
|
|
59
|
+
</div>
|
|
60
|
+
<!-- Cons -->
|
|
61
|
+
<div class="props-right">
|
|
62
|
+
<span v-bind="editableAttrs('cons_title')">{{ s.cons_title || 'Cons' }}</span>
|
|
63
|
+
<ul>
|
|
64
|
+
<li v-for="(item, idx) in cons" :key="item.id" v-bind="blockEditableAttrs(item.id, 'text')">
|
|
65
|
+
{{ idx + 1 }}. {{ item.block.settings.text }}
|
|
66
|
+
</li>
|
|
67
|
+
</ul>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</template>
|
|
71
|
+
|
|
72
|
+
<style scoped>
|
|
73
|
+
.props-dashed,.props-solid{background:var(--article-bg-light,#f5f9fc);border-radius:10px;display:grid;gap:60px;grid-template-columns:1fr 1fr;margin:20px 0;padding:20px 30px}.props-dashed{background:#fff;border:1px dashed #ccc}.props-dashed span,.props-solid span{display:block;font-size:20px;font-weight:700;line-height:28px;padding-left:14px;position:relative}.props-dashed span:before,.props-solid span:before{background:var(--article-primary,#24c790);content:"";height:14px;left:0;position:absolute;top:50%;transform:translateY(-50%);width:6px}.props-dashed ul,.props-solid ul{color:var(--article-text,#3a4259);font-size:16px;line-height:32px;margin-top:14px;padding-left:14px}.props-dashed .props-right span:before,.props-solid .props-right span:before{background:var(--article-cons,#f44242)}@media (max-width:768px){.props-dashed,.props-solid{gap:20px;grid-template-columns:1fr;margin:16px 0;padding:16px}.props-dashed span,.props-solid span{font-size:18px;line-height:21px;padding-left:10px}.props-dashed span:before,.props-solid span:before{height:10px;width:4px}.props-dashed ul,.props-solid ul{font-size:14px;line-height:21px;margin-top:10px;padding-left:10px}}
|
|
74
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { BlockData } from '@vigilkids/section-core'
|
|
3
|
+
|
|
4
|
+
import { computed } from 'vue'
|
|
5
|
+
|
|
6
|
+
import { useInlineEdit } from '../../../composables/useInlineEdit'
|
|
7
|
+
import { renderContent } from '../prosemirror'
|
|
8
|
+
|
|
9
|
+
const props = defineProps<{
|
|
10
|
+
blockOrder: string[]
|
|
11
|
+
blocks: Record<string, BlockData>
|
|
12
|
+
editorMode?: boolean
|
|
13
|
+
settings: Record<string, unknown>
|
|
14
|
+
}>()
|
|
15
|
+
|
|
16
|
+
const emit = defineEmits<{
|
|
17
|
+
(e: 'update:setting', key: string, value: unknown): void
|
|
18
|
+
(e: 'update:block-setting', blockId: string, key: string, value: unknown): void
|
|
19
|
+
(e: 'inline-edit-start', key: string): void
|
|
20
|
+
(e: 'inline-edit-end'): void
|
|
21
|
+
(e: 'undo-redo', action: 'redo' | 'undo'): void
|
|
22
|
+
}>()
|
|
23
|
+
|
|
24
|
+
const s = computed(() => props.settings)
|
|
25
|
+
const title = computed(() => (s.value.title as string) || 'Question:')
|
|
26
|
+
const renderedContent = computed(() => renderContent(s.value.content))
|
|
27
|
+
|
|
28
|
+
const { blockEditableAttrs } = useInlineEdit({
|
|
29
|
+
editorMode: () => !!props.editorMode,
|
|
30
|
+
onSettingUpdate: (key, value) => emit('update:setting', key, value),
|
|
31
|
+
onBlockSettingUpdate: (blockId, key, value) => emit('update:block-setting', blockId, key, value),
|
|
32
|
+
onEditStart: (key) => emit('inline-edit-start', key),
|
|
33
|
+
onEditEnd: () => emit('inline-edit-end'),
|
|
34
|
+
onUndoRedo: (action) => emit('undo-redo', action),
|
|
35
|
+
})
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<template>
|
|
39
|
+
<!-- Visiva: blocks Q&A 列表模式 -->
|
|
40
|
+
<div v-if="blockOrder.length > 0" class="qa-card">
|
|
41
|
+
<template v-for="blockId in blockOrder" :key="blockId">
|
|
42
|
+
<div v-if="blocks[blockId]" class="qa-card__item">
|
|
43
|
+
<h3 class="qa-card__question" v-bind="blockEditableAttrs(blockId, 'question')">{{ blocks[blockId]!.settings.question }}</h3>
|
|
44
|
+
<p class="qa-card__answer">{{ blocks[blockId]!.settings.answer }}</p>
|
|
45
|
+
</div>
|
|
46
|
+
</template>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<!-- VigilKids: 单条 richtext 问答 -->
|
|
50
|
+
<div v-else class="article-question">
|
|
51
|
+
<p class="article-question-title">{{ title }}</p>
|
|
52
|
+
<div class="article-question-content" v-html="renderedContent" />
|
|
53
|
+
</div>
|
|
54
|
+
</template>
|
|
55
|
+
|
|
56
|
+
<style scoped>
|
|
57
|
+
.article-question{background:var(--article-bg-gray,#f3f5f7);border-radius:10px;color:var(--article-text,#3a4259);margin:30px 0;padding:30px 30px 30px 82px}.article-question-title{font-size:20px;font-weight:700;line-height:38px;margin-bottom:20px;margin-top:0;position:relative}.article-question-title:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='38' height='38' fill='none' viewBox='0 0 38 38'%3E%3Cg clip-path='url(%23a)'%3E%3Cpath fill='%23f1981c' d='M19 38C8.506 38 0 29.492 0 19 0 8.506 8.506 0 19 0s19 8.506 19 19c0 10.492-8.506 19-19 19m0-35.078C10.121 2.922 2.923 10.12 2.923 19S10.121 35.077 19 35.077 35.077 27.879 35.077 19 27.879 2.922 19 2.922m5.117 14.064q-.564.72-1.213 1.277-.65.558-1.213 1.114a6.2 6.2 0 0 0-.936 1.156 2.47 2.47 0 0 0-.37 1.327q0 .614.157 1.114a7 7 0 0 0 .314.842h-3.012a5.6 5.6 0 0 1-.228-.928q-.1-.57-.1-1.127 0-.871.35-1.577.349-.708.87-1.321.52-.614 1.128-1.184.606-.573 1.127-1.114t.87-1.141.35-1.314q0-.642-.257-1.12a2.3 2.3 0 0 0-.706-.8 3.1 3.1 0 0 0-1.028-.477 4.7 4.7 0 0 0-1.235-.158q-2.126 0-4.052 1.899v-3.298q2.339-1.37 4.852-1.37 1.157 0 2.183.3a5.5 5.5 0 0 1 1.8.885q.769.585 1.213 1.455.442.873.442 2.027 0 1.1-.37 1.956a7.2 7.2 0 0 1-.936 1.577m-4.646 9.056q.813 0 1.427.571.6.529.6 1.342 0 .8-.6 1.342-.628.556-1.427.556a2.1 2.1 0 0 1-1.442-.556q-.6-.542-.599-1.342 0-.814.6-1.342.614-.57 1.44-.571'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='a'%3E%3Cpath fill='%23fff' d='M0 0h38v38H0z'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat 50%;background-size:cover;content:"";height:38px;left:-52px;position:absolute;top:0;width:38px}.article-question-content :deep(p){color:var(--article-text,#3a4259);margin-top:10px}.article-question-content :deep(p:first-child){margin-top:0}.article-question-content :deep(p:last-child){margin-bottom:0}.qa-card{background:var(--article-bg-light,#f3f4f6);border-radius:10px;display:flex;flex-direction:column;font-size:14px;gap:24px;margin:40px 0;padding:20px 16px}.qa-card__question{color:var(--article-text,#1f2937);font-size:14px;font-weight:600;margin:0 0 8px}.qa-card__answer{color:var(--article-text-muted,#6b7280);line-height:1.6;margin:0}@media (min-width:769px){.qa-card{border-radius:20px;padding:24px 20px}.qa-card,.qa-card__question{font-size:16px}}@media (max-width:768px){.article-question{padding:20px}.article-question-title{padding-left:52px}.article-question-title:before{left:0}}
|
|
58
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BlockData } from '@vigilkids/section-core';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
blockOrder: string[];
|
|
4
|
+
blocks: Record<string, BlockData>;
|
|
5
|
+
editorMode?: boolean;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
9
|
+
"update:setting": (key: string, value: unknown) => any;
|
|
10
|
+
"update:block-setting": (blockId: string, key: string, value: unknown) => any;
|
|
11
|
+
"inline-edit-start": (key: string) => any;
|
|
12
|
+
"inline-edit-end": () => any;
|
|
13
|
+
"undo-redo": (action: "redo" | "undo") => any;
|
|
14
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
15
|
+
"onUpdate:setting"?: ((key: string, value: unknown) => any) | undefined;
|
|
16
|
+
"onUpdate:block-setting"?: ((blockId: string, key: string, value: unknown) => any) | undefined;
|
|
17
|
+
"onInline-edit-start"?: ((key: string) => any) | undefined;
|
|
18
|
+
"onInline-edit-end"?: (() => any) | undefined;
|
|
19
|
+
"onUndo-redo"?: ((action: "redo" | "undo") => any) | undefined;
|
|
20
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
export default _default;
|