Skip to content

Commit 9d13d88

Browse files
cursoragentMokkapps
andcommitted
chore: upgrade all dependencies including major versions
- Update Nuxt ecosystem: nuxt 4.4.8, @nuxt/ui 4.9, @nuxt/content 3.15, @nuxt/fonts 0.14, tailwindcss 4.3, zod 4.4, better-sqlite3 12.11 - Major: @nuxt/image 2.0, @nuxtjs/seo 5.3 (module order fix) - Major: eslint 10.6, @antfu/eslint-config 9.1 (rule prefix migration) - Run nuxt-og-image migrate v6, eject NuxtSeoSatori template, add satori - Fix TypeScript issues from stricter types after upgrades Co-authored-by: Michael Hoffmann <michael.hoffmann@mokkapps.de>
1 parent 342a9c4 commit 9d13d88

11 files changed

Lines changed: 8675 additions & 4731 deletions

app/components/AppHeader.vue

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ const items = computed<Array<NavigationMenuItem>>(() => {
3636
})
3737
3838
nuxtApp.hooks.hookOnce('page:finish', () => {
39-
updateHeadings([
40-
document.querySelector('#principles'),
41-
document.querySelector('#products'),
42-
document.querySelector('#knowledge'),
43-
document.querySelector('#gallery'),
44-
document.querySelector('#contact'),
45-
])
39+
updateHeadings(
40+
[
41+
document.querySelector('#principles'),
42+
document.querySelector('#products'),
43+
document.querySelector('#knowledge'),
44+
document.querySelector('#gallery'),
45+
document.querySelector('#contact'),
46+
].filter((element): element is Element => element !== null),
47+
)
4648
})
4749
</script>
4850

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<script setup>
2+
import { computed } from 'vue'
3+
4+
defineProps({
5+
colorMode: { default: 'light', required: false, type: String },
6+
description: { required: false, type: String },
7+
isPro: { required: false, type: Boolean },
8+
title: { default: 'title', required: false, type: String },
9+
})
10+
const themeColor = computed(() => '178, 151, 18')
11+
</script>
12+
13+
<template>
14+
<div
15+
class="w-full h-full justify-center items-center relative p-10 lg:p-[60px] bg-white text-neutral-900 dark:bg-neutral-900 dark:text-neutral-50"
16+
>
17+
<!-- Gradient background -->
18+
<div
19+
class="absolute top-0 left-0 right-0 bottom-0"
20+
:style="{
21+
backgroundImage: `radial-gradient(ellipse 100% 100% at 100% 100%, rgba(${themeColor}, 0.15) 0%, transparent 60%)`,
22+
}"
23+
/>
24+
<div
25+
class="absolute top-0 left-0 right-0 bottom-0"
26+
:style="{
27+
backgroundImage: `radial-gradient(ellipse 100% 100% at 0.1% 0.1%, rgba(${themeColor}, 0.1) 0%, transparent 50%)`,
28+
}"
29+
/>
30+
31+
<div class="w-full flex-col justify-center relative items-center text-center gap-5 lg:gap-8">
32+
<!-- Logo -->
33+
<div class="flex items-center gap-1">
34+
<svg
35+
viewBox="0 0 64 64"
36+
class="w-10 h-10 lg:w-16 lg:h-16"
37+
>
38+
<defs>
39+
<linearGradient
40+
:id="isPro ? 'nsLine2' : 'nsLine1'"
41+
x1="0%"
42+
y1="100%"
43+
x2="100%"
44+
y2="0%"
45+
>
46+
<stop
47+
offset="0%"
48+
:stop-color="isPro ? '#7c3aed' : '#22c55e'"
49+
/>
50+
<stop
51+
offset="100%"
52+
:stop-color="isPro ? '#c4b5fd' : '#86efac'"
53+
/>
54+
</linearGradient>
55+
<linearGradient
56+
:id="isPro ? 'nsFill2' : 'nsFill1'"
57+
x1="0%"
58+
y1="0%"
59+
x2="0%"
60+
y2="100%"
61+
>
62+
<stop
63+
offset="0%"
64+
:stop-color="isPro ? '#7c3aed' : '#22c55e'"
65+
stop-opacity="0.6"
66+
/>
67+
<stop
68+
offset="100%"
69+
:stop-color="isPro ? '#7c3aed' : '#22c55e'"
70+
stop-opacity="0"
71+
/>
72+
</linearGradient>
73+
</defs>
74+
<path
75+
d="M8 52 Q20 48 24 36 T40 20 T56 12 L56 56 L8 56 Z"
76+
:fill="`url(#${isPro ? 'nsFill2' : 'nsFill1'})`"
77+
/>
78+
<path
79+
d="M8 52 Q20 48 24 36 T40 20 T56 12"
80+
fill="none"
81+
:stroke="`url(#${isPro ? 'nsLine2' : 'nsLine1'})`"
82+
stroke-width="4"
83+
stroke-linecap="round"
84+
/>
85+
<circle
86+
cx="56"
87+
cy="12"
88+
r="6"
89+
:fill="`url(#${isPro ? 'nsLine2' : 'nsLine1'})`"
90+
/>
91+
</svg>
92+
<span class="text-[32px] lg:text-[42px] font-bold tracking-tight">
93+
Nuxt<span
94+
:class="isPro ? 'text-violet-500' : 'text-green-500'"
95+
class="ml-1"
96+
>SEO{{ isPro ? " Pro" : "" }}</span>
97+
</span>
98+
</div>
99+
100+
<!-- Title -->
101+
<h1
102+
class="w-full justify-center text-center text-[48px] lg:text-[80px] font-bold m-0 leading-tight max-w-[700px] lg:max-w-[1000px]"
103+
style="display: block; line-clamp: 3; text-overflow: ellipsis; text-wrap: balance;"
104+
>
105+
{{ title }}
106+
</h1>
107+
108+
<!-- Description -->
109+
<p
110+
v-if="description"
111+
class="text-[24px] lg:text-[32px] opacity-70 max-w-[650px] lg:max-w-[900px] leading-relaxed"
112+
style="display: block; line-clamp: 2; text-overflow: ellipsis;"
113+
>
114+
{{ description }}
115+
</p>
116+
</div>
117+
</div>
118+
</template>

app/pages/datenschutz.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ useSeoMeta({
99
title: 'Datenschutzerklärung',
1010
})
1111
12-
defineOgImageComponent('NuxtSeo', {
12+
defineOgImage('NuxtSeoSatori', {
1313
description: 'Datenschutzerklärung',
14-
theme: '#B29712',
1514
title: siteMetadata.title,
1615
})
1716
</script>
@@ -22,7 +21,10 @@ defineOgImageComponent('NuxtSeo', {
2221
<UPage>
2322
<UPageHeader title="Datenschutzerklärung" />
2423
<UPageBody prose>
25-
<ContentRenderer :value="value" />
24+
<ContentRenderer
25+
v-if="value"
26+
:value="value"
27+
/>
2628
</UPageBody>
2729
</UPage>
2830
</UContainer>

app/pages/impressum.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ useSeoMeta({
99
title: 'Impressum',
1010
})
1111
12-
defineOgImageComponent('NuxtSeo', {
12+
defineOgImage('NuxtSeoSatori', {
1313
description: 'Impressum',
14-
theme: '#B29712',
1514
title: siteMetadata.title,
1615
})
1716
</script>
@@ -22,7 +21,10 @@ defineOgImageComponent('NuxtSeo', {
2221
<UPage>
2322
<UPageHeader title="Impressum" />
2423
<UPageBody prose>
25-
<ContentRenderer :value="value" />
24+
<ContentRenderer
25+
v-if="value"
26+
:value="value"
27+
/>
2628
</UPageBody>
2729
</UPage>
2830
</UContainer>

app/pages/index.vue

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ const ctaLinks = ref([
6161
{
6262
icon: 'i-heroicons-envelope',
6363
label: 'Kontaktieren Sie uns',
64-
size: 'xl',
64+
size: 'xl' as const,
6565
target: '_blank',
6666
to: `mailto:${siteMetadata.email}`,
6767
},
6868
{
6969
color: 'neutral' as const,
7070
icon: 'i-simple-icons-instagram',
7171
label: 'Auf Instagram folgen',
72-
size: 'xl',
72+
size: 'xl' as const,
7373
target: '_blank',
7474
to: siteMetadata.instagramUrl,
7575
variant: 'outline' as const,
@@ -109,9 +109,8 @@ useSchemaOrg([
109109
})),
110110
])
111111
112-
defineOgImageComponent('NuxtSeo', {
112+
defineOgImage('NuxtSeoSatori', {
113113
description: 'Die Imkertradition geht in unserer Familie bis in das Jahr 1890 zurück.',
114-
theme: '#B29712',
115114
title: siteMetadata.title,
116115
})
117116
</script>

app/siteMetadata.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ const locations: Array<Location> = [
2626
},
2727
]
2828

29+
const primaryLocation = locations[0]!
30+
2931
const siteMetadata = {
3032
address: {
31-
locality: locations[0].locality,
32-
postalCode: locations[0].postalCode,
33-
region: locations[0].region,
34-
street: locations[0].street,
33+
locality: primaryLocation.locality,
34+
postalCode: primaryLocation.postalCode,
35+
region: primaryLocation.region,
36+
street: primaryLocation.street,
3537
},
3638
description: 'Privatimkerei Hoffmann im Bayerischen Wald. Die Imkerei wird von Renate Hoffmann und ihrem Sohn Michael Hoffmann als Familienbetrieb geführt – an zwei Standorten in Prackenbach und Rattenberg. Die Imkertradition geht in unserer Familie bis in das Jahr 1890 zurück.',
3739
email: 'kontakt@privatimkerei-hoffmann.de',

eslint.config.mjs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,10 @@ export default withNuxt(
1111
quotes: 'single',
1212
semi: false,
1313
},
14-
},
15-
{
16-
name: 'base-rules',
17-
files: ['**/*'],
1814
rules: {
19-
'style/quotes': ['error', 'single', { avoidEscape: true }],
15+
'no-console': ['error', { allow: ['warn', 'error', 'log'] }],
2016
'style/space-before-function-paren': ['error', 'always'],
2117
'ts/array-type': ['error', { default: 'generic' }],
22-
'no-console': ['error', { allow: ['warn', 'error', 'log'] }],
2318
'vue/max-attributes-per-line': [
2419
'error',
2520
{
@@ -37,14 +32,14 @@ export default withNuxt(
3732
name: 'sorting',
3833
files: ['**/*.{ts,js,vue}'],
3934
rules: {
40-
'import/order': 'off', // disable import/order because perfectionist/sort-imports is used
35+
'import/order': 'off',
4136
'perfectionist/sort-array-includes': 'error',
4237
'perfectionist/sort-exports': 'error',
4338
'perfectionist/sort-imports': [
4439
'error',
4540
{
4641
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
47-
newlinesBetween: 'always',
42+
newlinesBetween: 1,
4843
},
4944
],
5045
'perfectionist/sort-interfaces': 'error',
@@ -63,5 +58,4 @@ export default withNuxt(
6358
},
6459
},
6560
),
66-
// ...your other rules
6761
)

nuxt.config.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ export default defineNuxtConfig({
4343
'@nuxt/eslint',
4444
'@nuxt/fonts',
4545
'@nuxt/image',
46-
'@nuxt/content',
4746
'@nuxtjs/seo',
47+
'@nuxt/content',
4848
'nuxt-umami',
4949
],
5050

@@ -63,17 +63,16 @@ export default defineNuxtConfig({
6363

6464
schemaOrg: {
6565
identity: defineLocalBusiness({
66-
'@type': 'LocalBusiness',
67-
'address': {
66+
address: {
6867
addressCountry: 'DE',
6968
addressLocality: siteMetadata.address.locality,
7069
addressRegion: siteMetadata.address.region,
7170
postalCode: siteMetadata.address.postalCode,
7271
streetAddress: siteMetadata.address.street,
7372
},
74-
'description': siteMetadata.description,
75-
'email': siteMetadata.email,
76-
'location': siteMetadata.locations.map(location => ({
73+
description: siteMetadata.description,
74+
email: siteMetadata.email,
75+
location: siteMetadata.locations.map(location => ({
7776
'@type': 'Place',
7877
'address': {
7978
'@type': 'PostalAddress',
@@ -85,11 +84,11 @@ export default defineNuxtConfig({
8584
},
8685
'name': location.name,
8786
})),
88-
'logo': `${siteMetadata.twicPicsBaseUrl}/logo.png`,
89-
'name': siteMetadata.title,
90-
'sameAs': [siteMetadata.instagramUrl],
91-
'telephone': siteMetadata.phone,
92-
'url': siteMetadata.url,
87+
logo: `${siteMetadata.twicPicsBaseUrl}/logo.png`,
88+
name: siteMetadata.title,
89+
sameAs: [siteMetadata.instagramUrl],
90+
telephone: siteMetadata.phone,
91+
url: siteMetadata.url,
9392
}),
9493
},
9594

package.json

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,25 @@
2020
},
2121
"dependencies": {
2222
"@iconify-json/heroicons": "^1.2.3",
23-
"@iconify-json/simple-icons": "^1.2.55",
24-
"@nuxt/content": "^3.7.1",
25-
"@nuxt/fonts": "^0.11.4",
26-
"@nuxt/image": "^1.11.0",
27-
"@nuxt/ui": "^4.1.0",
28-
"@nuxtjs/seo": "3.2.2",
29-
"better-sqlite3": "^12.4.1",
30-
"nuxt": "4.1.2",
23+
"@iconify-json/simple-icons": "^1.2.89",
24+
"@nuxt/content": "^3.15.0",
25+
"@nuxt/fonts": "^0.14.0",
26+
"@nuxt/image": "^2.0.0",
27+
"@nuxt/ui": "^4.9.0",
28+
"@nuxtjs/seo": "5.3.2",
29+
"@resvg/resvg-js": "^2.6.2",
30+
"better-sqlite3": "^12.11.1",
31+
"nuxt": "4.4.8",
3132
"nuxt-umami": "^3.2.1",
32-
"tailwindcss": "^4.1.16",
33-
"zod": "^4.1.12",
34-
"zod-to-json-schema": "^3.24.6"
33+
"satori": "^0.26.0",
34+
"tailwindcss": "^4.3.2",
35+
"zod": "^4.4.3",
36+
"zod-to-json-schema": "^3.25.2"
3537
},
3638
"devDependencies": {
37-
"@antfu/eslint-config": "^6.0.0",
38-
"@nuxt/eslint": "^1.9.0",
39-
"eslint": "^9.38.0",
40-
"vue-tsc": "^3.1.2"
39+
"@antfu/eslint-config": "^9.1.0",
40+
"@nuxt/eslint": "^1.16.0",
41+
"eslint": "^10.6.0",
42+
"vue-tsc": "^3.3.6"
4143
}
4244
}

0 commit comments

Comments
 (0)