rimelight-components 2.0.99 → 2.1.2

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.
Files changed (49) hide show
  1. package/README.md +44 -45
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +8 -7
  4. package/dist/runtime/app.config.d.ts +4 -2
  5. package/dist/runtime/components/app/ScrollToTop.vue +1 -3
  6. package/dist/runtime/components/blocks/Block.vue +1 -3
  7. package/dist/runtime/components/blocks/TextRenderer.vue +3 -5
  8. package/dist/runtime/components/blocks/editor/ImageBlockEditor.vue +2 -6
  9. package/dist/runtime/components/blocks/editor/ParagraphBlockEditor.vue +6 -7
  10. package/dist/runtime/components/blocks/editor/SectionBlockEditor.d.vue.ts +1 -1
  11. package/dist/runtime/components/blocks/editor/SectionBlockEditor.vue +21 -24
  12. package/dist/runtime/components/blocks/editor/SectionBlockEditor.vue.d.ts +1 -1
  13. package/dist/runtime/components/blocks/renderer/SectionBlockRenderer.vue +1 -6
  14. package/dist/runtime/components/blocks/renderer/TestBlockRenderer.vue +1 -1
  15. package/dist/runtime/components/content/Callout.vue +1 -4
  16. package/dist/runtime/components/content/Section.vue +8 -10
  17. package/dist/runtime/components/page/PageEditor.vue +18 -6
  18. package/dist/runtime/components/page/PageMention.d.vue.ts +6 -0
  19. package/dist/runtime/components/page/PageMention.vue +42 -0
  20. package/dist/runtime/components/page/PageMention.vue.d.ts +6 -0
  21. package/dist/runtime/components/page/PagePropertiesEditor.d.vue.ts +1 -1
  22. package/dist/runtime/components/page/PagePropertiesEditor.vue +42 -41
  23. package/dist/runtime/components/page/PagePropertiesEditor.vue.d.ts +1 -1
  24. package/dist/runtime/components/page/PagePropertiesRenderer.vue +157 -23
  25. package/dist/runtime/components/page/PageRenderer.d.vue.ts +9 -5
  26. package/dist/runtime/components/page/PageRenderer.vue +109 -43
  27. package/dist/runtime/components/page/PageRenderer.vue.d.ts +9 -5
  28. package/dist/runtime/components/page/PageSurround.vue +9 -9
  29. package/dist/runtime/components/{blocks/TOC.d.vue.ts → page/PageTOC.d.vue.ts} +5 -8
  30. package/dist/runtime/components/page/PageTOC.vue +107 -0
  31. package/dist/runtime/components/{blocks/TOC.vue.d.ts → page/PageTOC.vue.d.ts} +5 -8
  32. package/dist/runtime/components/swatches/ColorSwatch.vue +1 -4
  33. package/dist/runtime/composables/index.d.ts +1 -0
  34. package/dist/runtime/composables/index.js +1 -0
  35. package/dist/runtime/composables/useBlockEditor.d.ts +173 -517
  36. package/dist/runtime/composables/usePageEditor.js +7 -3
  37. package/dist/runtime/composables/usePageRegistry.d.ts +33 -0
  38. package/dist/runtime/composables/usePageRegistry.js +16 -0
  39. package/dist/runtime/types/blocks.d.ts +1 -3
  40. package/dist/runtime/types/pages.d.ts +16 -8
  41. package/dist/runtime/types/schemas.d.ts +6 -0
  42. package/dist/runtime/types/schemas.js +3 -1
  43. package/dist/runtime/utils/page.d.ts +4 -4
  44. package/dist/runtime/utils/richTextHelpers.js +9 -1
  45. package/package.json +17 -17
  46. package/dist/runtime/components/blocks/TOC.vue +0 -95
  47. package/dist/runtime/components/nodes/MentionNode.d.vue.ts +0 -8
  48. package/dist/runtime/components/nodes/MentionNode.vue +0 -22
  49. package/dist/runtime/components/nodes/MentionNode.vue.d.ts +0 -8
package/README.md CHANGED
@@ -51,56 +51,55 @@ Thank you for considering contributing to Rimelight Components. Here are a few w
51
51
 
52
52
  ## Local Development
53
53
 
54
- ```bash [bun]
55
- # Install dependencies
56
- bun install
57
- ```
58
-
59
- ```bash [bun]
60
- # Generate type stubs
61
- bun dev:prepare
62
- ```
63
-
64
- ```bash [bun]
65
- # Develop with the playground
66
- bun dev
67
- ```
68
-
69
- ```bash [bun]
70
- # Build the playground
71
- bun dev:build
72
- ```
73
-
74
- ```bash [bun]
75
- # Run Typecheck
76
- bun typecheck
77
- ```
78
-
79
- ```bash [bun]
80
- # Run Oxlint
81
- bun lint
82
- ```
83
-
84
- ```bash [bun]
85
- # Run Prettier
86
- bun format
87
- ```
88
-
89
- ```bash [bun]
90
- # Run Vitest
91
- npm run test
92
- ```
93
-
94
- ```bash [bun]
95
- # Release new version
96
- bun release
97
- ```
54
+ ```bash [bun]
55
+ # Install dependencies
56
+ bun install
57
+ ```
58
+
59
+ ```bash [bun]
60
+ # Generate type stubs
61
+ bun dev:prepare
62
+ ```
63
+
64
+ ```bash [bun]
65
+ # Develop with the playground
66
+ bun dev
67
+ ```
68
+
69
+ ```bash [bun]
70
+ # Build the playground
71
+ bun dev:build
72
+ ```
73
+
74
+ ```bash [bun]
75
+ # Run Typecheck
76
+ bun typecheck
77
+ ```
78
+
79
+ ```bash [bun]
80
+ # Run Oxlint
81
+ bun lint
82
+ ```
83
+
84
+ ```bash [bun]
85
+ # Run Prettier
86
+ bun format
87
+ ```
88
+
89
+ ```bash [bun]
90
+ # Run Vitest
91
+ npm run test
92
+ ```
93
+
94
+ ```bash [bun]
95
+ # Release new version
96
+ bun release
97
+ ```
98
98
 
99
99
  Learn more in the [development guide](https://ui.nuxt.com/docs/getting-started/contribution#local-development).
100
100
 
101
101
  ## Sponshorship
102
102
 
103
-
104
103
  ## License
105
104
 
106
105
  Licensed under the [MIT license](https://github.com/nuxt/ui/blob/v4/LICENSE.md).
package/dist/module.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rimelight-components",
3
- "version": "2.0.99",
3
+ "version": "2.1.2",
4
4
  "docs": "https://rimelight.com/tools/rimelight-components",
5
5
  "configKey": "rimelightComponents",
6
6
  "compatibility": {
package/dist/module.mjs CHANGED
@@ -4,7 +4,7 @@ import { readdirSync } from 'node:fs';
4
4
  import { basename } from 'node:path';
5
5
 
6
6
  const name = "rimelight-components";
7
- const version = "2.0.99";
7
+ const version = "2.1.2";
8
8
  const homepage = "https://rimelight.com/tools/rimelight-components";
9
9
 
10
10
  const defaultOptions = {
@@ -194,23 +194,24 @@ const module$1 = defineNuxtModule().with({
194
194
  prefix: options.prefix ?? void 0,
195
195
  global: true
196
196
  });
197
+ nuxt.options.alias["#rimelight"] = resolve("./runtime");
197
198
  addImportsDir(resolve("./runtime/composables"));
198
199
  addImportsDir(resolve("./runtime/types"));
199
200
  addImportsDir(resolve("./runtime/utils"));
200
201
  addServerImportsDir(resolve("./runtime/types"));
201
202
  addServerImportsDir(resolve("./runtime/utils"));
202
- const blockRendererFiles = readdirSync(
203
- resolve("./runtime/components/blocks/renderer")
204
- ).filter((name2) => name2.endsWith(".vue"));
203
+ const blockRendererFiles = readdirSync(resolve("./runtime/components/blocks/renderer")).filter(
204
+ (name2) => name2.endsWith(".vue")
205
+ );
205
206
  const blockRendererNames = blockRendererFiles.map((file) => {
206
207
  const baseName = basename(file, ".vue");
207
208
  return baseName.replace(/Renderer$/, "");
208
209
  });
209
210
  const blockRendererTemplate = addBlockMapTemplates(blockRendererNames);
210
211
  nuxt.options.alias["#build/rimelight-block-renderer-map"] = blockRendererTemplate.dst;
211
- const blockEditorFiles = readdirSync(
212
- resolve("./runtime/components/blocks/editor")
213
- ).filter((name2) => name2.endsWith(".vue"));
212
+ const blockEditorFiles = readdirSync(resolve("./runtime/components/blocks/editor")).filter(
213
+ (name2) => name2.endsWith(".vue")
214
+ );
214
215
  const blockEditorNames = blockEditorFiles.map((file) => {
215
216
  const baseName = basename(file, ".vue");
216
217
  return baseName.replace(/Editor$/, "");
@@ -1,7 +1,9 @@
1
- declare module '#build/app.config' {
2
- import type { AppConfig } from '@nuxt/schema'
1
+ declare module "#build/app.config" {
2
+ import type { AppConfig } from "@nuxt/schema"
3
+ import type { PageType, PageDefinition } from "~/src/runtime/types"
3
4
 
4
5
  interface RimelightComponentsConfig {
6
+ pageDefinitions?: Partial<Record<PageType, PageDefinition>>
5
7
  [key: string]: any
6
8
  }
7
9
 
@@ -81,9 +81,7 @@ const durationInSeconds = computed(() => `${props.duration}s`);
81
81
  class="gauge-primary-stroke opacity-100"
82
82
  />
83
83
  </svg>
84
- <div
85
- class="absolute inset-0 flex items-center justify-center text-center"
86
- >
84
+ <div class="absolute inset-0 flex items-center justify-center text-center">
87
85
  <UIcon name="lucide:arrow-up" class="size-6 text-white" />
88
86
  </div>
89
87
  </div>
@@ -55,9 +55,7 @@ const items = ref([
55
55
 
56
56
  <template>
57
57
  <div class="group relative pl-12 flex flex-row gap-xs">
58
- <div
59
- class="top-0 left-0 z-10 opacity-0 transition-opacity group-hover:opacity-100"
60
- >
58
+ <div class="top-0 left-0 z-10 opacity-0 transition-opacity group-hover:opacity-100">
61
59
  <UDropdownMenu :items="items">
62
60
  <UButton icon="lucide:grip-vertical" variant="ghost" color="neutral" />
63
61
  </UDropdownMenu>
@@ -3,7 +3,7 @@ import {
3
3
  } from "../../types";
4
4
  import TextNode from "../nodes/TextNode.vue";
5
5
  import LinkNode from "../nodes/LinkNode.vue";
6
- import MentionNode from "../nodes/MentionNode.vue";
6
+ import PageMention from "../page/PageMention.vue";
7
7
  defineOptions({
8
8
  name: "TextRenderer"
9
9
  });
@@ -17,7 +17,7 @@ const getTag = (item) => {
17
17
  case "link":
18
18
  return LinkNode;
19
19
  case "mention":
20
- return MentionNode;
20
+ return PageMention;
21
21
  default:
22
22
  return TextNode;
23
23
  }
@@ -41,9 +41,7 @@ const getProps = (item) => {
41
41
  case "mention": {
42
42
  const mentionProps = item.props;
43
43
  return {
44
- href: mentionProps.href,
45
- target: mentionProps.target,
46
- content: mentionProps.content
44
+ pageId: mentionProps.pageId
47
45
  };
48
46
  }
49
47
  default:
@@ -90,9 +90,7 @@ watch(fileToUpload, (newFile) => {
90
90
  <template #default>
91
91
  <span class="text-xs text-muted">Alt</span>
92
92
  </template>
93
- <template #content>
94
- The text description for the image used by screen readers.
95
- </template>
93
+ <template #content> The text description for the image used by screen readers. </template>
96
94
  </UTooltip>
97
95
  </template>
98
96
  </UInput>
@@ -109,9 +107,7 @@ watch(fileToUpload, (newFile) => {
109
107
  <template #default>
110
108
  <span class="text-xs text-muted">Caption</span>
111
109
  </template>
112
- <template #content>
113
- The text description for the image used by screen readers.
114
- </template>
110
+ <template #content> The text description for the image used by screen readers. </template>
115
111
  </UTooltip>
116
112
  </template>
117
113
  </UTextarea>
@@ -45,15 +45,14 @@ onMounted(() => {
45
45
  </script>
46
46
 
47
47
  <template>
48
- <div
49
- ref="editorRef"
50
- contenteditable="true"
51
- @blur="commitContentOnBlur"
52
- :class="[
48
+ <div
49
+ ref="editorRef"
50
+ contenteditable="true"
51
+ @blur="commitContentOnBlur"
52
+ :class="[
53
53
  'p-2 outline-none min-h-6',
54
54
  'focus:ring-2 focus:ring-blue-500 rounded-md transition duration-150',
55
55
  'text-base'
56
56
  ]"
57
- >
58
- </div>
57
+ ></div>
59
58
  </template>
@@ -1,4 +1,4 @@
1
- import type { SectionBlockProps } from "../../../types/index.js";
1
+ import { type SectionBlockProps } from "../../../types/index.js";
2
2
  type __VLS_Props = SectionBlockProps & {
3
3
  id: string;
4
4
  };
@@ -1,5 +1,7 @@
1
1
  <script setup>
2
2
  import { inject, ref, computed, watch } from "vue";
3
+ import {} from "../../../types";
4
+ import {} from "@nuxt/ui/components/Select.vue";
3
5
  const { level, title, description, children, id } = defineProps({
4
6
  level: { type: Number, required: true },
5
7
  title: { type: String, required: true },
@@ -66,32 +68,27 @@ watch(
66
68
 
67
69
  <template>
68
70
  <div class="flex flex-col gap-sm">
69
- <RCSection
70
- :level="localLevel"
71
- :title="localTitle"
72
- :description="description"
73
- is-editing
74
- >
71
+ <RCSection :level="localLevel" :title="localTitle" :description="description" is-editing>
75
72
  <template #title>
76
73
  <div class="flex flex-row gap-xs">
77
- <USelect
78
- v-model="localLevel"
79
- :items="levelItems"
80
- value-key="value"
81
- label-key="label"
82
- variant="ghost"
83
- placeholder="Select Heading Level"
84
- size="sm"
85
- color="neutral"
86
- />
87
- <UInput
88
- :model-value="localTitle"
89
- variant="ghost"
90
- placeholder="Section Title..."
91
- @input="updateLocalTitle"
92
- @blur="commitTitleOnBlur"
93
- class="w-full"
94
- />
74
+ <USelect
75
+ v-model="localLevel"
76
+ :items="levelItems"
77
+ value-key="value"
78
+ label-key="label"
79
+ variant="ghost"
80
+ placeholder="Select Heading Level"
81
+ size="sm"
82
+ color="neutral"
83
+ />
84
+ <UInput
85
+ :model-value="localTitle"
86
+ variant="ghost"
87
+ placeholder="Section Title..."
88
+ @input="updateLocalTitle"
89
+ @blur="commitTitleOnBlur"
90
+ class="w-full"
91
+ />
95
92
  </div>
96
93
  </template>
97
94
  <template #description>
@@ -1,4 +1,4 @@
1
- import type { SectionBlockProps } from "../../../types/index.js";
1
+ import { type SectionBlockProps } from "../../../types/index.js";
2
2
  type __VLS_Props = SectionBlockProps & {
3
3
  id: string;
4
4
  };
@@ -12,12 +12,7 @@ const hasChildren = computed(() => children && children.length > 0);
12
12
  </script>
13
13
 
14
14
  <template>
15
- <RCSection
16
- :level="level"
17
- :title="title"
18
- :description="description"
19
- :id="headingId"
20
- >
15
+ <RCSection :level="level" :title="title" :description="description" :id="headingId">
21
16
  <RCBlockViewRenderer v-if="hasChildren" :blocks="children" />
22
17
  </RCSection>
23
18
  </template>
@@ -5,5 +5,5 @@ const { text } = defineProps({
5
5
  </script>
6
6
 
7
7
  <template>
8
- <RCTest :text="text"/>
8
+ <RCTest :text="text" />
9
9
  </template>
@@ -39,10 +39,7 @@ const tooltip = computed(() => config.value.tooltip);
39
39
  </template>
40
40
  <template #close>
41
41
  <UTooltip v-if="tooltip" :text="t(tooltip)">
42
- <UIcon
43
- name="lucide:circle-question-mark"
44
- class="pointer-events-auto size-5"
45
- />
42
+ <UIcon name="lucide:circle-question-mark" class="pointer-events-auto size-5" />
46
43
  </UTooltip>
47
44
  </template>
48
45
  </UAlert>
@@ -115,28 +115,26 @@ const fullSectionUrl = computed(() => {
115
115
 
116
116
  <template>
117
117
  <section :id="sectionId" :class="sectionSlot()" v-bind="$attrs">
118
- <component
119
- :id="sectionId"
120
- :is="`h${level}`"
121
- :class="headingSlot()"
122
- >
118
+ <component :id="sectionId" :is="`h${level}`" :class="headingSlot()">
123
119
  <NuxtLink
124
120
  v-if="!isEditing"
125
121
  :href="`#${sectionId}`"
126
122
  :class="linkSlot()"
127
- class="group lg:-ms-2 lg:ps-2"
123
+ class="group relative lg:-ms-2 lg:ps-2 inline-block w-full"
128
124
  >
129
125
  <ClientOnly>
130
126
  <UButton
131
127
  variant="soft"
132
128
  color="primary"
133
- leading-icon="lucide:link"
129
+ icon="i-lucide-link"
134
130
  :to="`#${sectionId}`"
135
- class="absolute top-1 -ms-8 hidden rounded-md p-1 opacity-0 transition group-hover:opacity-100 group-focus:opacity-100 lg:flex"
136
- @click="copyToClipboard(fullSectionUrl)"
131
+ class="absolute top-1/2 -translate-y-1/2 -ms-8 hidden rounded-md p-1 opacity-0 transition group-hover:opacity-100 group-focus:opacity-100 lg:flex"
132
+ @click.prevent="copyToClipboard(fullSectionUrl)"
137
133
  />
138
134
  <template #fallback>
139
- <div class="absolute top-1 -ms-8 w-6 h-6 rounded-md p-1 opacity-0 transition lg:flex" />
135
+ <div
136
+ class="absolute top-1/2 -translate-y-1/2 -ms-8 w-6 h-6 rounded-md p-1 opacity-0 transition lg:flex"
137
+ />
140
138
  </template>
141
139
  </ClientOnly>
142
140
  <slot name="title">{{ title }}</slot>
@@ -72,13 +72,19 @@ const editorPanelClass = computed(() => ({
72
72
  </div>
73
73
  </template>
74
74
  </UHeader>
75
- <UContainer class="mt-24 grid gap-xl" :class="showPreview ? 'grid-cols-2 max-w-full' : 'grid-cols-1'">
75
+ <UContainer
76
+ class="mt-24 grid gap-xl"
77
+ :class="showPreview ? 'grid-cols-2 max-w-full' : 'grid-cols-1'"
78
+ >
76
79
  <div :class="editorPanelClass" class="grid grid-cols-1 lg:grid-cols-4 gap-8">
77
80
  <UPageAside class="order-1 lg:order-2 lg:col-span-1">
78
81
  <RCPagePropertiesEditor v-model="page" />
79
82
  </UPageAside>
80
83
  <div class="order-2 lg:order-1 lg:col-span-3">
81
- <UPageHeader :title="getLocalizedContent(page.title, 'en')" :description="getLocalizedContent(page.description, 'en') ?? ''" />
84
+ <UPageHeader
85
+ :title="getLocalizedContent(page.title, 'en')"
86
+ :description="getLocalizedContent(page.description, 'en') ?? ''"
87
+ />
82
88
  <RCBlockEditor
83
89
  ref="editor"
84
90
  v-model="page.blocks"
@@ -88,7 +94,9 @@ const editorPanelClass = computed(() => ({
88
94
  <div class="flex flex-col gap-xs text-xs">
89
95
  <h6>Metadata</h6>
90
96
  <span>Page ID: {{ page.id }}</span>
91
- <span>Created At: <NuxtTime
97
+ <span
98
+ >Created At:
99
+ <NuxtTime
92
100
  :datetime="page.created_at ?? ''"
93
101
  year="numeric"
94
102
  month="numeric"
@@ -98,7 +106,9 @@ const editorPanelClass = computed(() => ({
98
106
  second="numeric"
99
107
  time-zone-name="short"
100
108
  /></span>
101
- <span>Posted At: <NuxtTime
109
+ <span
110
+ >Posted At:
111
+ <NuxtTime
102
112
  :datetime="page.created_at ?? ''"
103
113
  year="numeric"
104
114
  month="numeric"
@@ -108,7 +118,9 @@ const editorPanelClass = computed(() => ({
108
118
  second="numeric"
109
119
  time-zone-name="short"
110
120
  /></span>
111
- <span>Updated At: <NuxtTime
121
+ <span
122
+ >Updated At:
123
+ <NuxtTime
112
124
  :datetime="page.created_at ?? ''"
113
125
  year="numeric"
114
126
  month="numeric"
@@ -123,7 +135,7 @@ const editorPanelClass = computed(() => ({
123
135
  </div>
124
136
  <div class="flex flex-row gap-xl">
125
137
  <USeparator orientation="vertical" />
126
- <RCPageRenderer v-if="showPreview" v-model="page"/>
138
+ <RCPageRenderer v-if="showPreview" v-model="page" />
127
139
  </div>
128
140
  </UContainer>
129
141
  </template>
@@ -0,0 +1,6 @@
1
+ interface PageMentionProps {
2
+ pageId: string;
3
+ }
4
+ declare const __VLS_export: import("vue").DefineComponent<PageMentionProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<PageMentionProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
5
+ declare const _default: typeof __VLS_export;
6
+ export default _default;
@@ -0,0 +1,42 @@
1
+ <script setup>
2
+ import { inject } from "vue";
3
+ import { getLocalizedContent } from "../../utils";
4
+ import { useI18n } from "vue-i18n";
5
+ import {} from "../../types";
6
+ import { useAsyncData } from "#imports";
7
+ const { pageId } = defineProps({
8
+ pageId: { type: String, required: true }
9
+ });
10
+ const { locale } = useI18n();
11
+ const resolver = inject("page-resolver");
12
+ const { data: linkedPage, status } = await useAsyncData(`page-mention-${pageId}`, async () => {
13
+ if (!resolver) {
14
+ console.warn("RCPageMention: No page resolver provided in RCPageRenderer");
15
+ return null;
16
+ }
17
+ return await resolver(pageId);
18
+ }, {
19
+ lazy: true,
20
+ server: false,
21
+ watch: [() => pageId]
22
+ });
23
+ </script>
24
+
25
+ <template>
26
+ <NuxtLink
27
+ v-if="linkedPage"
28
+ :to="`/${linkedPage.slug}`"
29
+ class="inline-flex items-baseline gap-1 align-middle hover:text-primary transition-colors font-medium text-inherit"
30
+ >
31
+ <NuxtImg
32
+ v-if="linkedPage.icon?.src"
33
+ :src="linkedPage.icon.src"
34
+ :alt="linkedPage.icon.alt"
35
+ class="w-4 h-4 rounded-full object-cover shrink-0"
36
+ />
37
+ <span class="truncate font-medium">
38
+ {{ getLocalizedContent(linkedPage.title, locale) }}
39
+ </span>
40
+ </NuxtLink>
41
+ <USkeleton v-else-if="status === 'pending'" class="h-3 w-24" />
42
+ </template>
@@ -0,0 +1,6 @@
1
+ interface PageMentionProps {
2
+ pageId: string;
3
+ }
4
+ declare const __VLS_export: import("vue").DefineComponent<PageMentionProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<PageMentionProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
5
+ declare const _default: typeof __VLS_export;
6
+ export default _default;
@@ -1,4 +1,4 @@
1
- import { type Page } from '../../types/index.js';
1
+ import { type Page } from "../../types/index.js";
2
2
  type __VLS_ModelProps = {
3
3
  modelValue: Page;
4
4
  };