@duffcloudservices/cms 0.3.12 → 0.3.14
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/README.md +332 -309
- package/dist/editor/editorBridge.js +127 -50
- package/dist/editor/editorBridge.js.map +1 -1
- package/dist/index.js +59 -13
- package/dist/index.js.map +1 -1
- package/dist/plugins/index.js.map +1 -1
- package/package.json +90 -90
- package/src/components/DcsReviewShowcase.vue +321 -326
- package/src/components/PreviewRibbon.vue +612 -612
- package/src/components/ResponsiveImage.vue +55 -55
- package/src/composables/index.ts +10 -10
- package/src/composables/useMediaCarousel.ts +158 -158
- package/src/composables/useReleaseNotes.ts +153 -153
- package/src/composables/useResponsiveImage.ts +85 -85
- package/src/composables/useReviewContent.ts +150 -92
- package/src/composables/useSEO.ts +387 -387
- package/src/composables/useSiteVersion.ts +123 -123
- package/src/composables/useTextContent.ts +297 -297
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useReleaseNotes Composable
|
|
3
|
-
*
|
|
4
|
-
* Fetches and displays versioned release notes from the DCS Portal API.
|
|
5
|
-
* Supports fetching specific versions or the latest release.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```vue
|
|
9
|
-
* <script setup lang="ts">
|
|
10
|
-
* import { useReleaseNotes } from '@duffcloudservices/cms'
|
|
11
|
-
* import { useRoute } from 'vue-router'
|
|
12
|
-
*
|
|
13
|
-
* const route = useRoute()
|
|
14
|
-
* const version = route.params.version as string || 'latest'
|
|
15
|
-
*
|
|
16
|
-
* const { releaseNote, isLoading, error } = useReleaseNotes(version)
|
|
17
|
-
* </script>
|
|
18
|
-
*
|
|
19
|
-
* <template>
|
|
20
|
-
* <div v-if="isLoading">Loading...</div>
|
|
21
|
-
* <div v-else-if="error">{{ error }}</div>
|
|
22
|
-
* <article v-else-if="releaseNote">
|
|
23
|
-
* <h1>{{ releaseNote.title }}</h1>
|
|
24
|
-
* <p>{{ releaseNote.summary }}</p>
|
|
25
|
-
* <div v-html="renderedMarkdown" />
|
|
26
|
-
* </article>
|
|
27
|
-
* </template>
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import { ref, onMounted } from 'vue'
|
|
32
|
-
import type { ReleaseNote, ReleaseNotesReturn } from '../types/release-notes'
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Get environment variable value.
|
|
36
|
-
*/
|
|
37
|
-
function getEnvVar(key: string, defaultValue = ''): string {
|
|
38
|
-
try {
|
|
39
|
-
if (typeof import.meta !== 'undefined' && import.meta.env) {
|
|
40
|
-
const value = (import.meta.env as Record<string, string | undefined>)[key]
|
|
41
|
-
if (value !== undefined) return value
|
|
42
|
-
}
|
|
43
|
-
} catch {
|
|
44
|
-
// import.meta not available
|
|
45
|
-
}
|
|
46
|
-
return defaultValue
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Simple cache for release notes
|
|
50
|
-
const releaseNotesCache = new Map<string, { data: ReleaseNote; expiresAt: number }>()
|
|
51
|
-
const CACHE_TTL = 5 * 60 * 1000 // 5 minutes
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* useReleaseNotes composable for fetching release notes from the DCS API.
|
|
55
|
-
*
|
|
56
|
-
* @param version - Semantic version (e.g., "1.2.0") or "latest"
|
|
57
|
-
* @param options - Optional configuration
|
|
58
|
-
* @returns Release notes data and state
|
|
59
|
-
*/
|
|
60
|
-
export function useReleaseNotes(
|
|
61
|
-
version: string,
|
|
62
|
-
options: { fetchOnMount?: boolean } = {}
|
|
63
|
-
): ReleaseNotesReturn {
|
|
64
|
-
const { fetchOnMount = true } = options
|
|
65
|
-
|
|
66
|
-
const apiBaseUrl = getEnvVar('VITE_API_BASE_URL', 'https://portal.duffcloudservices.com')
|
|
67
|
-
const siteSlug = getEnvVar('VITE_SITE_SLUG', '')
|
|
68
|
-
|
|
69
|
-
const releaseNote = ref<ReleaseNote | null>(null)
|
|
70
|
-
const isLoading = ref(false)
|
|
71
|
-
const error = ref<string | null>(null)
|
|
72
|
-
|
|
73
|
-
async function fetchReleaseNotes(): Promise<void> {
|
|
74
|
-
if (!siteSlug) {
|
|
75
|
-
error.value = 'VITE_SITE_SLUG environment variable not set'
|
|
76
|
-
return
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Check cache
|
|
80
|
-
const cacheKey = `${siteSlug}:${version}`
|
|
81
|
-
const cached = releaseNotesCache.get(cacheKey)
|
|
82
|
-
if (cached && cached.expiresAt > Date.now()) {
|
|
83
|
-
releaseNote.value = cached.data
|
|
84
|
-
return
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
isLoading.value = true
|
|
88
|
-
error.value = null
|
|
89
|
-
|
|
90
|
-
try {
|
|
91
|
-
const url = `${apiBaseUrl}/api/v1/sites/${siteSlug}/release-notes/${version}`
|
|
92
|
-
const response = await fetch(url, {
|
|
93
|
-
headers: {
|
|
94
|
-
Accept: 'application/json',
|
|
95
|
-
},
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
if (!response.ok) {
|
|
99
|
-
if (response.status === 404) {
|
|
100
|
-
error.value = `Release notes for version ${version} not found`
|
|
101
|
-
return
|
|
102
|
-
}
|
|
103
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const data = await response.json()
|
|
107
|
-
|
|
108
|
-
// Normalize the response
|
|
109
|
-
const note: ReleaseNote = {
|
|
110
|
-
version: data.version,
|
|
111
|
-
title: data.title,
|
|
112
|
-
summary: data.summary || '',
|
|
113
|
-
notesMarkdown: data.notesMarkdown || data.notes || '',
|
|
114
|
-
changeCount: data.changeCount || 0,
|
|
115
|
-
releaseDate: data.releaseDate || data.releasedAt || '',
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Cache the result
|
|
119
|
-
releaseNotesCache.set(cacheKey, {
|
|
120
|
-
data: note,
|
|
121
|
-
expiresAt: Date.now() + CACHE_TTL,
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
releaseNote.value = note
|
|
125
|
-
} catch (e) {
|
|
126
|
-
error.value = e instanceof Error ? e.message : 'Failed to load release notes'
|
|
127
|
-
console.error('[@duffcloudservices/cms] Failed to fetch release notes:', e)
|
|
128
|
-
} finally {
|
|
129
|
-
isLoading.value = false
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async function refresh(): Promise<void> {
|
|
134
|
-
// Clear cache
|
|
135
|
-
const cacheKey = `${siteSlug}:${version}`
|
|
136
|
-
releaseNotesCache.delete(cacheKey)
|
|
137
|
-
await fetchReleaseNotes()
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Fetch on mount if enabled
|
|
141
|
-
if (fetchOnMount && typeof window !== 'undefined') {
|
|
142
|
-
onMounted(() => {
|
|
143
|
-
fetchReleaseNotes()
|
|
144
|
-
})
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return {
|
|
148
|
-
releaseNote,
|
|
149
|
-
isLoading,
|
|
150
|
-
error,
|
|
151
|
-
refresh,
|
|
152
|
-
}
|
|
153
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* useReleaseNotes Composable
|
|
3
|
+
*
|
|
4
|
+
* Fetches and displays versioned release notes from the DCS Portal API.
|
|
5
|
+
* Supports fetching specific versions or the latest release.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```vue
|
|
9
|
+
* <script setup lang="ts">
|
|
10
|
+
* import { useReleaseNotes } from '@duffcloudservices/cms'
|
|
11
|
+
* import { useRoute } from 'vue-router'
|
|
12
|
+
*
|
|
13
|
+
* const route = useRoute()
|
|
14
|
+
* const version = route.params.version as string || 'latest'
|
|
15
|
+
*
|
|
16
|
+
* const { releaseNote, isLoading, error } = useReleaseNotes(version)
|
|
17
|
+
* </script>
|
|
18
|
+
*
|
|
19
|
+
* <template>
|
|
20
|
+
* <div v-if="isLoading">Loading...</div>
|
|
21
|
+
* <div v-else-if="error">{{ error }}</div>
|
|
22
|
+
* <article v-else-if="releaseNote">
|
|
23
|
+
* <h1>{{ releaseNote.title }}</h1>
|
|
24
|
+
* <p>{{ releaseNote.summary }}</p>
|
|
25
|
+
* <div v-html="renderedMarkdown" />
|
|
26
|
+
* </article>
|
|
27
|
+
* </template>
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { ref, onMounted } from 'vue'
|
|
32
|
+
import type { ReleaseNote, ReleaseNotesReturn } from '../types/release-notes'
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get environment variable value.
|
|
36
|
+
*/
|
|
37
|
+
function getEnvVar(key: string, defaultValue = ''): string {
|
|
38
|
+
try {
|
|
39
|
+
if (typeof import.meta !== 'undefined' && import.meta.env) {
|
|
40
|
+
const value = (import.meta.env as Record<string, string | undefined>)[key]
|
|
41
|
+
if (value !== undefined) return value
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
// import.meta not available
|
|
45
|
+
}
|
|
46
|
+
return defaultValue
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Simple cache for release notes
|
|
50
|
+
const releaseNotesCache = new Map<string, { data: ReleaseNote; expiresAt: number }>()
|
|
51
|
+
const CACHE_TTL = 5 * 60 * 1000 // 5 minutes
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* useReleaseNotes composable for fetching release notes from the DCS API.
|
|
55
|
+
*
|
|
56
|
+
* @param version - Semantic version (e.g., "1.2.0") or "latest"
|
|
57
|
+
* @param options - Optional configuration
|
|
58
|
+
* @returns Release notes data and state
|
|
59
|
+
*/
|
|
60
|
+
export function useReleaseNotes(
|
|
61
|
+
version: string,
|
|
62
|
+
options: { fetchOnMount?: boolean } = {}
|
|
63
|
+
): ReleaseNotesReturn {
|
|
64
|
+
const { fetchOnMount = true } = options
|
|
65
|
+
|
|
66
|
+
const apiBaseUrl = getEnvVar('VITE_API_BASE_URL', 'https://portal.duffcloudservices.com')
|
|
67
|
+
const siteSlug = getEnvVar('VITE_SITE_SLUG', '')
|
|
68
|
+
|
|
69
|
+
const releaseNote = ref<ReleaseNote | null>(null)
|
|
70
|
+
const isLoading = ref(false)
|
|
71
|
+
const error = ref<string | null>(null)
|
|
72
|
+
|
|
73
|
+
async function fetchReleaseNotes(): Promise<void> {
|
|
74
|
+
if (!siteSlug) {
|
|
75
|
+
error.value = 'VITE_SITE_SLUG environment variable not set'
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Check cache
|
|
80
|
+
const cacheKey = `${siteSlug}:${version}`
|
|
81
|
+
const cached = releaseNotesCache.get(cacheKey)
|
|
82
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
83
|
+
releaseNote.value = cached.data
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
isLoading.value = true
|
|
88
|
+
error.value = null
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
const url = `${apiBaseUrl}/api/v1/sites/${siteSlug}/release-notes/${version}`
|
|
92
|
+
const response = await fetch(url, {
|
|
93
|
+
headers: {
|
|
94
|
+
Accept: 'application/json',
|
|
95
|
+
},
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
if (response.status === 404) {
|
|
100
|
+
error.value = `Release notes for version ${version} not found`
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const data = await response.json()
|
|
107
|
+
|
|
108
|
+
// Normalize the response
|
|
109
|
+
const note: ReleaseNote = {
|
|
110
|
+
version: data.version,
|
|
111
|
+
title: data.title,
|
|
112
|
+
summary: data.summary || '',
|
|
113
|
+
notesMarkdown: data.notesMarkdown || data.notes || '',
|
|
114
|
+
changeCount: data.changeCount || 0,
|
|
115
|
+
releaseDate: data.releaseDate || data.releasedAt || '',
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Cache the result
|
|
119
|
+
releaseNotesCache.set(cacheKey, {
|
|
120
|
+
data: note,
|
|
121
|
+
expiresAt: Date.now() + CACHE_TTL,
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
releaseNote.value = note
|
|
125
|
+
} catch (e) {
|
|
126
|
+
error.value = e instanceof Error ? e.message : 'Failed to load release notes'
|
|
127
|
+
console.error('[@duffcloudservices/cms] Failed to fetch release notes:', e)
|
|
128
|
+
} finally {
|
|
129
|
+
isLoading.value = false
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async function refresh(): Promise<void> {
|
|
134
|
+
// Clear cache
|
|
135
|
+
const cacheKey = `${siteSlug}:${version}`
|
|
136
|
+
releaseNotesCache.delete(cacheKey)
|
|
137
|
+
await fetchReleaseNotes()
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Fetch on mount if enabled
|
|
141
|
+
if (fetchOnMount && typeof window !== 'undefined') {
|
|
142
|
+
onMounted(() => {
|
|
143
|
+
fetchReleaseNotes()
|
|
144
|
+
})
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
releaseNote,
|
|
149
|
+
isLoading,
|
|
150
|
+
error,
|
|
151
|
+
refresh,
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vue 3 composable that resolves responsive image variants for DCS CDN-hosted assets.
|
|
3
|
-
*
|
|
4
|
-
* Wraps the framework-agnostic `resolveResponsiveImage` from `@duffcloudservices/cms-core`
|
|
5
|
-
* with reactive Vue refs so it can be used directly in `<script setup>` blocks.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```vue
|
|
9
|
-
* <script setup lang="ts">
|
|
10
|
-
* import { useResponsiveImage } from '@duffcloudservices/cms'
|
|
11
|
-
*
|
|
12
|
-
* const hero = useResponsiveImage({
|
|
13
|
-
* src: 'https://files.duffcloudservices.com/kept/assets/hero/abc-123.jpg',
|
|
14
|
-
* alt: 'Hero image',
|
|
15
|
-
* context: 'hero',
|
|
16
|
-
* })
|
|
17
|
-
* </script>
|
|
18
|
-
*
|
|
19
|
-
* <template>
|
|
20
|
-
* <picture v-if="hero.hasVariants">
|
|
21
|
-
* <source
|
|
22
|
-
* v-for="source in hero.sources"
|
|
23
|
-
* :key="source.type"
|
|
24
|
-
* :srcset="source.srcset"
|
|
25
|
-
* :type="source.type"
|
|
26
|
-
* :sizes="source.sizes"
|
|
27
|
-
* />
|
|
28
|
-
* <img v-bind="hero.imgProps" class="w-full h-full object-cover" />
|
|
29
|
-
* </picture>
|
|
30
|
-
* <img v-else v-bind="hero.imgProps" class="w-full h-full object-cover" />
|
|
31
|
-
* </template>
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
import { computed, type MaybeRefOrGetter, toValue } from 'vue'
|
|
36
|
-
import {
|
|
37
|
-
resolveResponsiveImage,
|
|
38
|
-
type ImageContext,
|
|
39
|
-
type ResponsiveImageResult,
|
|
40
|
-
} from '@duffcloudservices/cms-core'
|
|
41
|
-
|
|
42
|
-
export interface UseResponsiveImageOptions {
|
|
43
|
-
/** Source URL — can be a reactive ref, getter, or plain string. */
|
|
44
|
-
src: MaybeRefOrGetter<string>
|
|
45
|
-
/** Alt text — can be a reactive ref, getter, or plain string. */
|
|
46
|
-
alt: MaybeRefOrGetter<string>
|
|
47
|
-
/** Sizing context — determines which variants to include. */
|
|
48
|
-
context?: MaybeRefOrGetter<ImageContext | undefined>
|
|
49
|
-
/** Optional `sizes` attribute override. */
|
|
50
|
-
sizes?: MaybeRefOrGetter<string | undefined>
|
|
51
|
-
/** Skip variant resolution and use the original URL only. */
|
|
52
|
-
original?: MaybeRefOrGetter<boolean | undefined>
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Reactively resolves responsive image metadata for a DCS CDN URL.
|
|
57
|
-
*
|
|
58
|
-
* The returned object is a computed ref that recomputes whenever any
|
|
59
|
-
* of the input refs change. Spread `imgProps` onto an `<img>` or
|
|
60
|
-
* combine with `sources` inside a `<picture>` element.
|
|
61
|
-
*/
|
|
62
|
-
export function useResponsiveImage(options: UseResponsiveImageOptions): ResponsiveImageResult {
|
|
63
|
-
const result = computed(() =>
|
|
64
|
-
resolveResponsiveImage({
|
|
65
|
-
src: toValue(options.src),
|
|
66
|
-
alt: toValue(options.alt),
|
|
67
|
-
context: toValue(options.context),
|
|
68
|
-
sizes: toValue(options.sizes),
|
|
69
|
-
original: toValue(options.original) ?? undefined,
|
|
70
|
-
}),
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
// Return a reactive proxy that delegates to the computed
|
|
74
|
-
return {
|
|
75
|
-
get imgProps() {
|
|
76
|
-
return result.value.imgProps
|
|
77
|
-
},
|
|
78
|
-
get sources() {
|
|
79
|
-
return result.value.sources
|
|
80
|
-
},
|
|
81
|
-
get hasVariants() {
|
|
82
|
-
return result.value.hasVariants
|
|
83
|
-
},
|
|
84
|
-
}
|
|
85
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Vue 3 composable that resolves responsive image variants for DCS CDN-hosted assets.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the framework-agnostic `resolveResponsiveImage` from `@duffcloudservices/cms-core`
|
|
5
|
+
* with reactive Vue refs so it can be used directly in `<script setup>` blocks.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```vue
|
|
9
|
+
* <script setup lang="ts">
|
|
10
|
+
* import { useResponsiveImage } from '@duffcloudservices/cms'
|
|
11
|
+
*
|
|
12
|
+
* const hero = useResponsiveImage({
|
|
13
|
+
* src: 'https://files.duffcloudservices.com/kept/assets/hero/abc-123.jpg',
|
|
14
|
+
* alt: 'Hero image',
|
|
15
|
+
* context: 'hero',
|
|
16
|
+
* })
|
|
17
|
+
* </script>
|
|
18
|
+
*
|
|
19
|
+
* <template>
|
|
20
|
+
* <picture v-if="hero.hasVariants">
|
|
21
|
+
* <source
|
|
22
|
+
* v-for="source in hero.sources"
|
|
23
|
+
* :key="source.type"
|
|
24
|
+
* :srcset="source.srcset"
|
|
25
|
+
* :type="source.type"
|
|
26
|
+
* :sizes="source.sizes"
|
|
27
|
+
* />
|
|
28
|
+
* <img v-bind="hero.imgProps" class="w-full h-full object-cover" />
|
|
29
|
+
* </picture>
|
|
30
|
+
* <img v-else v-bind="hero.imgProps" class="w-full h-full object-cover" />
|
|
31
|
+
* </template>
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import { computed, type MaybeRefOrGetter, toValue } from 'vue'
|
|
36
|
+
import {
|
|
37
|
+
resolveResponsiveImage,
|
|
38
|
+
type ImageContext,
|
|
39
|
+
type ResponsiveImageResult,
|
|
40
|
+
} from '@duffcloudservices/cms-core'
|
|
41
|
+
|
|
42
|
+
export interface UseResponsiveImageOptions {
|
|
43
|
+
/** Source URL — can be a reactive ref, getter, or plain string. */
|
|
44
|
+
src: MaybeRefOrGetter<string>
|
|
45
|
+
/** Alt text — can be a reactive ref, getter, or plain string. */
|
|
46
|
+
alt: MaybeRefOrGetter<string>
|
|
47
|
+
/** Sizing context — determines which variants to include. */
|
|
48
|
+
context?: MaybeRefOrGetter<ImageContext | undefined>
|
|
49
|
+
/** Optional `sizes` attribute override. */
|
|
50
|
+
sizes?: MaybeRefOrGetter<string | undefined>
|
|
51
|
+
/** Skip variant resolution and use the original URL only. */
|
|
52
|
+
original?: MaybeRefOrGetter<boolean | undefined>
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Reactively resolves responsive image metadata for a DCS CDN URL.
|
|
57
|
+
*
|
|
58
|
+
* The returned object is a computed ref that recomputes whenever any
|
|
59
|
+
* of the input refs change. Spread `imgProps` onto an `<img>` or
|
|
60
|
+
* combine with `sources` inside a `<picture>` element.
|
|
61
|
+
*/
|
|
62
|
+
export function useResponsiveImage(options: UseResponsiveImageOptions): ResponsiveImageResult {
|
|
63
|
+
const result = computed(() =>
|
|
64
|
+
resolveResponsiveImage({
|
|
65
|
+
src: toValue(options.src),
|
|
66
|
+
alt: toValue(options.alt),
|
|
67
|
+
context: toValue(options.context),
|
|
68
|
+
sizes: toValue(options.sizes),
|
|
69
|
+
original: toValue(options.original) ?? undefined,
|
|
70
|
+
}),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
// Return a reactive proxy that delegates to the computed
|
|
74
|
+
return {
|
|
75
|
+
get imgProps() {
|
|
76
|
+
return result.value.imgProps
|
|
77
|
+
},
|
|
78
|
+
get sources() {
|
|
79
|
+
return result.value.sources
|
|
80
|
+
},
|
|
81
|
+
get hasVariants() {
|
|
82
|
+
return result.value.hasVariants
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
}
|