@dargmuesli/nuxt-vio 2.0.0 → 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.
Files changed (69) hide show
  1. package/app.config.ts +61 -12
  2. package/components/{VioApp.vue → _/VioApp.vue} +23 -5
  3. package/components/button/VioButtonColored.vue +52 -0
  4. package/components/card/VioCard.vue +19 -0
  5. package/components/card/state/VioCardState.vue +20 -0
  6. package/components/card/state/VioCardStateAlert.vue +14 -0
  7. package/components/form/VioForm.vue +84 -0
  8. package/components/form/VioFormCheckbox.vue +27 -0
  9. package/components/form/input/VioFormInput.vue +192 -0
  10. package/components/form/input/VioFormInputIconWrapper.vue +7 -0
  11. package/components/form/input/VioFormInputUrl.vue +54 -0
  12. package/components/form/input/state/VioFormInputState.vue +5 -0
  13. package/components/form/input/state/VioFormInputStateError.vue +32 -0
  14. package/components/form/input/state/VioFormInputStateInfo.vue +32 -0
  15. package/components/icon/IconArrowRight.vue +31 -0
  16. package/components/icon/IconCalendar.vue +31 -0
  17. package/components/icon/IconChatOutline.vue +27 -0
  18. package/components/icon/IconChatSolid.vue +26 -0
  19. package/components/icon/IconCheckCircle.vue +29 -0
  20. package/components/icon/IconContainer.vue +15 -0
  21. package/components/icon/IconDownload.vue +31 -0
  22. package/components/icon/IconExclamationCircle.vue +29 -0
  23. package/components/icon/IconHome.vue +31 -0
  24. package/components/icon/IconHourglass.vue +32 -0
  25. package/components/icon/IconLightbulb.vue +27 -0
  26. package/components/icon/IconLogo.vue +17 -0
  27. package/components/icon/IconMixcloud.vue +23 -0
  28. package/components/icon/IconMusic.vue +27 -0
  29. package/components/icon/IconPlay.vue +25 -0
  30. package/components/icon/IconShare.vue +27 -0
  31. package/components/layout/VioLayoutBreadcrumbs.vue +83 -0
  32. package/components/layout/VioLayoutFooter.vue +40 -0
  33. package/components/layout/VioLayoutFooterCategory.vue +17 -0
  34. package/components/layout/VioLayoutHeader.vue +98 -0
  35. package/components/layout/VioLayoutSpanList.vue +20 -0
  36. package/components/loader/indicator/VioLoaderIndicator.vue +14 -0
  37. package/components/loader/indicator/VioLoaderIndicatorPing.vue +12 -0
  38. package/components/loader/indicator/VioLoaderIndicatorSpinner.vue +24 -0
  39. package/components/{VioLegalNotice.vue → page/VioPageLegalNotice.vue} +1 -1
  40. package/components/{VioPrivacyPolicy.vue → page/VioPagePrivacyPolicy.vue} +1 -1
  41. package/composables/useAppLayout.ts +2 -2
  42. package/composables/useDateTime.ts +17 -0
  43. package/composables/useFavicons.ts +2 -2
  44. package/composables/useFireError.ts +17 -0
  45. package/composables/useGetServiceHref.ts +47 -0
  46. package/composables/useHeadDefault.ts +34 -0
  47. package/composables/useHeadLayout.ts +67 -0
  48. package/composables/useStrapiFetch.ts +10 -0
  49. package/error.vue +3 -2
  50. package/locales/de.json +7 -1
  51. package/locales/en.json +7 -1
  52. package/nuxt.config.ts +38 -2
  53. package/package.json +24 -10
  54. package/pages/legal-notice.vue +1 -1
  55. package/pages/privacy-policy.vue +1 -1
  56. package/plugins/dayjs.ts +46 -0
  57. package/plugins/i18n.ts +5 -0
  58. package/plugins/marked.ts +9 -0
  59. package/server/middleware/headers.ts +41 -10
  60. package/tailwind.config.ts +131 -8
  61. package/utils/constants.ts +9 -1
  62. package/utils/form.ts +19 -0
  63. package/utils/networking.ts +82 -0
  64. package/utils/text.ts +20 -0
  65. /package/components/{VioError.vue → _/VioError.vue} +0 -0
  66. /package/components/{VioLink.vue → _/VioLink.vue} +0 -0
  67. /package/components/{VioButton.vue → button/VioButton.vue} +0 -0
  68. /package/components/{VioLayout.vue → layout/VioLayout.vue} +0 -0
  69. /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,12 @@
1
+ <template>
2
+ <VioLoaderIndicator>
3
+ <div
4
+ class="w-1/2 aspect-square animate-ping rounded-full bg-gray-500"
5
+ :title="t('globalLoading')"
6
+ />
7
+ </VioLoaderIndicator>
8
+ </template>
9
+
10
+ <script setup lang="ts">
11
+ const { t } = useI18n()
12
+ </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>
@@ -73,7 +73,7 @@ const { t } = useI18n()
73
73
  const title = t('title')
74
74
 
75
75
  // initialization
76
- useSeoMeta({ title })
76
+ useServerSeoMeta({ title })
77
77
  </script>
78
78
 
79
79
  <i18n lang="yaml">
@@ -502,7 +502,7 @@ const { t } = useI18n()
502
502
  const title = t('title')
503
503
 
504
504
  // initialization
505
- useSeoMeta({ title })
505
+ useServerSeoMeta({ title })
506
506
  </script>
507
507
 
508
508
  <i18n lang="yaml">
@@ -1,7 +1,7 @@
1
1
  export const useAppLayout = () => {
2
2
  const appConfig = useAppConfig()
3
3
 
4
- useHead({
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
- useSeoMeta(appConfig.seoMeta)
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
- useHead({
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
- useHead({
21
- title: `${props.error.statusCode} - ${props.error.message}`,
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 { I18N_MODULE_CONFIG, SITE_NAME } from './utils/constants'
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: ['i18n_redirected'],
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": "2.0.0",
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",
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.1",
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": "8.9.0",
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.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
  }
@@ -1,3 +1,3 @@
1
1
  <template>
2
- <VioLegalNotice />
2
+ <VioPageLegalNotice />
3
3
  </template>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <VioPrivacyPolicy
2
+ <VioPagePrivacyPolicy
3
3
  :is-enabled="{
4
4
  summary: {
5
5
  generalNotes: true,