vuetify-nuxt-module 0.19.4 β 1.0.0-alpha.2
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/configuration.d.ts +5 -5
- package/custom-configuration.cjs +1 -1
- package/custom-configuration.d.ts +4 -2
- package/custom-configuration.mjs +3 -3
- package/dist/module.d.mts +54 -12
- package/dist/module.json +1 -1
- package/dist/module.mjs +1130 -1020
- package/dist/runtime/plugins/date.js +3 -2
- package/dist/runtime/plugins/detect-browser.js +19 -10
- package/dist/runtime/plugins/i18n.js +5 -5
- package/dist/runtime/plugins/icons.js +2 -1
- package/dist/runtime/plugins/types.d.ts +0 -2
- package/dist/runtime/plugins/vuetify-client-hints.client.d.ts +1 -1
- package/dist/runtime/plugins/vuetify-client-hints.client.js +11 -6
- package/dist/runtime/plugins/vuetify-client-hints.server.d.ts +1 -1
- package/dist/runtime/plugins/vuetify-client-hints.server.js +38 -25
- package/dist/runtime/plugins/vuetify-date.js +1 -1
- package/dist/runtime/plugins/vuetify-i18n-date.js +1 -1
- package/dist/runtime/plugins/vuetify-i18n.js +1 -1
- package/dist/runtime/plugins/vuetify-icons.js +1 -1
- package/dist/runtime/plugins/vuetify-no-client-hints.d.ts +1 -1
- package/dist/runtime/plugins/vuetify-no-client-hints.js +1 -1
- package/package.json +49 -54
- package/README.md +0 -95
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { adapter, dateConfiguration, enabled, i18n } from "virtual:vuetify-date-configuration";
|
|
2
1
|
import { useNuxtApp } from "#imports";
|
|
2
|
+
import { adapter, dateConfiguration, enabled, i18n } from "virtual:vuetify-date-configuration";
|
|
3
3
|
export function configureDate(vuetifyOptions) {
|
|
4
|
-
if (adapter === "custom" || !enabled)
|
|
4
|
+
if (adapter === "custom" || !enabled) {
|
|
5
5
|
return;
|
|
6
|
+
}
|
|
6
7
|
const dateOptions = dateConfiguration();
|
|
7
8
|
if (i18n) {
|
|
8
9
|
const locales = useNuxtApp().$i18n.locales.value;
|
|
@@ -111,19 +111,23 @@ const operatingSystemRules = [
|
|
|
111
111
|
["OS/2", /OS\/2/]
|
|
112
112
|
];
|
|
113
113
|
export function detect(userAgent) {
|
|
114
|
-
if (userAgent)
|
|
114
|
+
if (userAgent) {
|
|
115
115
|
return parseUserAgent(userAgent);
|
|
116
|
-
|
|
116
|
+
}
|
|
117
|
+
if (typeof document === "undefined" && typeof navigator !== "undefined" && navigator.product === "ReactNative") {
|
|
117
118
|
return new ReactNativeInfo();
|
|
118
|
-
|
|
119
|
+
}
|
|
120
|
+
if (typeof navigator !== "undefined") {
|
|
119
121
|
return parseUserAgent(navigator.userAgent);
|
|
122
|
+
}
|
|
120
123
|
return getNodeVersion();
|
|
121
124
|
}
|
|
122
125
|
function matchUserAgent(ua) {
|
|
123
126
|
return ua !== "" && userAgentRules.reduce(
|
|
124
127
|
(matched, [browser, regex]) => {
|
|
125
|
-
if (matched)
|
|
128
|
+
if (matched) {
|
|
126
129
|
return matched;
|
|
130
|
+
}
|
|
127
131
|
const uaMatch = regex.exec(ua);
|
|
128
132
|
return !!uaMatch && [browser, uaMatch];
|
|
129
133
|
},
|
|
@@ -136,11 +140,13 @@ export function browserName(ua) {
|
|
|
136
140
|
}
|
|
137
141
|
export function parseUserAgent(ua) {
|
|
138
142
|
const matchedRule = matchUserAgent(ua);
|
|
139
|
-
if (!matchedRule)
|
|
143
|
+
if (!matchedRule) {
|
|
140
144
|
return null;
|
|
145
|
+
}
|
|
141
146
|
const [name, match] = matchedRule;
|
|
142
|
-
if (name === "searchbot")
|
|
147
|
+
if (name === "searchbot") {
|
|
143
148
|
return new BotInfo();
|
|
149
|
+
}
|
|
144
150
|
let versionParts = match[1] && match[1].split(".").join("_").split("_").slice(0, 3);
|
|
145
151
|
if (versionParts) {
|
|
146
152
|
if (versionParts.length < REQUIRED_VERSION_PARTS) {
|
|
@@ -155,26 +161,29 @@ export function parseUserAgent(ua) {
|
|
|
155
161
|
const version = versionParts.join(".");
|
|
156
162
|
const os = detectOS(ua);
|
|
157
163
|
const searchBotMatch = SEARCHBOT_OS_REGEX.exec(ua);
|
|
158
|
-
if (searchBotMatch && searchBotMatch[1])
|
|
164
|
+
if (searchBotMatch && searchBotMatch[1]) {
|
|
159
165
|
return new SearchBotDeviceInfo(name, version, os, searchBotMatch[1]);
|
|
166
|
+
}
|
|
160
167
|
return new BrowserInfo(name, version, os);
|
|
161
168
|
}
|
|
162
169
|
export function detectOS(ua) {
|
|
163
170
|
for (let ii = 0, count = operatingSystemRules.length; ii < count; ii++) {
|
|
164
171
|
const [os, regex] = operatingSystemRules[ii];
|
|
165
172
|
const match = regex.exec(ua);
|
|
166
|
-
if (match)
|
|
173
|
+
if (match) {
|
|
167
174
|
return os;
|
|
175
|
+
}
|
|
168
176
|
}
|
|
169
177
|
return null;
|
|
170
178
|
}
|
|
171
179
|
export function getNodeVersion() {
|
|
172
|
-
const isNode =
|
|
180
|
+
const isNode = process !== void 0 && process.version;
|
|
173
181
|
return isNode ? new NodeInfo(process.version.slice(1)) : null;
|
|
174
182
|
}
|
|
175
183
|
function createVersionParts(count) {
|
|
176
184
|
const output = [];
|
|
177
|
-
for (let ii = 0; ii < count; ii++)
|
|
185
|
+
for (let ii = 0; ii < count; ii++) {
|
|
178
186
|
output.push("0");
|
|
187
|
+
}
|
|
179
188
|
return output;
|
|
180
189
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { useNuxtApp } from "#imports";
|
|
1
2
|
import { ref, toRef, watch } from "vue";
|
|
2
3
|
import { useI18n } from "vue-i18n";
|
|
3
|
-
import { useNuxtApp } from "#imports";
|
|
4
4
|
function inferDecimalSeparator(n) {
|
|
5
5
|
return n(0.1).includes(",") ? "," : ".";
|
|
6
6
|
}
|
|
@@ -17,8 +17,9 @@ export function createAdapter(vuetifyOptions) {
|
|
|
17
17
|
return acc;
|
|
18
18
|
}, {});
|
|
19
19
|
watch(currentLocale, (val, oldVal) => {
|
|
20
|
-
if (oldVal)
|
|
20
|
+
if (oldVal) {
|
|
21
21
|
i18n.setLocale(val);
|
|
22
|
+
}
|
|
22
23
|
}, { immediate: true, flush: "post" });
|
|
23
24
|
nuxtApp.hook("i18n:localeSwitched", ({ newLocale }) => {
|
|
24
25
|
currentLocale.value = newLocale;
|
|
@@ -31,7 +32,6 @@ export function createAdapter(vuetifyOptions) {
|
|
|
31
32
|
t: (key, ...params) => i18n.t(key, params),
|
|
32
33
|
n: i18n.n,
|
|
33
34
|
provide: createProvideFunction({ current: currentLocale, fallback, messages }),
|
|
34
|
-
// @ts-expect-error available in vuetify 3.9
|
|
35
35
|
decimalSeparator: toRef(() => inferDecimalSeparator(i18n.n))
|
|
36
36
|
};
|
|
37
37
|
}
|
|
@@ -47,8 +47,9 @@ function createProvideFunction(data) {
|
|
|
47
47
|
inheritLocale: false
|
|
48
48
|
});
|
|
49
49
|
watch(currentLocale, (val, oldVal) => {
|
|
50
|
-
if (oldVal)
|
|
50
|
+
if (oldVal) {
|
|
51
51
|
i18n.setLocale(val);
|
|
52
|
+
}
|
|
52
53
|
}, { immediate: true, flush: "post" });
|
|
53
54
|
const t = wrapI18n(i18n.t);
|
|
54
55
|
const n = wrapI18n(i18n.n);
|
|
@@ -59,7 +60,6 @@ function createProvideFunction(data) {
|
|
|
59
60
|
messages: data.messages,
|
|
60
61
|
t,
|
|
61
62
|
n,
|
|
62
|
-
// @ts-expect-error available in vuetify 3.9
|
|
63
63
|
decimalSeparator: toRef(() => props.decimalSeparator ?? inferDecimalSeparator(n)),
|
|
64
64
|
provide: createProvideFunction({ current: currentLocale, fallback: data.fallback, messages: data.messages })
|
|
65
65
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { defineNuxtPlugin, useNuxtApp, useState } from "#imports";
|
|
1
2
|
import { ssrClientHintsConfiguration } from "virtual:vuetify-ssr-client-hints-configuration";
|
|
2
3
|
import { reactive, ref, watch } from "vue";
|
|
3
4
|
import { VuetifyHTTPClientHints } from "./client-hints.js";
|
|
4
|
-
import { defineNuxtPlugin, useNuxtApp, useState } from "#imports";
|
|
5
5
|
const plugin = defineNuxtPlugin({
|
|
6
6
|
name: "vuetify:client-hints:client:plugin",
|
|
7
7
|
order: -25,
|
|
@@ -37,12 +37,15 @@ const plugin = defineNuxtPlugin({
|
|
|
37
37
|
window.location.reload();
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
if (prefersReducedMotion && prefersReducedMotionAvailable)
|
|
40
|
+
if (prefersReducedMotion && prefersReducedMotionAvailable) {
|
|
41
41
|
window.location.reload();
|
|
42
|
-
|
|
42
|
+
}
|
|
43
|
+
if (viewportSize && viewportHeightAvailable) {
|
|
43
44
|
window.location.reload();
|
|
44
|
-
|
|
45
|
+
}
|
|
46
|
+
if (viewportSize && viewportWidthAvailable) {
|
|
45
47
|
window.location.reload();
|
|
48
|
+
}
|
|
46
49
|
}
|
|
47
50
|
nuxtApp.hook("vuetify:before-create", ({ vuetifyOptions }) => {
|
|
48
51
|
if (viewportSize) {
|
|
@@ -106,11 +109,13 @@ function defaultClientValues() {
|
|
|
106
109
|
}
|
|
107
110
|
function useSSRClientHints() {
|
|
108
111
|
const state = useState(VuetifyHTTPClientHints);
|
|
109
|
-
if (state.value)
|
|
112
|
+
if (state.value) {
|
|
110
113
|
return state;
|
|
114
|
+
}
|
|
111
115
|
const initial = ref(defaultClientValues());
|
|
112
|
-
if (!ssrClientHintsConfiguration.prefersColorScheme || !ssrClientHintsConfiguration.prefersColorSchemeOptions)
|
|
116
|
+
if (!ssrClientHintsConfiguration.prefersColorScheme || !ssrClientHintsConfiguration.prefersColorSchemeOptions) {
|
|
113
117
|
return initial;
|
|
118
|
+
}
|
|
114
119
|
const {
|
|
115
120
|
baseUrl,
|
|
116
121
|
cookieName,
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
import { setResponseHeader } from "h3";
|
|
2
|
-
import {
|
|
3
|
-
ssrClientHintsConfiguration
|
|
4
|
-
} from "virtual:vuetify-ssr-client-hints-configuration";
|
|
5
|
-
import { reactive } from "vue";
|
|
6
|
-
import { parseUserAgent } from "./detect-browser.js";
|
|
7
|
-
import { VuetifyHTTPClientHints } from "./client-hints.js";
|
|
8
1
|
import {
|
|
9
2
|
defineNuxtPlugin,
|
|
10
3
|
useCookie,
|
|
@@ -13,6 +6,13 @@ import {
|
|
|
13
6
|
useRequestHeaders,
|
|
14
7
|
useState
|
|
15
8
|
} from "#imports";
|
|
9
|
+
import { setResponseHeader } from "h3";
|
|
10
|
+
import {
|
|
11
|
+
ssrClientHintsConfiguration
|
|
12
|
+
} from "virtual:vuetify-ssr-client-hints-configuration";
|
|
13
|
+
import { reactive } from "vue";
|
|
14
|
+
import { VuetifyHTTPClientHints } from "./client-hints.js";
|
|
15
|
+
import { parseUserAgent } from "./detect-browser.js";
|
|
16
16
|
const AcceptClientHintsHeaders = {
|
|
17
17
|
prefersColorScheme: "Sec-CH-Prefers-Color-Scheme",
|
|
18
18
|
prefersReducedMotion: "Sec-CH-Prefers-Reduced-Motion",
|
|
@@ -99,15 +99,17 @@ const allowedBrowsers = [
|
|
|
99
99
|
];
|
|
100
100
|
const ClientHeaders = ["Accept-CH", "Vary", "Critical-CH"];
|
|
101
101
|
function browserFeatureAvailable(userAgent, feature) {
|
|
102
|
-
if (userAgent == null || userAgent.type !== "browser")
|
|
102
|
+
if (userAgent == null || userAgent.type !== "browser") {
|
|
103
103
|
return false;
|
|
104
|
+
}
|
|
104
105
|
try {
|
|
105
106
|
const browserName = userAgent.name;
|
|
106
107
|
const android = userAgent.os?.toLowerCase().startsWith("android") ?? false;
|
|
107
108
|
const versions = userAgent.version.split(".").map((v) => Number.parseInt(v));
|
|
108
109
|
return allowedBrowsers.some(([name, check]) => {
|
|
109
|
-
if (browserName !== name)
|
|
110
|
+
if (browserName !== name) {
|
|
110
111
|
return false;
|
|
112
|
+
}
|
|
111
113
|
try {
|
|
112
114
|
return check[feature](android, versions);
|
|
113
115
|
} catch {
|
|
@@ -127,18 +129,22 @@ function lookupClientHints(userAgent, ssrClientHintsConfiguration2, headers) {
|
|
|
127
129
|
viewportWidthAvailable: false,
|
|
128
130
|
devicePixelRatioAvailable: false
|
|
129
131
|
};
|
|
130
|
-
if (userAgent == null || userAgent.type !== "browser")
|
|
132
|
+
if (userAgent == null || userAgent.type !== "browser") {
|
|
131
133
|
return features;
|
|
132
|
-
|
|
134
|
+
}
|
|
135
|
+
if (ssrClientHintsConfiguration2.prefersColorScheme) {
|
|
133
136
|
features.prefersColorSchemeAvailable = browserFeatureAvailable(userAgent, "prefersColorScheme");
|
|
134
|
-
|
|
137
|
+
}
|
|
138
|
+
if (ssrClientHintsConfiguration2.prefersReducedMotion) {
|
|
135
139
|
features.prefersReducedMotionAvailable = browserFeatureAvailable(userAgent, "prefersReducedMotion");
|
|
140
|
+
}
|
|
136
141
|
if (ssrClientHintsConfiguration2.viewportSize) {
|
|
137
142
|
features.viewportHeightAvailable = browserFeatureAvailable(userAgent, "viewportHeight");
|
|
138
143
|
features.viewportWidthAvailable = browserFeatureAvailable(userAgent, "viewportWidth");
|
|
139
144
|
const mobileHeader = headers[SecChUaMobile];
|
|
140
|
-
if (mobileHeader === "?1")
|
|
145
|
+
if (mobileHeader === "?1") {
|
|
141
146
|
features.devicePixelRatioAvailable = browserFeatureAvailable(userAgent, "devicePixelRatio");
|
|
147
|
+
}
|
|
142
148
|
}
|
|
143
149
|
return features;
|
|
144
150
|
}
|
|
@@ -211,10 +217,12 @@ function collectClientHints(userAgent, ssrClientHintsConfiguration2, headers) {
|
|
|
211
217
|
try {
|
|
212
218
|
hints.devicePixelRatio = Number.parseFloat(header);
|
|
213
219
|
if (!Number.isNaN(hints.devicePixelRatio) && hints.devicePixelRatio > 0) {
|
|
214
|
-
if (typeof hints.viewportWidth === "number")
|
|
220
|
+
if (typeof hints.viewportWidth === "number") {
|
|
215
221
|
hints.viewportWidth = Math.round(hints.viewportWidth / hints.devicePixelRatio);
|
|
216
|
-
|
|
222
|
+
}
|
|
223
|
+
if (typeof hints.viewportHeight === "number") {
|
|
217
224
|
hints.viewportHeight = Math.round(hints.viewportHeight / hints.devicePixelRatio);
|
|
225
|
+
}
|
|
218
226
|
}
|
|
219
227
|
} catch {
|
|
220
228
|
}
|
|
@@ -223,30 +231,34 @@ function collectClientHints(userAgent, ssrClientHintsConfiguration2, headers) {
|
|
|
223
231
|
return hints;
|
|
224
232
|
}
|
|
225
233
|
function writeClientHintHeaders(key, headers) {
|
|
226
|
-
|
|
227
|
-
headers[header] = (headers[header]
|
|
228
|
-
}
|
|
234
|
+
for (const header of ClientHeaders) {
|
|
235
|
+
headers[header] = (headers[header] ?? []).concat(key);
|
|
236
|
+
}
|
|
229
237
|
}
|
|
230
238
|
function writeClientHintsResponseHeaders(clientHintsRequest, ssrClientHintsConfiguration2) {
|
|
231
239
|
const headers = {};
|
|
232
|
-
if (ssrClientHintsConfiguration2.prefersColorScheme && clientHintsRequest.prefersColorSchemeAvailable)
|
|
240
|
+
if (ssrClientHintsConfiguration2.prefersColorScheme && clientHintsRequest.prefersColorSchemeAvailable) {
|
|
233
241
|
writeClientHintHeaders(AcceptClientHintsHeaders.prefersColorScheme, headers);
|
|
234
|
-
|
|
242
|
+
}
|
|
243
|
+
if (ssrClientHintsConfiguration2.prefersReducedMotion && clientHintsRequest.prefersReducedMotionAvailable) {
|
|
235
244
|
writeClientHintHeaders(AcceptClientHintsHeaders.prefersReducedMotion, headers);
|
|
245
|
+
}
|
|
236
246
|
if (ssrClientHintsConfiguration2.viewportSize && clientHintsRequest.viewportHeightAvailable && clientHintsRequest.viewportWidthAvailable) {
|
|
237
247
|
writeClientHintHeaders(AcceptClientHintsHeaders.viewportHeight, headers);
|
|
238
248
|
writeClientHintHeaders(AcceptClientHintsHeaders.viewportWidth, headers);
|
|
239
|
-
if (clientHintsRequest.devicePixelRatioAvailable)
|
|
249
|
+
if (clientHintsRequest.devicePixelRatioAvailable) {
|
|
240
250
|
writeClientHintHeaders(AcceptClientHintsHeaders.devicePixelRatio, headers);
|
|
251
|
+
}
|
|
241
252
|
}
|
|
242
|
-
if (Object.keys(headers).length === 0)
|
|
253
|
+
if (Object.keys(headers).length === 0) {
|
|
243
254
|
return;
|
|
255
|
+
}
|
|
244
256
|
const nuxtApp = useNuxtApp();
|
|
245
257
|
const callback = () => {
|
|
246
258
|
const event = useRequestEvent(nuxtApp);
|
|
247
|
-
|
|
259
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
248
260
|
setResponseHeader(event, key, value);
|
|
249
|
-
}
|
|
261
|
+
}
|
|
250
262
|
};
|
|
251
263
|
const unhook = nuxtApp.hooks.hookOnce("app:rendered", callback);
|
|
252
264
|
nuxtApp.hooks.hookOnce("app:error", () => {
|
|
@@ -255,8 +267,9 @@ function writeClientHintsResponseHeaders(clientHintsRequest, ssrClientHintsConfi
|
|
|
255
267
|
});
|
|
256
268
|
}
|
|
257
269
|
function writeThemeCookie(clientHintsRequest, ssrClientHintsConfiguration2) {
|
|
258
|
-
if (!ssrClientHintsConfiguration2.prefersColorScheme || !ssrClientHintsConfiguration2.prefersColorSchemeOptions)
|
|
270
|
+
if (!ssrClientHintsConfiguration2.prefersColorScheme || !ssrClientHintsConfiguration2.prefersColorSchemeOptions) {
|
|
259
271
|
return;
|
|
272
|
+
}
|
|
260
273
|
const cookieName = ssrClientHintsConfiguration2.prefersColorSchemeOptions.cookieName;
|
|
261
274
|
const themeName = clientHintsRequest.colorSchemeFromCookie ?? ssrClientHintsConfiguration2.prefersColorSchemeOptions.defaultTheme;
|
|
262
275
|
const path = ssrClientHintsConfiguration2.prefersColorSchemeOptions.baseUrl;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vuetify-nuxt-module",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "1.0.0-alpha.2",
|
|
5
5
|
"description": "Zero-Config Nuxt Module for Vuetify",
|
|
6
6
|
"author": "userquin <userquin@gmail.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -51,54 +51,49 @@
|
|
|
51
51
|
"*.mjs"
|
|
52
52
|
],
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@nuxt/kit": "^
|
|
54
|
+
"@nuxt/kit": "^4.3.1",
|
|
55
55
|
"defu": "^6.1.4",
|
|
56
|
-
"destr": "^2.0.
|
|
56
|
+
"destr": "^2.0.5",
|
|
57
57
|
"local-pkg": "^1.1.2",
|
|
58
|
-
"pathe": "^
|
|
59
|
-
"perfect-debounce": "^1.0
|
|
60
|
-
"semver": "^7.7.
|
|
61
|
-
"ufo": "^1.
|
|
62
|
-
"unconfig": "^
|
|
58
|
+
"pathe": "^2.0.3",
|
|
59
|
+
"perfect-debounce": "^2.1.0",
|
|
60
|
+
"semver": "^7.7.4",
|
|
61
|
+
"ufo": "^1.6.3",
|
|
62
|
+
"unconfig": "^7.5.0",
|
|
63
63
|
"upath": "^2.0.1",
|
|
64
64
|
"vite-plugin-vuetify": "^2.1.3",
|
|
65
|
-
"vuetify": "^
|
|
65
|
+
"vuetify": "^4.0.1"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@antfu/eslint-config": "^
|
|
69
|
-
"@antfu/ni": "^
|
|
70
|
-
"@date-io/luxon": "^2.
|
|
71
|
-
"@fortawesome/fontawesome-svg-core": "^
|
|
72
|
-
"@fortawesome/free-solid-svg-icons": "^
|
|
73
|
-
"@fortawesome/vue-fontawesome": "^3.
|
|
74
|
-
"@iconify-json/carbon": "^1.
|
|
75
|
-
"@iconify-json/mdi": "^1.
|
|
68
|
+
"@antfu/eslint-config": "^7.6.1",
|
|
69
|
+
"@antfu/ni": "^28.2.0",
|
|
70
|
+
"@date-io/luxon": "^3.2.0",
|
|
71
|
+
"@fortawesome/fontawesome-svg-core": "^7.2.0",
|
|
72
|
+
"@fortawesome/free-solid-svg-icons": "^7.2.0",
|
|
73
|
+
"@fortawesome/vue-fontawesome": "^3.1.3",
|
|
74
|
+
"@iconify-json/carbon": "^1.2.19",
|
|
75
|
+
"@iconify-json/mdi": "^1.2.3",
|
|
76
76
|
"@mdi/js": "^7.4.47",
|
|
77
77
|
"@nuxt/devtools": "latest",
|
|
78
78
|
"@nuxt/module-builder": "^1.0.2",
|
|
79
|
-
"@nuxt/schema": "^3.
|
|
80
|
-
"@nuxt/test-utils": "^
|
|
81
|
-
"@nuxtjs/i18n": "^
|
|
82
|
-
"@parcel/watcher": "^2.
|
|
83
|
-
"@types/node": "^
|
|
79
|
+
"@nuxt/schema": "^4.3.1",
|
|
80
|
+
"@nuxt/test-utils": "^4.0.0",
|
|
81
|
+
"@nuxtjs/i18n": "^10.2.3",
|
|
82
|
+
"@parcel/watcher": "^2.5.6",
|
|
83
|
+
"@types/node": "^25.3.3",
|
|
84
84
|
"@types/semver": "^7.7.1",
|
|
85
|
-
"@unocss/nuxt": "^66.
|
|
86
|
-
"bumpp": "^
|
|
87
|
-
"eslint": "^
|
|
88
|
-
"luxon": "^3.
|
|
89
|
-
"nuxt": "^3.
|
|
90
|
-
"publint": "^0.
|
|
91
|
-
"rimraf": "^6.
|
|
92
|
-
"sass": "^1.
|
|
93
|
-
"typescript": "^5.
|
|
94
|
-
"vite": "
|
|
95
|
-
"vitest": "^
|
|
96
|
-
"vue-tsc": "^2.
|
|
97
|
-
},
|
|
98
|
-
"resolutions": {
|
|
99
|
-
"@nuxt/kit": "3.15.4",
|
|
100
|
-
"vite": "6.4.1",
|
|
101
|
-
"vue": "3.4.31"
|
|
85
|
+
"@unocss/nuxt": "^66.6.2",
|
|
86
|
+
"bumpp": "^10.4.1",
|
|
87
|
+
"eslint": "^10.0.2",
|
|
88
|
+
"luxon": "^3.7.2",
|
|
89
|
+
"nuxt": "^4.3.1",
|
|
90
|
+
"publint": "^0.3.18",
|
|
91
|
+
"rimraf": "^6.1.3",
|
|
92
|
+
"sass": "^1.97.3",
|
|
93
|
+
"typescript": "^5.9.3",
|
|
94
|
+
"vite": "7.3.1",
|
|
95
|
+
"vitest": "^4.0.18",
|
|
96
|
+
"vue-tsc": "^3.2.5"
|
|
102
97
|
},
|
|
103
98
|
"build": {
|
|
104
99
|
"externals": [
|
|
@@ -122,23 +117,23 @@
|
|
|
122
117
|
},
|
|
123
118
|
"stackblitz": {
|
|
124
119
|
"installDependencies": false,
|
|
125
|
-
"startCommand": "node
|
|
120
|
+
"startCommand": "node ../../.stackblitz.js && pnpm install && pnpm -C ../../ prepack && pnpm -C ../../ dev:prepare && pnpm -C ../../ dev"
|
|
126
121
|
},
|
|
127
122
|
"scripts": {
|
|
128
|
-
"dev": "
|
|
129
|
-
"dev:multiple-json": "MULTIPLE_LANG_FILES=true
|
|
130
|
-
"dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground",
|
|
131
|
-
"dev:prepare:multiple-json": "nuxt-module-build build --stub && nuxt-module-build prepare && MULTIPLE_LANG_FILES=true nuxi prepare playground",
|
|
132
|
-
"dev:build": "
|
|
133
|
-
"dev:generate": "
|
|
134
|
-
"dev:build:multiple-json": "MULTIPLE_LANG_FILES=true
|
|
135
|
-
"dev:generate:multiple-json": "MULTIPLE_LANG_FILES=true
|
|
136
|
-
"dev:preview": "
|
|
137
|
-
"dev:prepare:date-io": "nuxt-module-build build --stub && nuxt-module-build prepare &&
|
|
138
|
-
"dev:date-io": "
|
|
139
|
-
"docs:dev": "pnpm -C docs run dev",
|
|
140
|
-
"docs:build": "nuxt-module-build prepare && pnpm -C docs run build",
|
|
141
|
-
"docs:serve": "pnpm -C docs run serve",
|
|
123
|
+
"dev": "pnpm -C ../../apps/playground dev",
|
|
124
|
+
"dev:multiple-json": "MULTIPLE_LANG_FILES=true pnpm -C ../../apps/playground dev",
|
|
125
|
+
"dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare ../../apps/playground",
|
|
126
|
+
"dev:prepare:multiple-json": "nuxt-module-build build --stub && nuxt-module-build prepare && MULTIPLE_LANG_FILES=true nuxi prepare ../../apps/playground",
|
|
127
|
+
"dev:build": "pnpm -C ../../apps/playground build",
|
|
128
|
+
"dev:generate": "pnpm -C ../../apps/playground generate",
|
|
129
|
+
"dev:build:multiple-json": "MULTIPLE_LANG_FILES=true pnpm -C ../../apps/playground build",
|
|
130
|
+
"dev:generate:multiple-json": "MULTIPLE_LANG_FILES=true pnpm -C ../../apps/playground generate",
|
|
131
|
+
"dev:preview": "pnpm -C ../../apps/playground preview",
|
|
132
|
+
"dev:prepare:date-io": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare ../../apps/date-io-playground",
|
|
133
|
+
"dev:date-io": "pnpm -C ../../apps/date-io-playground dev",
|
|
134
|
+
"docs:dev": "pnpm -C ../../docs run dev",
|
|
135
|
+
"docs:build": "nuxt-module-build prepare && pnpm -C ../../docs run build",
|
|
136
|
+
"docs:serve": "pnpm -C ../../docs run serve",
|
|
142
137
|
"lint": "eslint .",
|
|
143
138
|
"lint:fix": "nr lint --fix",
|
|
144
139
|
"publint": "publint",
|
package/README.md
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
<picture>
|
|
3
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/vuetifyjs/nuxt-module/raw/main/hero-dark.svg" />
|
|
4
|
-
<img alt="vuetify-nuxt-module - Zero-config Nuxt Module for Vuetify" src='https://github.com/vuetifyjs/nuxt-module/raw/main/hero.svg' alt="vuetify-nuxt-module - Zero-config Nuxt Module for Vuetify"><br>
|
|
5
|
-
</picture>
|
|
6
|
-
<p>Zero-config Nuxt Module for Vuetify</p>
|
|
7
|
-
</div>
|
|
8
|
-
|
|
9
|
-
<p align='center'>
|
|
10
|
-
<a href='https://www.npmjs.com/package/vuetify-nuxt-module' target="__blank">
|
|
11
|
-
<img src='https://img.shields.io/npm/v/vuetify-nuxt-module?color=33A6B8&label=' alt="NPM version">
|
|
12
|
-
</a>
|
|
13
|
-
<a href="https://www.npmjs.com/package/vuetify-nuxt-module" target="__blank">
|
|
14
|
-
<img alt="NPM Downloads" src="https://img.shields.io/npm/dm/vuetify-nuxt-module?color=476582&label=">
|
|
15
|
-
</a>
|
|
16
|
-
<a href="https://nuxt.vuetifyjs.com/" target="__blank">
|
|
17
|
-
<img src="https://img.shields.io/static/v1?label=&message=docs%20%26%20guides&color=2e859c" alt="Docs & Guides">
|
|
18
|
-
</a>
|
|
19
|
-
<br>
|
|
20
|
-
<a href="https://github.com/vuetifyjs/nuxt-module" target="__blank">
|
|
21
|
-
<img alt="GitHub stars" src="https://img.shields.io/github/stars/userquin/vuetify-nuxt-module?style=social">
|
|
22
|
-
</a>
|
|
23
|
-
</p>
|
|
24
|
-
|
|
25
|
-
<br>
|
|
26
|
-
|
|
27
|
-
## π Features
|
|
28
|
-
|
|
29
|
-
- π [**Documentation & guides**](https://nuxt.vuetifyjs.com/)
|
|
30
|
-
- π **Zero-Config**: sensible built-in default [Vuetify](https://vuetifyjs.com/) configuration for common use cases
|
|
31
|
-
- π **Extensible**: expose the ability to customize the Vuetify configuration via [Nuxt Runtime Hooks](https://nuxt.com/docs/guide/going-further/hooks#usage-with-plugins)
|
|
32
|
-
- β‘ **Fully Tree Shakable**: by default, only the needed Vuetify components are imported
|
|
33
|
-
- π οΈ **Versatile**: custom Vuetify [directives](https://vuetifyjs.com/en/getting-started/installation/#manual-steps) and [labs components](https://vuetifyjs.com/en/labs/introduction/) registration
|
|
34
|
-
- β¨ **Configurable Styles**: configure your variables using [Vuetify SASS Variables](https://vuetifyjs.com/en/features/sass-variables/)
|
|
35
|
-
- π₯ **SSR**: automatic SSR detection and configuration including [HTTP Client hints](https://developer.mozilla.org/en-US/docs/Web/HTTP/Client_hints)
|
|
36
|
-
- π© **Nuxt Layers and Module Hooks**: load your Vuetify configuration using [Nuxt Layers](https://nuxt.com/docs/getting-started/layers#layers) or using a custom module via `vuetify:registerModule` [Nuxt Module Hook](https://nuxt.com/docs/guide/going-further/hooks#nuxt-hooks-build-time)
|
|
37
|
-
- π₯ **Vuetify Configuration File**: configure your Vuetify options using a custom `vuetify.config` file, no dev server restart needed
|
|
38
|
-
- π₯ **Pure CSS Icons**: no more font/js icons, use the new `unocss-mdi` icon set or build your own with UnoCSS Preset Icons
|
|
39
|
-
- π **Icon Fonts**: configure the [icon font](https://vuetifyjs.com/en/features/icon-fonts/) you want to use, the module will automatically import it for you using CDN or local dependencies
|
|
40
|
-
- π **SVG Icons**: ready to use [@mdi/js](https://www.npmjs.com/package/@mdi/js) and [@fortawesome/vue-fontawesome](https://www.npmjs.com/package/@fortawesome/vue-fontawesome) SVG icons packs
|
|
41
|
-
- π¦ **Multiple Icon Sets**: register [multiple icon sets](https://vuetifyjs.com/en/features/icon-fonts/#multiple-icon-sets)
|
|
42
|
-
- π **I18n Ready**: install [@nuxtjs/i18n](https://i18n.nuxtjs.org/) Nuxt module, and you're ready to use Vuetify [internationalization](https://vuetifyjs.com/en/features/internationalization/) features
|
|
43
|
-
- π **Date Components**: use Vuetify components [that require date functionality](https://vuetifyjs.com/en/features/dates/) installing and configuring one of the [@date-io](https://github.com/dmtrKovalenko/date-io#projects) adapters
|
|
44
|
-
- π¬ **Auto-Import Vuetify Locale Messages**: add [Vuetify Locale Messages](https://vuetifyjs.com/en/features/internationalization/#getting-started) adding just the locales you want to use, no more imports needed
|
|
45
|
-
- βοΈ **Auto-Import Vuetify Composables**: you don't need to import Vuetify composables manually, they are automatically imported for you
|
|
46
|
-
- π¨ **Vuetify Blueprints**: use [Vuetify Blueprints](https://vuetifyjs.com/en/features/blueprints/) to quickly scaffold components
|
|
47
|
-
- π **Nuxt DevTools**: ready to inspect your Vuetify styles with the [Nuxt DevTools](https://github.com/nuxt/devtools) inspector
|
|
48
|
-
- π¦Ύ **Type Strong**: written in [TypeScript](https://www.typescriptlang.org/)
|
|
49
|
-
|
|
50
|
-
## π¦ Install
|
|
51
|
-
|
|
52
|
-
> Requires Vite, will not work with Webpack
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
npx nuxi@latest module add vuetify-nuxt-module
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
[](https://stackblitz.com/github/userquin/vuetify-nuxt-module)
|
|
59
|
-
|
|
60
|
-
## π¦ Usage
|
|
61
|
-
|
|
62
|
-
> `vuetify-nuxt-module` is strongly opinionated and has a built-in default configuration out of the box. You can use it without any configuration, and it will work for most use cases.
|
|
63
|
-
|
|
64
|
-
Add `vuetify-nuxt-module` module to `nuxt.config.ts` and configure it:
|
|
65
|
-
|
|
66
|
-
```ts
|
|
67
|
-
// Nuxt config file
|
|
68
|
-
import { defineNuxtConfig } from 'nuxt/config'
|
|
69
|
-
|
|
70
|
-
export default defineNuxtConfig({
|
|
71
|
-
modules: [
|
|
72
|
-
'vuetify-nuxt-module'
|
|
73
|
-
],
|
|
74
|
-
vuetify: {
|
|
75
|
-
moduleOptions: {
|
|
76
|
-
/* module specific options */
|
|
77
|
-
},
|
|
78
|
-
vuetifyOptions: {
|
|
79
|
-
/* vuetify options */
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
})
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Read the [π documentation](https://nuxt.vuetifyjs.com/) for a complete guide on how to configure and use this module.
|
|
86
|
-
|
|
87
|
-
## π Full config
|
|
88
|
-
|
|
89
|
-
Check out the [types](https://github.com/vuetifyjs/nuxt-module/blob/main/src/types.ts).
|
|
90
|
-
|
|
91
|
-
The virtual modules can be found in [configuration.d.ts](https://github.com/vuetifyjs/nuxt-module/blob/main/configuration.d.ts) file.
|
|
92
|
-
|
|
93
|
-
## π License
|
|
94
|
-
|
|
95
|
-
[MIT](https://github.com/vuetifyjs/nuxt-module/blob/main/LICENSE) License © 2023-PRESENT [JoaquΓn SΓ‘nchez](https://github.com/userquin)
|