<script setup lang="ts">
const { seo } = useAppConfig()
const { data: navigation } = await useAsyncData('navigation', () => queryCollectionNavigation('docs'))
const { data: files } = useLazyAsyncData('search', () => queryCollectionSearchSections('docs'), {
server: false
})
const route = useRoute()
const siteUrl = 'https://visionsqueezer.com'
const canonicalUrl = computed(() => `${siteUrl}${route.path === '/' ? '/' : route.path.replace(/\/$/, '')}`)
useHead({
meta: [
{ name: 'viewport', content: 'width=device-width, initial-scale=1' }
],
link: [
{ rel: 'icon', href: '/favicon.ico' },
{ rel: 'canonical', href: canonicalUrl }
],
htmlAttrs: {
lang: 'en'
}
})
useSeoMeta({
titleTemplate: `%s - ${seo?.siteName}`,
ogSiteName: seo?.siteName,
ogUrl: canonicalUrl,
ogLocale: 'en_US',
twitterTitle: () => seo?.siteName,
twitterDescription: 'AI vision token optimization middleware and MCP server for image-aware models.',
twitterCard: 'summary_large_image'
})
useHead({
script: [{
type: 'application/ld+json',
innerHTML: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'Organization',
'name': 'VisionSqueezer',
'url': siteUrl,
'logo': `${siteUrl}/logo.png`,
'sameAs': [
'https://github.com/eralpozcan/vision-squeezer',
'https://www.npmjs.com/package/vision-squeezer',
'https://crates.io/crates/vision-squeezer'
]
})
}]
})
provide('navigation', navigation)
</script>
<template>
<UApp>
<NuxtLoadingIndicator />
<AppHeader />
<UMain>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</UMain>
<AppFooter />
<ClientOnly>
<LazyUContentSearch
:files="files"
:navigation="navigation"
/>
<CookieConsent />
</ClientOnly>
</UApp>
</template>