@dargmuesli/nuxt-vio 3.0.0-beta.2 → 3.0.0-beta.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. package/app.config.ts +32 -33
  2. package/assets/css/tailwind.css +24 -9
  3. package/components/vio/_/VioApp.vue +14 -2
  4. package/components/vio/_/VioError.vue +4 -1
  5. package/components/vio/_/VioLink.vue +7 -5
  6. package/components/vio/form/VioForm.vue +2 -2
  7. package/components/vio/form/input/VioFormInput.vue +5 -5
  8. package/components/vio/form/input/state/VioFormInputStateError.vue +1 -1
  9. package/components/vio/form/input/state/VioFormInputStateInfo.vue +1 -1
  10. package/components/vio/icon/IconArrowRight.vue +2 -2
  11. package/components/vio/icon/IconCalendar.vue +2 -2
  12. package/components/vio/icon/IconCheckCircle.vue +2 -2
  13. package/components/vio/icon/IconDownload.vue +2 -2
  14. package/components/vio/icon/IconExclamationCircle.vue +2 -2
  15. package/components/vio/icon/IconHome.vue +2 -2
  16. package/components/vio/icon/IconHourglass.vue +2 -2
  17. package/components/vio/layout/VioLayoutBreadcrumbs.vue +1 -1
  18. package/components/vio/layout/VioLayoutFooter.vue +3 -3
  19. package/components/vio/layout/VioLayoutFooterCategory.vue +1 -1
  20. package/components/vio/loader/indicator/VioLoaderIndicator.vue +2 -2
  21. package/components/vio/loader/indicator/VioLoaderIndicatorPing.vue +2 -2
  22. package/components/vio/page/VioPageLegalNotice.vue +10 -8
  23. package/components/vio/page/VioPagePrivacyPolicy.vue +19 -12
  24. package/composables/useAppLayout.ts +11 -17
  25. package/composables/useFavicons.ts +3 -31
  26. package/composables/useGetServiceHref.ts +2 -28
  27. package/composables/useHeadDefault.ts +13 -26
  28. package/composables/usePolyfills.ts +23 -0
  29. package/locales/de.json +1 -1
  30. package/locales/en.json +1 -1
  31. package/nuxt.config.ts +152 -147
  32. package/package.json +33 -33
  33. package/plugins/dayjs.ts +6 -6
  34. package/plugins/gtag.client.ts +4 -1
  35. package/server/middleware/headers.ts +1 -1
  36. package/server/tsconfig.json +1 -1
  37. package/server/utils/util.ts +2 -0
  38. package/store/auth.ts +32 -0
  39. package/tailwind.config.ts +3 -3
  40. package/types/api.d.ts +9 -0
  41. package/types/fetch.d.ts +8 -0
  42. package/types/modules/gql.d.ts +6 -0
  43. package/types/modules/graphql.d.ts +6 -0
  44. package/utils/constants.ts +51 -0
  45. package/utils/networking.ts +44 -9
  46. package/utils/routing.ts +4 -2
  47. package/LICENSE +0 -674
  48. package/components/vio/icon/IconLogo.vue +0 -17
  49. package/components/vio/layout/VioLayoutHeader.vue +0 -98
@@ -1,5 +1,6 @@
1
1
  export const useAppLayout = () => {
2
2
  const appConfig = useAppConfig()
3
+ const siteConfig = useSiteConfig()
3
4
 
4
5
  useServerHeadSafe({
5
6
  ...useLocaleHead({ addSeoAttributes: true }).value,
@@ -7,23 +8,16 @@ export const useAppLayout = () => {
7
8
  class:
8
9
  'bg-background-bright dark:bg-background-dark font-sans text-text-dark dark:text-text-bright',
9
10
  },
10
- ...(appConfig.themeColor
11
- ? {
12
- meta: [
13
- {
14
- content: appConfig.themeColor,
15
- name: 'msapplication-TileColor',
16
- },
17
- {
18
- content: appConfig.themeColor,
19
- name: 'theme-color',
20
- },
21
- ],
22
- }
23
- : {}),
24
11
  })
25
12
 
26
- if (appConfig.seoMeta) {
27
- useServerSeoMeta(appConfig.seoMeta)
28
- }
13
+ useServerSeoMeta({
14
+ msapplicationTileColor: appConfig.vio.themeColor,
15
+ themeColor: appConfig.vio.themeColor,
16
+ titleTemplate: (titleChunk) => {
17
+ return titleChunk && titleChunk !== siteConfig.name
18
+ ? `${titleChunk} ${siteConfig.titleSeparator} ${siteConfig.name}`
19
+ : siteConfig.name
20
+ },
21
+ ...(appConfig.vio.seoMeta ? appConfig.vio.seoMeta : {}),
22
+ })
29
23
  }
@@ -4,46 +4,18 @@ export const useFavicons = () => {
4
4
  useServerHeadSafe({
5
5
  link: [
6
6
  {
7
- href: '/assets/static/favicon/apple-touch-icon.png?v=bOXMwoKlJr',
8
- rel: 'apple-touch-icon',
9
- sizes: '180x180',
10
- },
11
- {
12
- href: '/assets/static/favicon/favicon-16x16.png?v=bOXMwoKlJr',
13
- rel: 'icon',
14
- sizes: '16x16',
15
- type: 'image/png',
16
- },
17
- {
18
- href: '/assets/static/favicon/favicon-32x32.png?v=bOXMwoKlJr',
19
- rel: 'icon',
20
- sizes: '32x32',
21
- type: 'image/png',
22
- },
23
- {
24
- href: '/favicon.ico',
25
- rel: 'icon',
26
- type: 'image/x-icon',
27
- },
28
- {
29
- href: '/assets/static/favicon/site.webmanifest?v=bOXMwoKlJr',
7
+ href: `/assets/static/favicon/site.webmanifest?v=${CACHE_VERSION}`,
30
8
  rel: 'manifest',
31
9
  },
32
10
  {
33
11
  color: appConfig.vio.themeColor,
34
- href: '/assets/static/favicon/safari-pinned-tab.svg?v=bOXMwoKlJr',
12
+ href: `/assets/static/favicon/safari-pinned-tab.svg?v=${CACHE_VERSION}`,
35
13
  rel: 'mask-icon',
36
14
  },
37
15
  {
38
- href: '/favicon.ico?v=bOXMwoKlJr',
16
+ href: `/favicon.ico?v=${CACHE_VERSION}`,
39
17
  rel: 'shortcut icon',
40
18
  },
41
19
  ],
42
- meta: [
43
- {
44
- content: '/assets/static/favicon/browserconfig.xml?v=bOXMwoKlJr',
45
- name: 'msapplication-config',
46
- },
47
- ],
48
20
  })
49
21
  }
@@ -1,6 +1,6 @@
1
1
  export const useGetServiceHref = () => {
2
2
  const host = useHost()
3
- const config = useRuntimeConfig()
3
+ const runtimeConfig = useRuntimeConfig()
4
4
 
5
5
  return ({
6
6
  isSsr = true,
@@ -16,32 +16,6 @@ export const useGetServiceHref = () => {
16
16
  isSsr,
17
17
  name,
18
18
  port,
19
- stagingHost: config.public.stagingHost,
19
+ stagingHost: runtimeConfig.public.vio.stagingHost,
20
20
  })
21
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
- }
@@ -1,34 +1,21 @@
1
1
  import { defu } from 'defu'
2
- import type { UseHeadSafeInput } from '@unhead/vue'
3
2
  import type { ComputedRef } from 'vue'
4
3
 
5
- export const useHeadDefault = (
6
- title: string | ComputedRef<string>,
7
- extension?: UseHeadSafeInput,
8
- ) => {
9
- const host = useHost()
10
- const router = useRouter()
4
+ export const useHeadDefault = ({
5
+ extension,
6
+ title,
7
+ }: {
8
+ extension?: Parameters<typeof useServerSeoMeta>[0]
9
+ title: string | ComputedRef<string>
10
+ }) => {
11
+ const attrs = useAttrs()
11
12
 
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
- ],
13
+ const defaults: Parameters<typeof useServerSeoMeta>[0] = {
14
+ msapplicationConfig: `/assets/static/favicon/browserconfig.xml?v=${CACHE_VERSION}`,
30
15
  title,
16
+ twitterDescription: attrs['site-description'] as string,
17
+ twitterTitle: title,
31
18
  }
32
19
 
33
- return useServerHeadSafe(defu(extension, defaults))
20
+ useSeoMeta(defu(extension, defaults)) // TODO: use `useServerSeoMeta` when Nuxt 3.7 is used
34
21
  }
@@ -0,0 +1,23 @@
1
+ export const usePolyfills = () => {
2
+ const polyfills =
3
+ 'https://polyfill.io/v3/polyfill.min.js?features=Promise&flags=gated'
4
+
5
+ useServerHead({
6
+ link: [
7
+ {
8
+ rel: 'preload',
9
+ href: polyfills,
10
+ crossorigin: 'anonymous',
11
+ as: 'script',
12
+ 'data-testid': 'polyfill-preload',
13
+ },
14
+ ],
15
+ script: [
16
+ {
17
+ src: polyfills,
18
+ crossorigin: 'anonymous',
19
+ 'data-testid': 'polyfill-script',
20
+ },
21
+ ],
22
+ })
23
+ }
package/locales/de.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
- "globalLoading": "Lade...",
3
2
  "globalPlaceholderUrl": "https://websei.te",
4
3
  "globalStatusError": "Fehler",
4
+ "globalStatusLoading": "Lade...",
5
5
  "globalValidationFailed": "Bitte überprüfe deine Eingaben 🙈",
6
6
  "globalValidationFormatUrlHttps": "Muss mit \"https://\" beginnen",
7
7
  "globalValidationLength": "Zu lang",
package/locales/en.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
- "globalLoading": "Loading...",
3
2
  "globalPlaceholderUrl": "https://websi.te",
4
3
  "globalStatusError": "Error",
4
+ "globalStatusLoading": "Loading...",
5
5
  "globalValidationFailed": "Please check your input 🙈",
6
6
  "globalValidationFormatUrlHttps": "Must start with \"https://\"",
7
7
  "globalValidationLength": "Too long",
package/nuxt.config.ts CHANGED
@@ -1,167 +1,172 @@
1
1
  import { dirname, join } from 'node:path'
2
2
  import { fileURLToPath } from 'node:url'
3
3
 
4
+ import { defu } from 'defu'
5
+
4
6
  import {
7
+ BASE_URL,
5
8
  I18N_COOKIE_NAME,
6
- I18N_MODULE_CONFIG,
7
- TIMEZONE_COOKIE_NAME,
8
9
  SITE_NAME,
10
+ TIMEZONE_COOKIE_NAME,
11
+ VIO_NUXT_BASE_CONFIG,
9
12
  } from './utils/constants'
10
13
 
11
14
  const currentDir = dirname(fileURLToPath(import.meta.url))
12
15
 
13
- const BASE_URL =
14
- 'https://' +
15
- (process.env.NUXT_PUBLIC_STACK_DOMAIN ||
16
- `${process.env.HOST || 'localhost'}:${
17
- !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
18
- ? '3000'
19
- : '3001'
20
- }`)
21
-
22
16
  // https://v3.nuxtjs.org/api/configuration/nuxt.config
23
- export default defineNuxtConfig({
24
- alias: {
25
- sweetalert2: 'sweetalert2', // TODO: remove (https://github.com/nuxt/nuxt/issues/19426)
26
- },
27
- app: {
28
- head: {
29
- htmlAttrs: {
30
- lang: 'en', // fallback data to prevent invalid html at generation
31
- },
32
- titleTemplate: `%s`,
33
- title: SITE_NAME, // fallback data to prevent invalid html at generation
34
- },
35
- pageTransition: {
36
- name: 'layout',
37
- },
38
- },
39
- modules: [
40
- '@dargmuesli/nuxt-cookie-control',
41
- '@nuxtjs/color-mode',
42
- '@nuxtjs/html-validator',
43
- '@nuxtjs/i18n',
44
- '@nuxtjs/tailwindcss',
45
- '@pinia/nuxt',
46
- 'nuxt-seo-kit-module',
47
- ],
48
- nitro: {
49
- compressPublicAssets: true,
50
- },
51
- runtimeConfig: {
52
- public: {
53
- googleAnalyticsId: '', // set via environment variable `NUXT_PUBLIC_GOOGLE_ANALYTICS_ID` only
54
- i18n: {
55
- baseUrl: BASE_URL,
56
- },
57
- isInProduction: process.env.NODE_ENV === 'production',
58
- isTesting: false,
59
- stagingHost:
60
- process.env.NODE_ENV !== 'production' &&
61
- !process.env.NUXT_PUBLIC_STACK_DOMAIN
62
- ? 'jonas-thelemann.de'
63
- : undefined,
64
- },
65
- },
66
- typescript: {
67
- shim: false,
68
- strict: true,
69
- // tsConfig: {
70
- // compilerOptions: {
71
- // esModuleInterop: true,
72
- // },
73
- // },
74
- },
75
-
76
- // modules
77
- colorMode: {
78
- classSuffix: '',
79
- },
80
- cookieControl: {
81
- cookies: {
82
- necessary: [
83
- {
84
- description: {
85
- de: 'Dieser Cookie von uns speichert die Einstellungen, die in diesem Dialog getroffen werden.',
86
- en: 'This cookie of ours stores the settings made in this dialog.',
87
- },
88
- id: 'c',
89
- name: {
90
- de: 'Cookie-Präferenzen',
91
- en: 'Cookie Preferences',
17
+ export default defineNuxtConfig(
18
+ defu(
19
+ {
20
+ alias: {
21
+ clipboard: 'clipboard',
22
+ dayjs: 'dayjs',
23
+ sweetalert2: 'sweetalert2',
24
+ }, // TODO: remove (https://github.com/nuxt/nuxt/issues/19426)
25
+ app: {
26
+ head: {
27
+ htmlAttrs: {
28
+ lang: 'en', // fallback data to prevent invalid html at generation
92
29
  },
93
- targetCookieIds: ['ncc_c', 'ncc_e'],
30
+ titleTemplate: '%s', // fully set in `composables/useAppLayout.ts`
94
31
  },
95
- {
96
- description: {
97
- de: 'Dieser Cookie von uns speichert die Sprache, in der diese Webseite angezeigt wird.',
98
- en: "This cookie of ours stores the language that's used to display this website.",
99
- },
100
- id: 'l',
101
- name: {
102
- de: 'Sprache',
103
- en: 'Language',
104
- },
105
- targetCookieIds: [I18N_COOKIE_NAME],
32
+ pageTransition: {
33
+ name: 'layout',
106
34
  },
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],
35
+ },
36
+ devtools: {
37
+ enabled: process.env.NODE_ENV !== 'production',
38
+ timeline: {
39
+ enabled: true,
118
40
  },
41
+ },
42
+ modules: [
43
+ '@dargmuesli/nuxt-cookie-control',
44
+ '@nuxt/image',
45
+ '@nuxtjs/color-mode',
46
+ '@nuxtjs/html-validator',
47
+ '@nuxtjs/i18n',
48
+ '@nuxtjs/tailwindcss',
49
+ '@pinia/nuxt',
50
+ 'nuxt-seo-kit-module',
119
51
  ],
120
- optional: [
121
- {
122
- description: {
123
- de: 'Die Cookies vom Drittanbieter Google ermöglichen die Analyse von Nutzerverhalten. Diese Analyse hilft uns unsere Dienste zu verbessern, indem wir verstehen, wie diese Webseite genutzt wird.',
124
- en: 'The third-party cookies by Google enable the analysis of user behavior. This analysis helps us to improve our services by understanding how this website is used.',
52
+ nitro: {
53
+ compressPublicAssets: true,
54
+ },
55
+ runtimeConfig: {
56
+ public: {
57
+ vio: {
58
+ googleAnalyticsId: '', // set via environment variable `NUXT_PUBLIC_GOOGLE_ANALYTICS_ID` only
59
+ isInProduction: process.env.NODE_ENV === 'production',
60
+ isTesting: false,
125
61
  },
126
- id: 'ga',
127
- links: {
128
- 'https://policies.google.com/privacy': 'Google Privacy Policy',
129
- 'https://policies.google.com/terms': 'Google Terms of Service',
62
+ },
63
+ },
64
+ typescript: {
65
+ shim: false,
66
+ tsConfig: {
67
+ compilerOptions: {
68
+ esModuleInterop: true,
69
+ // moduleResolution: 'bundler',
70
+ // noErrorTruncation: true,
130
71
  },
131
- name: 'Analytics',
132
- targetCookieIds: ['_ga', '_ga_K4R41W62BR'],
133
72
  },
134
- ],
135
- },
136
- locales: ['en', 'de'],
137
- },
138
- htmlValidator: {
139
- // failOnError: true,
140
- logLevel: 'warning',
141
- },
142
- i18n: {
143
- ...I18N_MODULE_CONFIG,
144
- defaultLocale: 'en', // Must be set for the default prefix_except_default prefix strategy.
145
- detectBrowserLanguage: {
146
- cookieKey: I18N_COOKIE_NAME,
147
- cookieSecure: true,
73
+ },
74
+
75
+ // modules
76
+ colorMode: {
77
+ classSuffix: '',
78
+ },
79
+ cookieControl: {
80
+ cookies: {
81
+ necessary: [
82
+ {
83
+ description: {
84
+ de: 'Dieser Cookie von uns speichert die Einstellungen, die in diesem Dialog getroffen werden.',
85
+ en: 'This cookie of ours stores the settings made in this dialog.',
86
+ },
87
+ id: 'c',
88
+ name: {
89
+ de: 'Cookie-Präferenzen',
90
+ en: 'Cookie Preferences',
91
+ },
92
+ targetCookieIds: ['ncc_c', 'ncc_e'],
93
+ },
94
+ {
95
+ description: {
96
+ de: 'Dieser Cookie von uns speichert die Sprache, in der diese Webseite angezeigt wird.',
97
+ en: "This cookie of ours stores the language that's used to display this website.",
98
+ },
99
+ id: 'l',
100
+ name: {
101
+ de: 'Sprache',
102
+ en: 'Language',
103
+ },
104
+ targetCookieIds: [I18N_COOKIE_NAME],
105
+ },
106
+ {
107
+ description: {
108
+ de: 'Dieser Cookie von uns speichert die Zeitzone, in der sich das Gerät zu befinden scheint.',
109
+ en: 'This cookie of ours saves the timezone in which the device appears to be located.',
110
+ },
111
+ id: 't',
112
+ name: {
113
+ de: 'Zeitzone',
114
+ en: 'Timezone',
115
+ },
116
+ targetCookieIds: [TIMEZONE_COOKIE_NAME],
117
+ },
118
+ ],
119
+ optional: [
120
+ {
121
+ description: {
122
+ de: 'Die Cookies vom Drittanbieter Google ermöglichen die Analyse von Nutzerverhalten. Diese Analyse hilft uns unsere Dienste zu verbessern, indem wir verstehen, wie diese Webseite genutzt wird.',
123
+ en: 'The third-party cookies by Google enable the analysis of user behavior. This analysis helps us to improve our services by understanding how this website is used.',
124
+ },
125
+ id: 'ga',
126
+ links: {
127
+ 'https://policies.google.com/privacy': 'Google Privacy Policy',
128
+ 'https://policies.google.com/terms': 'Google Terms of Service',
129
+ },
130
+ name: 'Analytics',
131
+ targetCookieIds: ['_ga', '_ga_K4R41W62BR'],
132
+ },
133
+ ],
134
+ },
135
+ locales: ['en', 'de'],
136
+ },
137
+ htmlValidator: {
138
+ failOnError: false, // TODO: fix invalid html in nuxt html template (https://github.com/nuxt/nuxt/issues/22526)
139
+ logLevel: 'warning',
140
+ },
141
+ i18n: {
142
+ defaultLocale: 'en', // Must be set for the default prefix_except_default prefix strategy.
143
+ detectBrowserLanguage: {
144
+ cookieKey: I18N_COOKIE_NAME,
145
+ cookieSecure: true,
146
+ },
147
+ },
148
+ linkChecker: {
149
+ debug: process.env.NODE_ENV === 'development',
150
+ failOnError: true,
151
+ },
152
+ seoKit: {
153
+ splash: false,
154
+ },
155
+ site: {
156
+ debug: process.env.NODE_ENV === 'development',
157
+ titleSeparator: '·',
158
+ },
159
+ sitemap: {
160
+ exclude: ['/api/pages/**'],
161
+ },
162
+ tailwindcss: {
163
+ cssPath: join(currentDir, './assets/css/tailwind.css'),
164
+ },
148
165
  },
149
- },
150
- linkChecker: {
151
- failOnError: false, // TODO: enable (https://github.com/harlan-zw/nuxt-seo-kit/issues/4#issuecomment-1434522124)
152
- },
153
- seoKit: {
154
- splash: false,
155
- },
156
- site: {
157
- debug: process.env.NODE_ENV === 'development',
158
- name: SITE_NAME,
159
- url: BASE_URL,
160
- },
161
- sitemap: {
162
- exclude: ['/api/**'],
163
- },
164
- tailwindcss: {
165
- cssPath: join(currentDir, './assets/css/tailwind.css'),
166
- },
167
- })
166
+ VIO_NUXT_BASE_CONFIG({
167
+ baseUrl: BASE_URL,
168
+ siteName: SITE_NAME,
169
+ stagingHost: 'localhost:3000',
170
+ }),
171
+ ),
172
+ )
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dargmuesli/nuxt-vio",
3
- "version": "3.0.0-beta.2",
3
+ "version": "3.0.0-beta.20",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -15,9 +15,11 @@
15
15
  "composables",
16
16
  "layouts",
17
17
  "locales",
18
- "server",
19
18
  "pages",
20
19
  "plugins",
20
+ "server",
21
+ "store",
22
+ "types",
21
23
  "utils",
22
24
  "app.config.ts",
23
25
  "error.vue",
@@ -25,69 +27,67 @@
25
27
  "nuxt.config.ts",
26
28
  "tailwind.config.ts"
27
29
  ],
28
- "main": "./nuxt.config.ts",
30
+ "main": "nuxt.config.ts",
29
31
  "scripts": {
30
- "dev": "nuxi dev .playground",
31
- "build": "nuxi build .playground",
32
- "generate": "nuxi generate .playground",
33
- "preview": "nuxi preview .playground",
34
- "prepare": "pnpm husky install && pnpm nuxt prepare .playground",
35
- "lint": "pnpm lint:js && pnpm lint:ts && pnpm lint:style",
32
+ "build": "nuxt build .playground",
33
+ "dev": "nuxt dev .playground",
34
+ "generate": "nuxt generate .playground",
36
35
  "lint:fix": "pnpm lint:js --fix && pnpm lint:ts --fix && pnpm lint:style --fix",
37
36
  "lint:js": "eslint --cache --ext .js,.ts,.vue --ignore-path .gitignore .",
38
- "lint:staged": "pnpm lint-staged",
39
- "lint:style": "stylelint **/*.{vue,css} --ignore-path .gitignore",
40
- "lint:ts": "nuxt typecheck"
37
+ "lint:staged": "lint-staged",
38
+ "lint:style": "stylelint --cache {,**/}*.{vue,css} --ignore-path .gitignore",
39
+ "lint:ts": "nuxt typecheck",
40
+ "lint": "pnpm lint:js && pnpm lint:ts && pnpm lint:style",
41
+ "prepare": "nuxt prepare .playground",
42
+ "preview": "nuxt preview .playground"
41
43
  },
42
44
  "dependencies": {
43
- "@dargmuesli/nuxt-cookie-control": "6.1.5",
44
- "@dargmuesli/nuxt-vio": "link:",
45
- "@http-util/status-i18n": "0.7.0",
45
+ "@dargmuesli/nuxt-cookie-control": "6.4.1",
46
+ "@http-util/status-i18n": "0.8.1",
47
+ "@nuxt/image": "1.0.0-rc.1",
46
48
  "@nuxtjs/color-mode": "3.3.0",
47
49
  "@nuxtjs/html-validator": "1.5.2",
48
- "@nuxtjs/i18n": "8.0.0-rc.2",
50
+ "@nuxtjs/i18n": "8.0.0-rc.3",
49
51
  "@nuxtjs/tailwindcss": "6.8.0",
50
52
  "@pinia/nuxt": "0.4.11",
51
- "@tailwindcss/forms": "0.5.4",
53
+ "@tailwindcss/forms": "0.5.5",
52
54
  "@tailwindcss/typography": "0.5.9",
53
55
  "@urql/core": "4.1.1",
54
56
  "@urql/devtools": "2.0.3",
55
- "@urql/exchange-graphcache": "6.3.1",
57
+ "@urql/exchange-graphcache": "6.3.2",
56
58
  "@urql/vue": "1.1.2",
57
59
  "@vuelidate/core": "2.0.3",
60
+ "@vuelidate/validators": "2.0.3",
58
61
  "clipboard": "2.0.11",
59
- "dayjs": "1.11.9",
62
+ "dayjs": "2.0.0-alpha.4",
60
63
  "is-https": "4.0.0",
61
64
  "jose": "4.14.4",
62
- "marked": "7.0.0",
63
- "nuxt-seo-kit-module": "2.0.0-beta.9",
65
+ "marked": "7.0.4",
66
+ "nuxt-seo-kit-module": "2.0.0-beta.13",
64
67
  "pinia": "2.1.6",
65
- "sweetalert2": "11.7.20",
66
- "vue-gtag": "2.0.1"
68
+ "sweetalert2": "11.7.27",
69
+ "vue-gtag": "2.0.1",
70
+ "vue-tsc": "1.8.8"
67
71
  },
68
72
  "devDependencies": {
69
- "@commitlint/cli": "17.6.7",
70
- "@commitlint/config-conventional": "17.6.7",
71
73
  "@intlify/eslint-plugin-vue-i18n": "3.0.0-next.3",
72
74
  "@nuxtjs/eslint-config-typescript": "12.0.0",
73
75
  "@types/marked": "5.0.1",
74
- "eslint": "8.46.0",
76
+ "eslint": "8.47.0",
75
77
  "eslint-config-prettier": "9.0.0",
76
78
  "eslint-plugin-compat": "4.1.4",
77
79
  "eslint-plugin-nuxt": "4.0.0",
78
80
  "eslint-plugin-prettier": "5.0.0",
79
81
  "eslint-plugin-yml": "1.8.0",
80
- "husky": "8.0.3",
81
- "lint-staged": "13.2.3",
82
+ "lint-staged": "14.0.1",
82
83
  "nuxt": "3.6.5",
83
- "prettier": "3.0.1",
84
- "stylelint": "15.10.2",
84
+ "prettier": "3.0.2",
85
+ "prettier-plugin-tailwindcss": "0.5.3",
86
+ "stylelint": "15.10.3",
85
87
  "stylelint-config-recommended-vue": "1.5.0",
86
88
  "stylelint-config-standard": "34.0.0",
87
89
  "stylelint-no-unsupported-browser-features": "7.0.0",
88
90
  "tailwindcss": "3.3.3",
89
- "typescript": "5.1.6",
90
- "vue": "3.3.4",
91
- "vue-tsc": "1.8.8"
91
+ "vue": "3.3.4"
92
92
  }
93
93
  }