@dargmuesli/nuxt-vio 2.0.1 → 3.0.0-beta.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/app.config.ts +78 -34
- package/components/{VioApp.vue → _/VioApp.vue} +23 -5
- package/components/button/VioButtonColored.vue +52 -0
- package/components/card/VioCard.vue +19 -0
- package/components/card/state/VioCardState.vue +20 -0
- package/components/card/state/VioCardStateAlert.vue +14 -0
- package/components/form/VioForm.vue +84 -0
- package/components/form/VioFormCheckbox.vue +27 -0
- package/components/form/input/VioFormInput.vue +192 -0
- package/components/form/input/VioFormInputIconWrapper.vue +7 -0
- package/components/form/input/VioFormInputUrl.vue +54 -0
- package/components/form/input/state/VioFormInputState.vue +5 -0
- package/components/form/input/state/VioFormInputStateError.vue +32 -0
- package/components/form/input/state/VioFormInputStateInfo.vue +32 -0
- package/components/icon/IconArrowRight.vue +31 -0
- package/components/icon/IconCalendar.vue +31 -0
- package/components/icon/IconChatOutline.vue +27 -0
- package/components/icon/IconChatSolid.vue +26 -0
- package/components/icon/IconCheckCircle.vue +29 -0
- package/components/icon/IconContainer.vue +15 -0
- package/components/icon/IconDownload.vue +31 -0
- package/components/icon/IconExclamationCircle.vue +29 -0
- package/components/icon/IconHome.vue +31 -0
- package/components/icon/IconHourglass.vue +32 -0
- package/components/icon/IconLightbulb.vue +27 -0
- package/components/icon/IconLogo.vue +17 -0
- package/components/icon/IconMixcloud.vue +23 -0
- package/components/icon/IconMusic.vue +27 -0
- package/components/icon/IconPlay.vue +25 -0
- package/components/icon/IconShare.vue +27 -0
- package/components/layout/VioLayoutBreadcrumbs.vue +83 -0
- package/components/layout/VioLayoutFooter.vue +40 -0
- package/components/layout/VioLayoutFooterCategory.vue +17 -0
- package/components/layout/VioLayoutHeader.vue +98 -0
- package/components/layout/VioLayoutSpanList.vue +20 -0
- package/components/loader/indicator/VioLoaderIndicator.vue +14 -0
- package/components/loader/indicator/VioLoaderIndicatorPing.vue +12 -0
- package/components/loader/indicator/VioLoaderIndicatorSpinner.vue +24 -0
- package/components/{VioLegalNotice.vue → page/VioPageLegalNotice.vue} +1 -1
- package/components/{VioPrivacyPolicy.vue → page/VioPagePrivacyPolicy.vue} +1 -1
- package/composables/useAppLayout.ts +2 -2
- package/composables/useDateTime.ts +17 -0
- package/composables/useFavicons.ts +2 -2
- package/composables/useFireError.ts +17 -0
- package/composables/useGetServiceHref.ts +47 -0
- package/composables/useHeadDefault.ts +34 -0
- package/composables/useHeadLayout.ts +67 -0
- package/composables/useStrapiFetch.ts +10 -0
- package/error.vue +3 -2
- package/locales/de.json +7 -1
- package/locales/en.json +7 -1
- package/nuxt.config.ts +38 -2
- package/package.json +24 -10
- package/pages/legal-notice.vue +1 -1
- package/pages/privacy-policy.vue +1 -1
- package/plugins/dayjs.ts +46 -0
- package/plugins/i18n.ts +5 -0
- package/plugins/marked.ts +9 -0
- package/server/middleware/headers.ts +41 -10
- package/tailwind.config.ts +131 -8
- package/utils/constants.ts +9 -1
- package/utils/form.ts +19 -0
- package/utils/networking.ts +82 -0
- package/utils/text.ts +20 -0
- /package/components/{VioError.vue → _/VioError.vue} +0 -0
- /package/components/{VioLink.vue → _/VioLink.vue} +0 -0
- /package/components/{VioButton.vue → button/VioButton.vue} +0 -0
- /package/components/{VioLayout.vue → layout/VioLayout.vue} +0 -0
- /package/components/{VioHr.vue → layout/VioLayoutHr.vue} +0 -0
@@ -0,0 +1,98 @@
|
|
1
|
+
<template>
|
2
|
+
<header class="flex items-center justify-between gap-4 mb-8">
|
3
|
+
<VioButton :aria-label="t('creal')" :to="localePath('/')">
|
4
|
+
<span class="text-lg font-bold">{{ t('creal') }}</span>
|
5
|
+
<template #prefix>
|
6
|
+
<IconLogo class="h-10 w-10" />
|
7
|
+
</template>
|
8
|
+
</VioButton>
|
9
|
+
<VioLink
|
10
|
+
v-if="eventsCurrentCount"
|
11
|
+
class="flex items-center gap-2 rounded-full border px-4 py-2 font-bold focus:rounded-full sm:px-4"
|
12
|
+
:is-colored="false"
|
13
|
+
:to="localePath('/events')"
|
14
|
+
>
|
15
|
+
<VioLayoutLivePulse />
|
16
|
+
<span class="hidden whitespace-nowrap sm:inline">
|
17
|
+
{{ t('live') }}
|
18
|
+
</span>
|
19
|
+
</VioLink>
|
20
|
+
<VioLink
|
21
|
+
v-else-if="eventsFutureCount"
|
22
|
+
class="flex items-center gap-2 rounded-full border px-2 py-2 font-bold focus:rounded-full sm:px-4"
|
23
|
+
:is-colored="false"
|
24
|
+
:to="localePath('/events')"
|
25
|
+
>
|
26
|
+
<VioLayoutLivePulse />
|
27
|
+
<span class="hidden whitespace-nowrap sm:inline">
|
28
|
+
{{ t('eventsFuture') }}
|
29
|
+
</span>
|
30
|
+
</VioLink>
|
31
|
+
<VioButton
|
32
|
+
:aria-label="t('bookCreal')"
|
33
|
+
class="basis-0 text-lg font-bold"
|
34
|
+
:is-colored="false"
|
35
|
+
:to="`mailto:e-mail+creal@jonas-thelemann.de?subject=${encodeURIComponent(
|
36
|
+
t('bookingSubject'),
|
37
|
+
)}`"
|
38
|
+
>
|
39
|
+
<span class="basis-0 whitespace-nowrap">{{ t('bookCreal') }}</span>
|
40
|
+
<template #suffix>
|
41
|
+
<IconArrowRight />
|
42
|
+
</template>
|
43
|
+
</VioButton>
|
44
|
+
</header>
|
45
|
+
</template>
|
46
|
+
|
47
|
+
<script setup lang="ts">
|
48
|
+
const { $dayjs } = useNuxtApp()
|
49
|
+
const { t } = useI18n()
|
50
|
+
const localePath = useLocalePath()
|
51
|
+
const strapiFetch = useStrapiFetch()
|
52
|
+
|
53
|
+
// async data
|
54
|
+
let eventsCurrentCount = 0
|
55
|
+
let eventsFutureCount = 0
|
56
|
+
|
57
|
+
// methods
|
58
|
+
const init = async () => {
|
59
|
+
eventsCurrentCount = (
|
60
|
+
(await strapiFetch('/events', {
|
61
|
+
query: {
|
62
|
+
'filters[$and][0][dateStart][$lte]': $dayjs().toISOString(),
|
63
|
+
'filters[$and][1][$or][0][dateEnd][$gt]': $dayjs().toISOString(),
|
64
|
+
'filters[$and][1][$or][1][dateStart][$gte]': $dayjs()
|
65
|
+
.startOf('day')
|
66
|
+
.toISOString(),
|
67
|
+
},
|
68
|
+
})) as any
|
69
|
+
).meta.pagination.total
|
70
|
+
eventsFutureCount = (
|
71
|
+
(await strapiFetch('/events', {
|
72
|
+
query: {
|
73
|
+
'filters[dateStart][$gt]': $dayjs().toISOString(),
|
74
|
+
},
|
75
|
+
})) as any
|
76
|
+
).meta.pagination.total
|
77
|
+
}
|
78
|
+
|
79
|
+
// initialization
|
80
|
+
try {
|
81
|
+
await init()
|
82
|
+
} catch (error: any) {}
|
83
|
+
</script>
|
84
|
+
|
85
|
+
<i18n lang="yaml">
|
86
|
+
en:
|
87
|
+
bookCreal: Book cReal
|
88
|
+
bookingSubject: Booking Request
|
89
|
+
creal: cReal
|
90
|
+
eventsFuture: Upcoming events
|
91
|
+
live: Live
|
92
|
+
de:
|
93
|
+
bookCreal: cReal buchen
|
94
|
+
bookingSubject: Buchungsanfrage
|
95
|
+
creal: cReal
|
96
|
+
eventsFuture: Kommende Veranstaltungen
|
97
|
+
live: Live
|
98
|
+
</i18n>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<template>
|
2
|
+
<span v-if="span instanceof String">
|
3
|
+
{{ span }}
|
4
|
+
</span>
|
5
|
+
<span v-else-if="Array.isArray(span) && span.length === 1">
|
6
|
+
{{ span[0] }}
|
7
|
+
</span>
|
8
|
+
<ol v-else-if="Array.isArray(span)" class="list-decimal">
|
9
|
+
<li v-for="spanItem in span" :key="spanItem.toString()">
|
10
|
+
{{ spanItem }}
|
11
|
+
</li>
|
12
|
+
</ol>
|
13
|
+
</template>
|
14
|
+
|
15
|
+
<script setup lang="ts">
|
16
|
+
export interface Props {
|
17
|
+
span: Array<string | Array<string>>
|
18
|
+
}
|
19
|
+
withDefaults(defineProps<Props>(), {})
|
20
|
+
</script>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<template>
|
2
|
+
<div
|
3
|
+
class="flex h-full items-center justify-center"
|
4
|
+
:title="t('globalLoading')"
|
5
|
+
>
|
6
|
+
<div class="flex items-center justify-center w-1/2">
|
7
|
+
<slot />
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
</template>
|
11
|
+
|
12
|
+
<script setup lang="ts">
|
13
|
+
const { t } = useI18n()
|
14
|
+
</script>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<template>
|
2
|
+
<VioLoaderIndicator>
|
3
|
+
<svg
|
4
|
+
class="animate-spin text-black dark:text-white"
|
5
|
+
xmlns="http://www.w3.org/2000/svg"
|
6
|
+
fill="none"
|
7
|
+
viewBox="0 0 24 24"
|
8
|
+
>
|
9
|
+
<circle
|
10
|
+
class="opacity-25"
|
11
|
+
cx="12"
|
12
|
+
cy="12"
|
13
|
+
r="10"
|
14
|
+
stroke="currentColor"
|
15
|
+
stroke-width="4"
|
16
|
+
/>
|
17
|
+
<path
|
18
|
+
class="opacity-75"
|
19
|
+
fill="currentColor"
|
20
|
+
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
|
21
|
+
/>
|
22
|
+
</svg>
|
23
|
+
</VioLoaderIndicator>
|
24
|
+
</template>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
export const useAppLayout = () => {
|
2
2
|
const appConfig = useAppConfig()
|
3
3
|
|
4
|
-
|
4
|
+
useServerHeadSafe({
|
5
5
|
...useLocaleHead({ addSeoAttributes: true }).value,
|
6
6
|
bodyAttrs: {
|
7
7
|
class:
|
@@ -24,6 +24,6 @@ export const useAppLayout = () => {
|
|
24
24
|
})
|
25
25
|
|
26
26
|
if (appConfig.seoMeta) {
|
27
|
-
|
27
|
+
useServerSeoMeta(appConfig.seoMeta)
|
28
28
|
}
|
29
29
|
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { Dayjs } from 'dayjs'
|
2
|
+
|
3
|
+
export const useDateTime = () => {
|
4
|
+
const event = useRequestEvent()
|
5
|
+
const { $dayjs } = useNuxtApp()
|
6
|
+
const timezoneCookie = useCookie(TIMEZONE_COOKIE_NAME)
|
7
|
+
|
8
|
+
const timezoneHeader = event?.node.req.headers[TIMEZONE_HEADER_KEY]
|
9
|
+
const timezone =
|
10
|
+
timezoneHeader && !Array.isArray(timezoneHeader)
|
11
|
+
? timezoneHeader
|
12
|
+
: timezoneCookie.value || undefined
|
13
|
+
|
14
|
+
return (dateTime?: string | number | Dayjs | Date | null) =>
|
15
|
+
// @ts-ignore `tz` should be part of `$dayjs` (https://github.com/iamkun/dayjs/issues/2106)
|
16
|
+
$dayjs(dateTime).tz(timezone)
|
17
|
+
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
export const useFavicons = () => {
|
2
2
|
const appConfig = useAppConfig()
|
3
3
|
|
4
|
-
|
4
|
+
useServerHeadSafe({
|
5
5
|
link: [
|
6
6
|
{
|
7
7
|
href: '/assets/static/favicon/apple-touch-icon.png?v=bOXMwoKlJr',
|
@@ -30,7 +30,7 @@ export const useFavicons = () => {
|
|
30
30
|
rel: 'manifest',
|
31
31
|
},
|
32
32
|
{
|
33
|
-
color: appConfig.themeColor,
|
33
|
+
color: appConfig.vio.themeColor,
|
34
34
|
href: '/assets/static/favicon/safari-pinned-tab.svg?v=bOXMwoKlJr',
|
35
35
|
rel: 'mask-icon',
|
36
36
|
},
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { consola } from 'consola'
|
2
|
+
import Swal from 'sweetalert2'
|
3
|
+
import { Ref } from 'vue'
|
4
|
+
|
5
|
+
export const useFireError = () => {
|
6
|
+
const { t } = useI18n()
|
7
|
+
|
8
|
+
return ({ error }: { error: Error }, api?: Ref<any>) => {
|
9
|
+
Swal.fire({
|
10
|
+
icon: 'error',
|
11
|
+
title: t('globalStatusError'),
|
12
|
+
text: error.message,
|
13
|
+
})
|
14
|
+
api?.value.errors.push(error)
|
15
|
+
consola.error(error)
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
export const useGetServiceHref = () => {
|
2
|
+
const host = useHost()
|
3
|
+
const config = useRuntimeConfig()
|
4
|
+
|
5
|
+
return ({
|
6
|
+
isSsr = true,
|
7
|
+
name,
|
8
|
+
port,
|
9
|
+
}: {
|
10
|
+
isSsr?: boolean
|
11
|
+
name?: string
|
12
|
+
port?: number
|
13
|
+
}) =>
|
14
|
+
getServiceHref({
|
15
|
+
host,
|
16
|
+
isSsr,
|
17
|
+
name,
|
18
|
+
port,
|
19
|
+
stagingHost: config.public.stagingHost,
|
20
|
+
})
|
21
|
+
}
|
22
|
+
|
23
|
+
export const getServiceHref = ({
|
24
|
+
host,
|
25
|
+
isSsr = true,
|
26
|
+
name,
|
27
|
+
port,
|
28
|
+
stagingHost,
|
29
|
+
}: {
|
30
|
+
host: string
|
31
|
+
isSsr?: boolean
|
32
|
+
name?: string
|
33
|
+
port?: number
|
34
|
+
stagingHost?: string
|
35
|
+
}) => {
|
36
|
+
const nameSubdomain = name?.replaceAll('_', '-')
|
37
|
+
const nameSubdomainString = nameSubdomain ? `${nameSubdomain}.` : ''
|
38
|
+
const portString = port ? `:${port}` : ''
|
39
|
+
|
40
|
+
if (stagingHost) {
|
41
|
+
return `https://${nameSubdomainString}${stagingHost}`
|
42
|
+
} else if (isSsr && process.server) {
|
43
|
+
return `http://${name}${portString}`
|
44
|
+
} else {
|
45
|
+
return `https://${nameSubdomainString}${getDomainTldPort(host)}`
|
46
|
+
}
|
47
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import { defu } from 'defu'
|
2
|
+
import type { UseHeadSafeInput } from '@unhead/vue'
|
3
|
+
import type { ComputedRef } from 'vue'
|
4
|
+
|
5
|
+
export const useHeadDefault = (
|
6
|
+
title: string | ComputedRef<string>,
|
7
|
+
extension?: UseHeadSafeInput,
|
8
|
+
) => {
|
9
|
+
const host = useHost()
|
10
|
+
const router = useRouter()
|
11
|
+
|
12
|
+
const defaults: UseHeadSafeInput = {
|
13
|
+
meta: [
|
14
|
+
{
|
15
|
+
id: 'og:title',
|
16
|
+
property: 'og:title',
|
17
|
+
content: title,
|
18
|
+
},
|
19
|
+
{
|
20
|
+
id: 'og:url',
|
21
|
+
property: 'og:url',
|
22
|
+
content: `https://${host}${router.currentRoute.value.fullPath}`,
|
23
|
+
},
|
24
|
+
{
|
25
|
+
id: 'twitter:title',
|
26
|
+
property: 'twitter:title',
|
27
|
+
content: title,
|
28
|
+
},
|
29
|
+
],
|
30
|
+
title,
|
31
|
+
}
|
32
|
+
|
33
|
+
return useServerHeadSafe(defu(extension, defaults))
|
34
|
+
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
export const useHeadLayout = () => {
|
2
|
+
const head = useLocaleHead({ addSeoAttributes: true })
|
3
|
+
|
4
|
+
useServerHeadSafe(head.value)
|
5
|
+
useServerHeadSafe({
|
6
|
+
bodyAttrs: {
|
7
|
+
class:
|
8
|
+
'bg-background-bright dark:bg-background-dark font-sans text-text-dark dark:text-text-bright',
|
9
|
+
},
|
10
|
+
// link: [
|
11
|
+
// {
|
12
|
+
// href: '/assets/static/favicon/apple-touch-icon.png?v=eEYRGn5b9R',
|
13
|
+
// rel: 'apple-touch-icon',
|
14
|
+
// sizes: '180x180',
|
15
|
+
// },
|
16
|
+
// {
|
17
|
+
// href: '/assets/static/favicon/favicon-16x16.png?v=eEYRGn5b9R',
|
18
|
+
// rel: 'icon',
|
19
|
+
// sizes: '16x16',
|
20
|
+
// type: 'image/png',
|
21
|
+
// },
|
22
|
+
// {
|
23
|
+
// href: '/assets/static/favicon/favicon-32x32.png?v=eEYRGn5b9R',
|
24
|
+
// rel: 'icon',
|
25
|
+
// sizes: '32x32',
|
26
|
+
// type: 'image/png',
|
27
|
+
// },
|
28
|
+
// {
|
29
|
+
// href: '/favicon.ico?v=eEYRGn5b9R',
|
30
|
+
// rel: 'icon',
|
31
|
+
// type: 'image/x-icon',
|
32
|
+
// },
|
33
|
+
// {
|
34
|
+
// href: '/assets/static/favicon/site.webmanifest?v=eEYRGn5b9R',
|
35
|
+
// rel: 'manifest',
|
36
|
+
// },
|
37
|
+
// {
|
38
|
+
// color: '#202020',
|
39
|
+
// href: '/assets/static/favicon/safari-pinned-tab.svg?v=eEYRGn5b9R',
|
40
|
+
// rel: 'mask-icon',
|
41
|
+
// },
|
42
|
+
// {
|
43
|
+
// href: '/favicon.ico?v=eEYRGn5b9R',
|
44
|
+
// rel: 'shortcut icon',
|
45
|
+
// },
|
46
|
+
// ],
|
47
|
+
// meta: [
|
48
|
+
// {
|
49
|
+
// content: '/assets/static/favicon/browserconfig.xml?v=eEYRGn5b9R',
|
50
|
+
// name: 'msapplication-config',
|
51
|
+
// },
|
52
|
+
// {
|
53
|
+
// content: '#202020',
|
54
|
+
// name: 'msapplication-TileColor',
|
55
|
+
// },
|
56
|
+
// {
|
57
|
+
// content: '#202020',
|
58
|
+
// name: 'theme-color',
|
59
|
+
// },
|
60
|
+
// ],
|
61
|
+
// titleTemplate: (titleChunk?: string) => {
|
62
|
+
// return titleChunk && titleChunk !== title
|
63
|
+
// ? `${titleChunk} · ${title}`
|
64
|
+
// : title
|
65
|
+
// },
|
66
|
+
})
|
67
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { ofetch } from 'ofetch'
|
2
|
+
|
3
|
+
export const useStrapiFetch = () => {
|
4
|
+
const getServiceHref = useGetServiceHref()
|
5
|
+
|
6
|
+
// TODO: switch back to $fetch (https://github.com/unjs/nitro/issues/470)
|
7
|
+
return ofetch.create({
|
8
|
+
baseURL: getServiceHref({ name: 'creal_strapi', port: 1337 }) + '/api',
|
9
|
+
})
|
10
|
+
}
|
package/error.vue
CHANGED
@@ -16,8 +16,9 @@ export interface Props {
|
|
16
16
|
error: NuxtError
|
17
17
|
}
|
18
18
|
const props = withDefaults(defineProps<Props>(), {})
|
19
|
+
const errorProp = toRef(() => props.error)
|
19
20
|
|
20
|
-
|
21
|
-
title: `${
|
21
|
+
useServerHeadSafe({
|
22
|
+
title: `${errorProp.value.statusCode} - ${errorProp.value.message}`,
|
22
23
|
})
|
23
24
|
</script>
|
package/locales/de.json
CHANGED
@@ -1,3 +1,9 @@
|
|
1
1
|
{
|
2
|
-
"globalLoading": "Lade..."
|
2
|
+
"globalLoading": "Lade...",
|
3
|
+
"globalPlaceholderUrl": "https://websei.te",
|
4
|
+
"globalStatusError": "Fehler",
|
5
|
+
"globalValidationFailed": "Bitte überprüfe deine Eingaben 🙈",
|
6
|
+
"globalValidationFormatUrlHttps": "Muss mit \"https://\" beginnen",
|
7
|
+
"globalValidationLength": "Zu lang",
|
8
|
+
"globalValidationRequired": "Pflichtfeld"
|
3
9
|
}
|
package/locales/en.json
CHANGED
@@ -1,3 +1,9 @@
|
|
1
1
|
{
|
2
|
-
"globalLoading": "Loading..."
|
2
|
+
"globalLoading": "Loading...",
|
3
|
+
"globalPlaceholderUrl": "https://websi.te",
|
4
|
+
"globalStatusError": "Error",
|
5
|
+
"globalValidationFailed": "Please check your input 🙈",
|
6
|
+
"globalValidationFormatUrlHttps": "Must start with \"https://\"",
|
7
|
+
"globalValidationLength": "Too long",
|
8
|
+
"globalValidationRequired": "Required"
|
3
9
|
}
|
package/nuxt.config.ts
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
import { dirname, join } from 'node:path'
|
2
2
|
import { fileURLToPath } from 'node:url'
|
3
3
|
|
4
|
-
import {
|
4
|
+
import {
|
5
|
+
I18N_COOKIE_NAME,
|
6
|
+
I18N_MODULE_CONFIG,
|
7
|
+
TIMEZONE_COOKIE_NAME,
|
8
|
+
SITE_NAME,
|
9
|
+
} from './utils/constants'
|
5
10
|
|
6
11
|
const currentDir = dirname(fileURLToPath(import.meta.url))
|
7
12
|
|
@@ -27,12 +32,17 @@ export default defineNuxtConfig({
|
|
27
32
|
titleTemplate: `%s`,
|
28
33
|
title: SITE_NAME, // fallback data to prevent invalid html at generation
|
29
34
|
},
|
35
|
+
pageTransition: {
|
36
|
+
name: 'layout',
|
37
|
+
},
|
30
38
|
},
|
31
39
|
modules: [
|
32
40
|
'@dargmuesli/nuxt-cookie-control',
|
41
|
+
'@nuxtjs/color-mode',
|
33
42
|
'@nuxtjs/html-validator',
|
34
43
|
'@nuxtjs/i18n',
|
35
44
|
'@nuxtjs/tailwindcss',
|
45
|
+
'@pinia/nuxt',
|
36
46
|
'nuxt-seo-kit-module',
|
37
47
|
],
|
38
48
|
nitro: {
|
@@ -46,14 +56,27 @@ export default defineNuxtConfig({
|
|
46
56
|
},
|
47
57
|
isInProduction: process.env.NODE_ENV === 'production',
|
48
58
|
isTesting: false,
|
59
|
+
stagingHost:
|
60
|
+
process.env.NODE_ENV !== 'production' &&
|
61
|
+
!process.env.NUXT_PUBLIC_STACK_DOMAIN
|
62
|
+
? 'jonas-thelemann.de'
|
63
|
+
: undefined,
|
49
64
|
},
|
50
65
|
},
|
51
66
|
typescript: {
|
52
67
|
shim: false,
|
53
68
|
strict: true,
|
69
|
+
// tsConfig: {
|
70
|
+
// compilerOptions: {
|
71
|
+
// esModuleInterop: true,
|
72
|
+
// },
|
73
|
+
// },
|
54
74
|
},
|
55
75
|
|
56
76
|
// modules
|
77
|
+
colorMode: {
|
78
|
+
classSuffix: '',
|
79
|
+
},
|
57
80
|
cookieControl: {
|
58
81
|
cookies: {
|
59
82
|
necessary: [
|
@@ -79,7 +102,19 @@ export default defineNuxtConfig({
|
|
79
102
|
de: 'Sprache',
|
80
103
|
en: 'Language',
|
81
104
|
},
|
82
|
-
targetCookieIds: [
|
105
|
+
targetCookieIds: [I18N_COOKIE_NAME],
|
106
|
+
},
|
107
|
+
{
|
108
|
+
description: {
|
109
|
+
de: 'Dieser Cookie von uns speichert die Zeitzone, in der sich das Gerät zu befinden scheint.',
|
110
|
+
en: 'This cookie of ours saves the timezone in which the device appears to be located.',
|
111
|
+
},
|
112
|
+
id: 't',
|
113
|
+
name: {
|
114
|
+
de: 'Zeitzone',
|
115
|
+
en: 'Timezone',
|
116
|
+
},
|
117
|
+
targetCookieIds: [TIMEZONE_COOKIE_NAME],
|
83
118
|
},
|
84
119
|
],
|
85
120
|
optional: [
|
@@ -108,6 +143,7 @@ export default defineNuxtConfig({
|
|
108
143
|
...I18N_MODULE_CONFIG,
|
109
144
|
defaultLocale: 'en', // Must be set for the default prefix_except_default prefix strategy.
|
110
145
|
detectBrowserLanguage: {
|
146
|
+
cookieKey: I18N_COOKIE_NAME,
|
111
147
|
cookieSecure: true,
|
112
148
|
},
|
113
149
|
},
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@dargmuesli/nuxt-vio",
|
3
|
-
"version": "
|
3
|
+
"version": "3.0.0-beta.1",
|
4
4
|
"type": "module",
|
5
5
|
"publishConfig": {
|
6
6
|
"access": "public"
|
@@ -8,7 +8,7 @@
|
|
8
8
|
"engines": {
|
9
9
|
"node": "20"
|
10
10
|
},
|
11
|
-
"packageManager": "pnpm@8.6.
|
11
|
+
"packageManager": "pnpm@8.6.12",
|
12
12
|
"files": [
|
13
13
|
"assets",
|
14
14
|
"components",
|
@@ -43,11 +43,26 @@
|
|
43
43
|
"@dargmuesli/nuxt-cookie-control": "6.1.5",
|
44
44
|
"@dargmuesli/nuxt-vio": "link:",
|
45
45
|
"@http-util/status-i18n": "0.7.0",
|
46
|
+
"@nuxtjs/color-mode": "3.3.0",
|
46
47
|
"@nuxtjs/html-validator": "1.5.2",
|
47
|
-
"@nuxtjs/i18n": "8.0.0-rc.
|
48
|
+
"@nuxtjs/i18n": "8.0.0-rc.2",
|
48
49
|
"@nuxtjs/tailwindcss": "6.8.0",
|
50
|
+
"@pinia/nuxt": "0.4.11",
|
51
|
+
"@tailwindcss/forms": "0.5.4",
|
52
|
+
"@tailwindcss/line-clamp": "0.4.4",
|
49
53
|
"@tailwindcss/typography": "0.5.9",
|
54
|
+
"@urql/core": "4.1.1",
|
55
|
+
"@urql/devtools": "2.0.3",
|
56
|
+
"@urql/exchange-graphcache": "6.3.1",
|
57
|
+
"@urql/vue": "1.1.2",
|
58
|
+
"@vuelidate/core": "2.0.3",
|
59
|
+
"clipboard": "2.0.11",
|
60
|
+
"dayjs": "1.11.9",
|
61
|
+
"is-https": "4.0.0",
|
62
|
+
"jose": "4.14.4",
|
63
|
+
"marked": "7.0.0",
|
50
64
|
"nuxt-seo-kit-module": "2.0.0-beta.9",
|
65
|
+
"pinia": "2.1.6",
|
51
66
|
"sweetalert2": "11.7.20",
|
52
67
|
"vue-gtag": "2.0.1"
|
53
68
|
},
|
@@ -56,25 +71,24 @@
|
|
56
71
|
"@commitlint/config-conventional": "17.6.7",
|
57
72
|
"@intlify/eslint-plugin-vue-i18n": "3.0.0-next.3",
|
58
73
|
"@nuxtjs/eslint-config-typescript": "12.0.0",
|
74
|
+
"@types/marked": "5.0.1",
|
59
75
|
"eslint": "8.46.0",
|
60
|
-
"eslint-config-prettier": "
|
76
|
+
"eslint-config-prettier": "9.0.0",
|
77
|
+
"eslint-plugin-compat": "4.1.4",
|
61
78
|
"eslint-plugin-nuxt": "4.0.0",
|
62
79
|
"eslint-plugin-prettier": "5.0.0",
|
63
80
|
"eslint-plugin-yml": "1.8.0",
|
64
81
|
"husky": "8.0.3",
|
65
82
|
"lint-staged": "13.2.3",
|
66
83
|
"nuxt": "3.6.5",
|
67
|
-
"prettier": "3.0.
|
84
|
+
"prettier": "3.0.1",
|
68
85
|
"stylelint": "15.10.2",
|
69
86
|
"stylelint-config-recommended-vue": "1.5.0",
|
70
87
|
"stylelint-config-standard": "34.0.0",
|
71
88
|
"stylelint-no-unsupported-browser-features": "7.0.0",
|
89
|
+
"tailwindcss": "3.3.3",
|
72
90
|
"typescript": "5.1.6",
|
91
|
+
"vue": "3.3.4",
|
73
92
|
"vue-tsc": "1.8.8"
|
74
|
-
},
|
75
|
-
"pnpm": {
|
76
|
-
"overrides": {
|
77
|
-
"eslint-plugin-vue": "9.15.1"
|
78
|
-
}
|
79
93
|
}
|
80
94
|
}
|
package/pages/legal-notice.vue
CHANGED
package/pages/privacy-policy.vue
CHANGED