@inzombieland/nuxt-common 1.20.4 → 1.20.7

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 (38) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +2 -2
  3. package/dist/runtime/SidebarProvider.vue +1 -1
  4. package/dist/runtime/composables/use-toggle-sidebar.d.ts +1 -2
  5. package/dist/runtime/composables/use-toggle-sidebar.js +2 -2
  6. package/dist/runtime/middleware/auth.js +1 -1
  7. package/dist/runtime/middleware/guest.js +1 -1
  8. package/dist/runtime/middleware/locale.global.js +1 -1
  9. package/dist/runtime/packages/core/api-client.js +3 -3
  10. package/dist/runtime/packages/core/comet-client.d.ts +1 -0
  11. package/dist/runtime/packages/core/comet-client.js +2 -2
  12. package/dist/runtime/packages/core/composables/use-app-locale.js +4 -3
  13. package/dist/runtime/packages/core/composables/use-cookies.js +3 -3
  14. package/dist/runtime/packages/core/composables/use-subscribe.d.ts +2 -3
  15. package/dist/runtime/packages/core/composables/use-subscribe.js +4 -4
  16. package/dist/runtime/packages/core/composables/use-theme-mode.js +2 -1
  17. package/dist/runtime/packages/core/get-visitor.js +1 -1
  18. package/dist/runtime/packages/core/helpers/current-device.js +8 -9
  19. package/dist/runtime/packages/core/helpers/index.d.ts +1 -1
  20. package/dist/runtime/packages/core/helpers/index.js +1 -1
  21. package/dist/runtime/packages/core/index.d.ts +1 -1
  22. package/dist/runtime/packages/core/index.js +2 -2
  23. package/dist/runtime/packages/core/local-storage-utils.js +9 -8
  24. package/dist/runtime/packages/core/package.json +1 -1
  25. package/dist/runtime/packages/core/user-actions.js +9 -9
  26. package/dist/runtime/packages/layer-manager/LayersProvider.vue +10 -10
  27. package/dist/runtime/packages/layer-manager/assets/css/layer.css +335 -0
  28. package/dist/runtime/packages/layer-manager/package.json +1 -1
  29. package/dist/runtime/plugin.js +1 -1
  30. package/dist/runtime/plugins/device.js +1 -1
  31. package/dist/runtime/server/api/account/account.get.js +1 -1
  32. package/dist/runtime/server/api/account/authcheck.get.js +1 -1
  33. package/dist/runtime/server/api/account/default-handler.js +1 -1
  34. package/dist/runtime/server/api/account/middleware.js +1 -1
  35. package/dist/runtime/server/api/account/token.get.js +1 -1
  36. package/dist/runtime/server/api/index.js +1 -1
  37. package/dist/runtime/server/middleware/basic-auth.js +2 -2
  38. package/package.json +9 -5
package/dist/module.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inzombieland/nuxt-common",
3
- "version": "1.20.4",
3
+ "version": "1.20.7",
4
4
  "configKey": "nuxt-common",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
package/dist/module.mjs CHANGED
@@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url';
2
2
  import { defineNuxtModule, createResolver, addServerHandler, addImportsDir, addPlugin, addComponent } from '@nuxt/kit';
3
3
 
4
4
  const name = "@inzombieland/nuxt-common";
5
- const version = "1.20.4";
5
+ const version = "1.20.7";
6
6
 
7
7
  const module$1 = defineNuxtModule({
8
8
  meta: {
@@ -12,7 +12,7 @@ const module$1 = defineNuxtModule({
12
12
  },
13
13
  setup(options, nuxt) {
14
14
  const { resolve } = createResolver(import.meta.url);
15
- const runtimeDir = fileURLToPath(new URL("./runtime", import.meta.url));
15
+ const runtimeDir = fileURLToPath(new URL("runtime", import.meta.url));
16
16
  nuxt.options.build.transpile.push(runtimeDir);
17
17
  const addServerDefaultHandler = (route) => {
18
18
  addServerHandler({
@@ -92,7 +92,7 @@ onMounted(() => {
92
92
  contentRef.value.style.transition = "left 0.25s ease";
93
93
  }
94
94
  });
95
- if (typeof window !== "undefined" && $device.desktop()) {
95
+ if (globalThis.window !== void 0 && $device.desktop()) {
96
96
  sidebar.value = localStorage.sidebar === "hidden" ? "hidden" : "open";
97
97
  }
98
98
  </script>
@@ -1,3 +1,2 @@
1
1
  export declare const useToggleSidebar: () => import("vue").Ref<(() => string) | undefined, (() => string) | undefined>;
2
- declare const _default: () => () => string | undefined;
3
- export default _default;
2
+ export default function useToggleSidebarAction(): () => string | undefined;
@@ -2,7 +2,7 @@ import { useState } from "#imports";
2
2
  export const useToggleSidebar = () => {
3
3
  return useState("toggleSidebar", () => void 0);
4
4
  };
5
- export default () => {
5
+ export default function useToggleSidebarAction() {
6
6
  const toggleSidebar = useToggleSidebar();
7
7
  return () => toggleSidebar.value?.();
8
- };
8
+ }
@@ -1,6 +1,6 @@
1
+ import { useUser } from "../packages/core/index.js";
1
2
  import { defineNuxtRouteMiddleware, navigateTo } from "#app";
2
3
  import { useLocalePath } from "#i18n";
3
- import { useUser } from "../packages/core/index.js";
4
4
  export default defineNuxtRouteMiddleware(() => {
5
5
  const user = useUser();
6
6
  if (!user.value) {
@@ -1,7 +1,7 @@
1
+ import { useUser } from "../packages/core/index.js";
1
2
  import { defineNuxtRouteMiddleware, navigateTo } from "#app";
2
3
  import { useLocalePath } from "#i18n";
3
4
  import { useRuntimeConfig } from "#imports";
4
- import { useUser } from "../packages/core/index.js";
5
5
  export default defineNuxtRouteMiddleware(() => {
6
6
  const user = useUser();
7
7
  if (user.value) {
@@ -1,6 +1,6 @@
1
+ import { useUser } from "../packages/core/index.js";
1
2
  import { defineNuxtRouteMiddleware, navigateTo } from "#app";
2
3
  import { useCookie, useRuntimeConfig } from "#imports";
3
- import { useUser } from "../packages/core/index.js";
4
4
  export default defineNuxtRouteMiddleware((to) => {
5
5
  if (import.meta.server) return;
6
6
  const user = useUser();
@@ -84,7 +84,7 @@ const optionsHandler = (options = {}, config) => {
84
84
  const visitor = { platform: "web", hostname: getHostname() };
85
85
  if (token) {
86
86
  headers.authorization = `JWT ${token}`;
87
- } else if (typeof window !== "undefined" && appClientID && appClientSecret) {
87
+ } else if (globalThis.window !== void 0 && appClientID && appClientSecret) {
88
88
  const credentials = btoa(`${appClientID}:${appClientSecret}`);
89
89
  headers.authorization = `Basic ${credentials}`;
90
90
  }
@@ -96,7 +96,7 @@ const optionsHandler = (options = {}, config) => {
96
96
  options.baseURL = apiBaseURL;
97
97
  visitor.platform = "desktop";
98
98
  }
99
- if (typeof window !== "undefined") {
99
+ if (globalThis.window !== void 0) {
100
100
  visitor.hostname = location.hostname;
101
101
  }
102
102
  const { platform, hostname } = visitor;
@@ -117,7 +117,7 @@ const optionsHandler = (options = {}, config) => {
117
117
  const fetchRequest = (url, options = {}, fetch, config) => {
118
118
  const request = async () => {
119
119
  const apiActions = useApiActions();
120
- if (typeof window !== "undefined") {
120
+ if (globalThis.window !== void 0) {
121
121
  await apiActions.value?.getVisitorIdentifier?.();
122
122
  }
123
123
  const opts = optionsHandler(options, config);
@@ -3,6 +3,7 @@ declare global {
3
3
  interface Window {
4
4
  wsPublish: (eventName: string, data: unknown) => void;
5
5
  }
6
+ var wsPublish: (eventName: string, data: unknown) => void;
6
7
  }
7
8
  export declare function newCometClient(user: User, cometServerURL: string): {
8
9
  isStarted: boolean;
@@ -3,8 +3,8 @@ import { getToken } from "./api-client.js";
3
3
  import { useApiActions } from "./composables/index.js";
4
4
  import { apiHelper } from "./helpers/index.js";
5
5
  import { useBus } from "./index.js";
6
- if (typeof window !== "undefined" && import.meta.env.VITE_MODE !== "production") {
7
- window.wsPublish = (eventName, data) => {
6
+ if (globalThis.window !== void 0 && import.meta.env.VITE_MODE !== "production") {
7
+ globalThis.wsPublish = (eventName, data) => {
8
8
  const bus = useBus();
9
9
  setTimeout(() => bus.publish(`WS.${eventName}`, data), 0);
10
10
  };
@@ -1,11 +1,12 @@
1
1
  import { useLocalStorage } from "@vueuse/core";
2
2
  export const useAppLocale = () => {
3
+ const namespace = import.meta.env.VITE_APP_NAMESPACE ?? "app";
3
4
  let value = "en";
4
- if (typeof window !== "undefined" && window.navigator.language) {
5
- value = window.navigator.language.split("-")[0] ?? "en";
5
+ if (globalThis.window !== void 0 && globalThis.navigator.language) {
6
+ value = globalThis.navigator.language.split("-", 1)[0] ?? "en";
6
7
  }
7
8
  return useLocalStorage(
8
- "app-preferences-locale",
9
+ `${namespace}-preferences-locale`,
9
10
  { value },
10
11
  {
11
12
  serializer: {
@@ -9,7 +9,7 @@ const CookieDefaults = {
9
9
  decode: (val) => destr(decodeURIComponent(val)),
10
10
  encode: (val) => encodeURIComponent(typeof val === "string" ? val : JSON.stringify(val))
11
11
  };
12
- const store = typeof window !== "undefined" ? window.cookieStore : void 0;
12
+ const store = globalThis.window === void 0 ? void 0 : globalThis.cookieStore;
13
13
  export function useCookies(name, _opts) {
14
14
  const opts = { ...CookieDefaults, ..._opts };
15
15
  opts.filter ??= (key) => key === name;
@@ -63,11 +63,11 @@ export function useCookies(name, _opts) {
63
63
  if (store) {
64
64
  const changeHandler = (event) => {
65
65
  const changedCookie = event.changed.find((c) => c.name === name);
66
- const removedCookie = event.deleted.find((c) => c.name === name);
66
+ const hasRemovedCookie = event.deleted.some((c) => c.name === name);
67
67
  if (changedCookie) {
68
68
  handleChange({ value: changedCookie.value });
69
69
  }
70
- if (removedCookie) {
70
+ if (hasRemovedCookie) {
71
71
  handleChange({ value: null });
72
72
  }
73
73
  };
@@ -3,8 +3,7 @@ export declare const useSubscribe: <T>(eventName: string, func: (data: T) => voi
3
3
  once?: boolean;
4
4
  unsubscribeOnUnmount?: boolean;
5
5
  }) => Subscription | undefined;
6
- declare const _default: <T>(eventName: string, func: (data: T) => void, options?: {
6
+ export default function subscribe<T>(eventName: string, func: (data: T) => void, options?: {
7
7
  once?: boolean;
8
8
  unsubscribeOnUnmount?: boolean;
9
- }) => Subscription | undefined;
10
- export default _default;
9
+ }): Subscription | undefined;
@@ -1,6 +1,6 @@
1
1
  import { onMounted, onUnmounted } from "vue";
2
2
  import { useBus } from "../index.js";
3
- export const useSubscribe = (eventName, func, options = { once: false, unsubscribeOnUnmount: true }) => {
3
+ export const useSubscribe = (eventName, func, options = {}) => {
4
4
  const bus = useBus();
5
5
  let subscription;
6
6
  onMounted(() => {
@@ -12,12 +12,12 @@ export const useSubscribe = (eventName, func, options = { once: false, unsubscri
12
12
  });
13
13
  });
14
14
  onUnmounted(() => {
15
- if (options.unsubscribeOnUnmount) {
15
+ if (options.unsubscribeOnUnmount ?? true) {
16
16
  subscription?.unsubscribe();
17
17
  }
18
18
  });
19
19
  return subscription;
20
20
  };
21
- export default (eventName, func, options) => {
21
+ export default function subscribe(eventName, func, options) {
22
22
  return useSubscribe(eventName, func, options);
23
- };
23
+ }
@@ -1,8 +1,9 @@
1
1
  import { useLocalStorage, usePreferredDark } from "@vueuse/core";
2
2
  export const useThemeMode = () => {
3
+ const namespace = import.meta.env.VITE_APP_NAMESPACE ?? "app";
3
4
  const isDark = usePreferredDark();
4
5
  return useLocalStorage(
5
- "app-preferences-theme",
6
+ `${namespace}-preferences-theme`,
6
7
  { value: isDark.value ? "dark" : "light" },
7
8
  {
8
9
  serializer: {
@@ -4,7 +4,7 @@ import { createSingletonAsync, once } from "./helpers/index.js";
4
4
  import { getVisitorId } from "./local-storage-utils.js";
5
5
  const setVisitor = (newVisitor) => {
6
6
  const visitor = useVisitor();
7
- visitor.value = !visitor.value ? newVisitor : { ...visitor.value, ...newVisitor };
7
+ visitor.value = visitor.value ? { ...visitor.value, ...newVisitor } : newVisitor;
8
8
  };
9
9
  const getVisitorRequest = async (config) => {
10
10
  const visitor = useVisitor();
@@ -1,7 +1,7 @@
1
1
  const device = {}
2
2
 
3
3
  // https://github.com/matthewhudson/current-device
4
- if (typeof window !== "undefined") {
4
+ if (globalThis.window !== undefined) {
5
5
  // Public functions to get the current value of type, os, or orientation.
6
6
  const findMatch = arr => {
7
7
  for (const name of arr) {
@@ -29,9 +29,8 @@ if (typeof window !== "undefined") {
29
29
 
30
30
  // Add one or more CSS classes to the <html> element.
31
31
  const addClass = className => {
32
- let currentClassNames = null
33
32
  if (!hasClass(className)) {
34
- currentClassNames = documentElement.classList.toString().trim()
33
+ const currentClassNames = documentElement.classList.toString().trim()
35
34
  documentElement.className = `${currentClassNames} ${className}`
36
35
  }
37
36
  }
@@ -68,19 +67,19 @@ if (typeof window !== "undefined") {
68
67
  }
69
68
 
70
69
  // Save the previous value of the device variable.
71
- const previousDevice = window.device
70
+ const previousDevice = globalThis.device
72
71
 
73
72
  const changeOrientationList = []
74
73
 
75
74
  // Add device as a global object.
76
- window.device = device
75
+ globalThis.device = device
77
76
 
78
77
  // The <html> element.
79
- const documentElement = window.document.documentElement
78
+ const documentElement = globalThis.document.documentElement
80
79
 
81
80
  // The client user agent string.
82
81
  // Lowercase, so we can use the more efficient indexOf(), instead of Regex
83
- const userAgent = window.navigator.userAgent.toLowerCase()
82
+ const userAgent = globalThis.navigator.userAgent.toLowerCase()
84
83
 
85
84
  // Detectable television devices.
86
85
  const television = [
@@ -177,7 +176,7 @@ if (typeof window !== "undefined") {
177
176
  }
178
177
 
179
178
  device.cordova = function () {
180
- return window.cordova && location.protocol === "file:"
179
+ return globalThis.cordova && location.protocol === "file:"
181
180
  }
182
181
 
183
182
  device.mobile = function () {
@@ -237,7 +236,7 @@ if (typeof window !== "undefined") {
237
236
  // Run device.js in noConflict mode,
238
237
  // returning the device variable to its previous owner.
239
238
  device.noConflict = function () {
240
- window.device = previousDevice
239
+ globalThis.device = previousDevice
241
240
  return this
242
241
  }
243
242
 
@@ -1,7 +1,7 @@
1
1
  export { apiHelper } from "./api-helper.js";
2
+ export * from "./composables.js";
2
3
  export { deviceHelper, type Device } from "./device-helper.js";
3
4
  export { phoneHelper } from "./phone-helper.js";
4
5
  export { stringHelper } from "./string-helper.js";
5
- export * from "./composables.js";
6
6
  export declare function once<T extends (...args: any[]) => any>(fn: T): T;
7
7
  export declare function createSingletonAsync<T, Args extends unknown[]>(fn: (...args: Args) => Promise<T>): (...args: Args) => Promise<T>;
@@ -1,8 +1,8 @@
1
1
  export { apiHelper } from "./api-helper.js";
2
+ export * from "./composables.js";
2
3
  export { deviceHelper } from "./device-helper.js";
3
4
  export { phoneHelper } from "./phone-helper.js";
4
5
  export { stringHelper } from "./string-helper.js";
5
- export * from "./composables.js";
6
6
  export function once(fn) {
7
7
  let executed = false;
8
8
  let result;
@@ -1,8 +1,8 @@
1
1
  import { type Ref } from "vue";
2
2
  import type { Fetch, FetchConfig } from "./types.js";
3
- export { defineVuePlugins } from "./define-vue-plugins.js";
4
3
  export { default as AppProvider, useBus } from "./AppProvider.vue.js";
5
4
  export * from "./composables/index.js";
5
+ export { defineVuePlugins } from "./define-vue-plugins.js";
6
6
  export * from "./types.js";
7
7
  export declare function initApiFetch($fetch: Fetch, config: FetchConfig): {
8
8
  fetch: Fetch;
@@ -9,9 +9,9 @@ import { createApiGetVisitorIdentifier } from "./get-visitor.js";
9
9
  import { createInitApplication } from "./init-application.js";
10
10
  import { createApiRefreshToken } from "./refresh-token.js";
11
11
  import { createApiUserActions } from "./user-actions.js";
12
- export { defineVuePlugins } from "./define-vue-plugins.js";
13
12
  export { default as AppProvider, useBus } from "./AppProvider.vue";
14
13
  export * from "./composables/index.js";
14
+ export { defineVuePlugins } from "./define-vue-plugins.js";
15
15
  export * from "./types.js";
16
16
  const apiActions = useApiActions();
17
17
  let userActions;
@@ -23,7 +23,7 @@ export function initApiFetch($fetch, config) {
23
23
  const refreshToken = createApiRefreshToken(fetch, config);
24
24
  userActions = ref(createApiUserActions(fetch, config, getUser));
25
25
  apiActions.value = { getVisitorIdentifier, refreshToken };
26
- if (typeof window !== "undefined") {
26
+ if (globalThis.window !== void 0) {
27
27
  const loggedIn = useLocalStorage("lin", "no");
28
28
  const cometServerURL = config.cometServerURL;
29
29
  let cometClient;
@@ -1,22 +1,23 @@
1
+ const namespace = import.meta.env.VITE_APP_NAMESPACE ?? "app";
1
2
  export const getSessionId = () => {
2
- if (typeof window !== "undefined") {
3
- return window.localStorage.getItem("sid");
3
+ if (globalThis.window !== void 0) {
4
+ return globalThis.localStorage.getItem(`${namespace}-sid`);
4
5
  }
5
6
  return null;
6
7
  };
7
8
  export const setSessionId = (sessionId = "") => {
8
- if (typeof window !== "undefined") {
9
- window.localStorage.setItem("sid", sessionId);
9
+ if (globalThis.window !== void 0) {
10
+ globalThis.localStorage.setItem(`${namespace}-sid`, sessionId);
10
11
  }
11
12
  };
12
13
  export const getVisitorId = () => {
13
- if (typeof window !== "undefined") {
14
- return window.localStorage.getItem("vid");
14
+ if (globalThis.window !== void 0) {
15
+ return globalThis.localStorage.getItem(`${namespace}-vid`);
15
16
  }
16
17
  return null;
17
18
  };
18
19
  export const setVisitorId = (visitorId = "") => {
19
- if (typeof window !== "undefined") {
20
- window.localStorage.setItem("vid", visitorId);
20
+ if (globalThis.window !== void 0) {
21
+ globalThis.localStorage.setItem(`${namespace}-vid`, visitorId);
21
22
  }
22
23
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@inzombieland/core",
3
- "version": "1.20.4",
4
3
  "type": "module",
4
+ "version": "1.20.7",
5
5
  "license": "ISC",
6
6
  "main": "./index.js",
7
7
  "types": "./index.d.ts",
@@ -9,7 +9,7 @@ export const createApiUserActions = once(
9
9
  const response = await fetch("/account/0/signin", {
10
10
  body,
11
11
  method: "POST",
12
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
12
+ ...config.useRequestHeaders?.(["cookie"])
13
13
  });
14
14
  const { key, ...rest } = response;
15
15
  if (key) {
@@ -21,7 +21,7 @@ export const createApiUserActions = once(
21
21
  const response = await fetch("/account/0/signinbycode/verifycode", {
22
22
  body,
23
23
  method: "POST",
24
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
24
+ ...config.useRequestHeaders?.(["cookie"])
25
25
  });
26
26
  const { accessToken, sessionId, visitorId, secretKey, ...rest } = response;
27
27
  if (!accessToken || !sessionId || !visitorId || !secretKey) {
@@ -37,7 +37,7 @@ export const createApiUserActions = once(
37
37
  const response = await fetch("/account/0/token", {
38
38
  body,
39
39
  method: "POST",
40
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
40
+ ...config.useRequestHeaders?.(["cookie"])
41
41
  });
42
42
  const { accessToken, ...rest } = response;
43
43
  if (!accessToken) {
@@ -50,21 +50,21 @@ export const createApiUserActions = once(
50
50
  return await fetch("/account/0/signup", {
51
51
  body,
52
52
  method: "POST",
53
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
53
+ ...config.useRequestHeaders?.(["cookie"])
54
54
  });
55
55
  },
56
56
  confirmEmail: async (body) => {
57
57
  return await fetch("/account/0/signup", {
58
58
  body,
59
59
  method: "PUT",
60
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
60
+ ...config.useRequestHeaders?.(["cookie"])
61
61
  });
62
62
  },
63
63
  resendActivationEmail: async (body) => {
64
64
  return await fetch("/account/0/signup", {
65
65
  body,
66
66
  method: "PATCH",
67
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
67
+ ...config.useRequestHeaders?.(["cookie"])
68
68
  });
69
69
  },
70
70
  logout: async () => {
@@ -81,21 +81,21 @@ export const createApiUserActions = once(
81
81
  return await fetch("/account/0/recovery", {
82
82
  body,
83
83
  method: "POST",
84
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
84
+ ...config.useRequestHeaders?.(["cookie"])
85
85
  });
86
86
  },
87
87
  confirmRecovery: async (body) => {
88
88
  return await fetch("/account/0/recovery", {
89
89
  body,
90
90
  method: "PATCH",
91
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
91
+ ...config.useRequestHeaders?.(["cookie"])
92
92
  });
93
93
  },
94
94
  resetPassword: async (body) => {
95
95
  return await fetch("/account/0/recovery", {
96
96
  body,
97
97
  method: "PUT",
98
- ...config.useRequestHeaders?.(["cookie"]) ?? {}
98
+ ...config.useRequestHeaders?.(["cookie"])
99
99
  });
100
100
  },
101
101
  changeName: async (body) => {
@@ -13,7 +13,7 @@ const pageTitle = ref("");
13
13
  const layersLimit = 5;
14
14
  function getLayerHash(s) {
15
15
  const hash = s.split("").reduce((a, b) => {
16
- a = (a << 5) - a + b.charCodeAt(0);
16
+ a = (a << 5) - a + (b.codePointAt(0) ?? 0);
17
17
  return a & a;
18
18
  }, 0);
19
19
  return Math.abs(hash).toString();
@@ -24,11 +24,11 @@ const createLayer = (name, params) => {
24
24
  layerId: getLayerHash(name),
25
25
  component: name.charAt(0).toUpperCase() + name.slice(1),
26
26
  params: Object.assign({}, history.value.query, params),
27
- closeLayer: typeof window !== "undefined" ? () => {
28
- } : void 0
27
+ closeLayer: globalThis.window === void 0 ? void 0 : () => {
28
+ }
29
29
  };
30
30
  };
31
- const resolveLayer = (layerName, options = { isCloseOtherLayers: false }, params) => {
31
+ const resolveLayer = (layerName, options, params) => {
32
32
  const activeLayer = activeLayers.value.find(({ name }) => name === layerName);
33
33
  if (activeLayer) {
34
34
  const layer = activeLayers.value.splice(activeLayers.value.indexOf(activeLayer), 1)[0];
@@ -39,7 +39,7 @@ const resolveLayer = (layerName, options = { isCloseOtherLayers: false }, params
39
39
  activeLayers.value.push(layer);
40
40
  }
41
41
  } else {
42
- if (options.isCloseOtherLayers) {
42
+ if (options?.isCloseOtherLayers) {
43
43
  activeLayers.value = [];
44
44
  }
45
45
  if (activeLayers.value.length >= layersLimit) {
@@ -94,13 +94,13 @@ watch(reactiveHistory, (value, prevValue) => {
94
94
  document.title = pageTitle.value;
95
95
  }
96
96
  } else if (value.query.layer) {
97
- if (value.query.layer !== prevValue.query.layer) {
98
- resolveLayer(value.query.layer.toString());
99
- } else {
97
+ if (value.query.layer === prevValue.query.layer) {
100
98
  const activeLayer = activeLayers.value.find(({ name }) => name === value.query.layer);
101
99
  if (activeLayer) {
102
100
  activeLayer.params = value.query;
103
101
  }
102
+ } else {
103
+ resolveLayer(value.query.layer.toString());
104
104
  }
105
105
  } else if (activeLayers.value.length > 0) {
106
106
  activeLayers.value = [];
@@ -114,7 +114,7 @@ onMounted(() => {
114
114
  open: (layerName, params) => {
115
115
  if (params?.mode === "router") {
116
116
  const { mode, ...restParams } = params;
117
- router.push({ path: history.value.path, query: { layer: layerName, ...restParams ?? {} } });
117
+ router.push({ path: history.value.path, query: { layer: layerName, ...restParams } });
118
118
  } else {
119
119
  resolveLayer(layerName, void 0, params);
120
120
  }
@@ -126,7 +126,7 @@ onMounted(() => {
126
126
  closeAllLayers();
127
127
  }
128
128
  };
129
- window.addEventListener("keyup", (event) => {
129
+ globalThis.addEventListener("keyup", (event) => {
130
130
  if (event.key === "Escape") {
131
131
  const lastLayer = activeLayers.value.at(-1);
132
132
  if (lastLayer) {
@@ -0,0 +1,335 @@
1
+ @charset "utf-8";
2
+
3
+ @font-face {
4
+ font-family: icon-font-layer-close;
5
+ src: url("data:application/font-woff;base64,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");
6
+ font-weight: 400;
7
+ font-style: normal;
8
+ }
9
+
10
+ .layer-header {
11
+ background: var(--color-surface-container-low);
12
+ height: 50px;
13
+ padding: 0 24px 0 52px;
14
+ box-sizing: border-box;
15
+ align-items: center;
16
+ display: flex;
17
+ justify-content: flex-start;
18
+ position: relative;
19
+ z-index: 100;
20
+ }
21
+
22
+ /* light */
23
+ .layer-header {
24
+ color: #243036;
25
+ box-shadow: inset 0 -1px 0 rgba(218, 220, 224, 0.6);
26
+ }
27
+
28
+ .dark .layer-header {
29
+ color: rgba(255, 255, 255, 0.87);
30
+ box-shadow: inset 0 -1px 0 rgba(64, 64, 64, 0.9) !important;
31
+ }
32
+
33
+ .layer-header > h1 {
34
+ display: inline-block;
35
+ flex: 1 1 0;
36
+ font-size: 20px;
37
+ font-weight: 400;
38
+ line-height: 1;
39
+ text-align: left;
40
+ margin: 0;
41
+ padding-right: 28px;
42
+ -webkit-font-smoothing: antialiased;
43
+ -moz-osx-font-smoothing: grayscale;
44
+ }
45
+
46
+ /* light */
47
+ .layer-header > h1 {
48
+ color: #243036;
49
+ }
50
+
51
+ .dark .layer-header > h1 {
52
+ color: rgba(255, 255, 255, 0.87);
53
+ }
54
+
55
+ .layer-footer {
56
+ background: var(--color-surface-container-low);
57
+ box-sizing: border-box;
58
+ transition: box-shadow 0.5s;
59
+ padding: 0 32px 0 52px;
60
+ align-items: center;
61
+ display: flex;
62
+ justify-content: flex-start;
63
+ position: absolute;
64
+ left: 0;
65
+ bottom: 0;
66
+ width: 100%;
67
+ height: 40px;
68
+ z-index: 1;
69
+ }
70
+
71
+ /* light */
72
+ .layer-footer {
73
+ color: #243036;
74
+ box-shadow: 0 -6px 5px -7px rgba(45, 70, 104, 0.3);
75
+ }
76
+
77
+ .dark .layer-footer {
78
+ color: rgba(255, 255, 255, 0.87);
79
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
80
+ }
81
+
82
+ .layer-main {
83
+ background: var(--color-surface-layer-high);
84
+ position: absolute;
85
+ top: 50px;
86
+ left: 0;
87
+ bottom: 0;
88
+ overflow-y: auto;
89
+ margin: 0;
90
+ padding: 3rem 0;
91
+ width: 100%;
92
+ -webkit-overflow-scrolling: auto;
93
+ }
94
+
95
+ /* light */
96
+ .layer-main {
97
+ color: #243036;
98
+ }
99
+
100
+ .dark .layer-main {
101
+ color: rgba(255, 255, 255, 0.87);
102
+ }
103
+
104
+ .layer-main.layer-main__with__footer {
105
+ bottom: 40px;
106
+ }
107
+
108
+ .layer-content {
109
+ width: 80%;
110
+ max-width: 512px;
111
+ min-width: 320px;
112
+ margin: 0 auto;
113
+ }
114
+
115
+ .layer {
116
+ background: var(--color-surface-layer-high);
117
+ position: fixed;
118
+ top: 0;
119
+ right: 0;
120
+ bottom: 0;
121
+ left: auto;
122
+ box-sizing: border-box;
123
+ width: 50%;
124
+ max-width: 1000px;
125
+ opacity: 0;
126
+ transform: translateX(150px) translateZ(0);
127
+ transition:
128
+ width 0.4s ease,
129
+ max-width 0.4s ease,
130
+ opacity 0.1s cubic-bezier(0.33, 0.13, 0.32, 1),
131
+ transform 0.3s cubic-bezier(0.33, 0.13, 0.32, 1);
132
+ z-index: 1111;
133
+ }
134
+
135
+ .layer.default {
136
+ width: 66.6667%;
137
+ }
138
+
139
+ .layer.large {
140
+ width: 66.6667%;
141
+ }
142
+
143
+ .layer.medium {
144
+ width: 50%;
145
+ }
146
+
147
+ .layer.small {
148
+ width: 33.3333%;
149
+ }
150
+
151
+ /* light */
152
+ .layer {
153
+ box-shadow: -4px 10px 30px rgba(45, 70, 104, 0.25);
154
+ }
155
+
156
+ .dark .layer {
157
+ box-shadow: -1px 0 0 0 rgba(64, 64, 64, 0.9);
158
+ }
159
+
160
+ .layout {
161
+ position: absolute;
162
+ top: 0;
163
+ right: 0;
164
+ bottom: 0;
165
+ left: 0;
166
+ width: 100%;
167
+ height: 100%;
168
+ transform: none;
169
+ transition:
170
+ width 0.4s ease,
171
+ max-width 0.4s ease,
172
+ opacity 0.1s cubic-bezier(0.33, 0.13, 0.32, 1),
173
+ transform 0.3s cubic-bezier(0.33, 0.13, 0.32, 1);
174
+ box-shadow: -4px 10px 30px rgba(45, 70, 104, 0.25);
175
+ }
176
+
177
+ @media (max-width: 767px) {
178
+ .layer {
179
+ width: 100%;
180
+ min-width: 320px;
181
+ }
182
+
183
+ .layer.default,
184
+ .layer.large,
185
+ .layer.medium,
186
+ .layer.small {
187
+ width: 100%;
188
+ }
189
+
190
+ .layout.layer-open {
191
+ transform: translateX(-20%) translateZ(0);
192
+ }
193
+
194
+ .layout.layer-hide {
195
+ transform: none;
196
+ transition:
197
+ width 0.4s ease,
198
+ max-width 0.4s ease,
199
+ opacity 0.3s cubic-bezier(0.69, 0.08, 0.72, 0.59),
200
+ transform 0.3s cubic-bezier(0.69, 0.08, 0.72, 0.59) !important;
201
+ }
202
+
203
+ .layer-header {
204
+ justify-content: center;
205
+ }
206
+
207
+ .layer-header > h1 {
208
+ font-size: 15px;
209
+ font-weight: 600;
210
+ text-align: center;
211
+ }
212
+
213
+ .layer-main {
214
+ padding: 2rem 1rem;
215
+ }
216
+
217
+ .layer-content {
218
+ width: 100%;
219
+ max-width: 512px;
220
+ min-width: 280px;
221
+ }
222
+
223
+ .layer-close {
224
+ top: 16px !important;
225
+ }
226
+
227
+ .layer-close:before {
228
+ font-size: 20px !important;
229
+ content: "\64" !important;
230
+ }
231
+ }
232
+
233
+ .layer.open {
234
+ opacity: 1 !important;
235
+ transform: translateX(0) translateZ(0);
236
+ }
237
+
238
+ .layer.open:nth-last-of-type(n + 2) {
239
+ transform: translateX(-12px);
240
+ }
241
+
242
+ .layer.open:nth-last-of-type(n + 3) {
243
+ transform: translateX(-24px);
244
+ }
245
+
246
+ .layer.open:nth-last-of-type(n + 4) {
247
+ transform: translateX(-36px);
248
+ }
249
+
250
+ .layer.open:nth-last-of-type(n + 5) {
251
+ transform: translateX(-48px);
252
+ }
253
+
254
+ .layer.hide {
255
+ opacity: 0 !important;
256
+ transform: translateX(150px) translateZ(0);
257
+ transition:
258
+ width 0.4s ease,
259
+ max-width 0.4s ease,
260
+ opacity 0.3s cubic-bezier(0.69, 0.08, 0.72, 0.59),
261
+ transform 0.3s cubic-bezier(0.69, 0.08, 0.72, 0.59) !important;
262
+ pointer-events: none;
263
+ }
264
+
265
+ .layer-close {
266
+ position: absolute;
267
+ top: 15px;
268
+ left: 16px;
269
+ width: 20px;
270
+ height: 20px;
271
+ display: flex;
272
+ justify-content: center;
273
+ align-items: center;
274
+ font-size: 15px;
275
+ line-height: 0;
276
+ text-decoration: none;
277
+ transition: color 0.2s;
278
+ z-index: 110;
279
+ }
280
+
281
+ /* light */
282
+ .layer-close {
283
+ color: #243036;
284
+ }
285
+
286
+ .dark .layer-close {
287
+ color: rgba(255, 255, 255, 0.87);
288
+ }
289
+
290
+ /* light */
291
+ .layer-close:hover {
292
+ color: rgba(36, 48, 54, 0.7);
293
+ }
294
+
295
+ .dark .layer-close:hover {
296
+ color: rgba(255, 255, 255, 0.67);
297
+ }
298
+
299
+ .layer-close:before {
300
+ font-family: icon-font-layer-close !important;
301
+ font-style: normal !important;
302
+ font-weight: 400 !important;
303
+ font-variant: normal !important;
304
+ text-transform: none !important;
305
+ speak: none;
306
+ line-height: 1;
307
+ -webkit-font-smoothing: antialiased;
308
+ -moz-osx-font-smoothing: grayscale;
309
+ content: "\77";
310
+ }
311
+
312
+ .layer,
313
+ .layout {
314
+ top: env(safe-area-inset-top);
315
+ bottom: env(safe-area-inset-bottom);
316
+ height: calc(100% - (env(safe-area-inset-top) + env(safe-area-inset-bottom))) !important;
317
+ }
318
+
319
+ .layer::before,
320
+ .layout::before {
321
+ background: var(--color-surface-container-low);
322
+ display: block;
323
+ position: absolute;
324
+ top: calc(env(safe-area-inset-top) * -1);
325
+ right: 0;
326
+ bottom: 0;
327
+ left: calc(env(safe-area-inset-top) * -1);
328
+ height: env(safe-area-inset-top);
329
+ content: "";
330
+ z-index: 9999;
331
+ }
332
+
333
+ .layout.base-main::before {
334
+ background: var(--color-surface-container-low);
335
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@inzombieland/layer-manager",
3
- "version": "1.17.7",
4
3
  "type": "module",
4
+ "version": "1.17.9",
5
5
  "license": "ISC",
6
6
  "main": "./index.mjs",
7
7
  "types": "./index.d.ts",
@@ -1,6 +1,6 @@
1
+ import { watch } from "vue";
1
2
  import { addRouteMiddleware, defineNuxtPlugin } from "#app";
2
3
  import { useNuxtApp, useRequestHeaders, useRuntimeConfig, useState } from "#imports";
3
- import { watch } from "vue";
4
4
  import { authMiddleware, guestMiddleware, localeMiddleware } from "./middleware/index.js";
5
5
  import { defineVuePlugins, useThemeMode } from "./packages/core/index.js";
6
6
  import { flush, setToken, setUser } from "./packages/core/api-client.js";
@@ -1,6 +1,6 @@
1
+ import { deviceHelper } from "../packages/core/helpers/index.js";
1
2
  import { defineNuxtPlugin } from "#app";
2
3
  import { useNuxtApp } from "#imports";
3
- import { deviceHelper } from "../packages/core/helpers/index.js";
4
4
  export default defineNuxtPlugin(() => {
5
5
  const device = deviceHelper();
6
6
  return {
@@ -1,5 +1,5 @@
1
- import { useRuntimeConfig } from "#imports";
2
1
  import { defineEventHandler, getRequestHeader, parseCookies } from "h3";
2
+ import { useRuntimeConfig } from "#imports";
3
3
  export default defineEventHandler(async (event) => {
4
4
  const cookies = parseCookies(event);
5
5
  if (cookies.lin !== "yes") {
@@ -1,5 +1,5 @@
1
- import { useRuntimeConfig } from "#imports";
2
1
  import { defineEventHandler, parseCookies } from "h3";
2
+ import { useRuntimeConfig } from "#imports";
3
3
  export default defineEventHandler(async (event) => {
4
4
  const cookies = parseCookies(event);
5
5
  if (cookies.lin !== "yes") {
@@ -1,6 +1,6 @@
1
1
  import { cookieHelper } from "@inzombieland/nuxt-common/helpers";
2
- import { useRuntimeConfig } from "#imports";
3
2
  import { appendHeader, defineEventHandler, readBody } from "h3";
3
+ import { useRuntimeConfig } from "#imports";
4
4
  export default defineEventHandler(async (event) => {
5
5
  const config = useRuntimeConfig();
6
6
  const request = String(config.public.apiBaseURL) + String(event.node.req.url);
@@ -1,5 +1,5 @@
1
- import { useRuntimeConfig } from "#imports";
2
1
  import { defineEventHandler, getRequestHeader } from "h3";
2
+ import { useRuntimeConfig } from "#imports";
3
3
  export default defineEventHandler((event) => {
4
4
  const config = useRuntimeConfig();
5
5
  let authorization = "";
@@ -1,6 +1,6 @@
1
1
  import { cookieHelper } from "@inzombieland/nuxt-common/helpers";
2
- import { useRuntimeConfig } from "#imports";
3
2
  import { appendHeader, defineEventHandler, parseCookies } from "h3";
3
+ import { useRuntimeConfig } from "#imports";
4
4
  export default defineEventHandler(async (event) => {
5
5
  const cookies = parseCookies(event);
6
6
  if (cookies.lin !== "yes") {
@@ -1,5 +1,5 @@
1
- import { useNuxtApp, useRequestHeaders, useRequestURL } from "#imports";
2
1
  import { initApiFetch } from "../../packages/core/index.js";
2
+ import { useNuxtApp, useRequestHeaders, useRequestURL } from "#imports";
3
3
  export const config = {
4
4
  apiBaseURL: import.meta.env.VITE_API_BASE_URL,
5
5
  cometServerURL: import.meta.env.VITE_COMET_SERVER_URL,
@@ -1,6 +1,6 @@
1
1
  import { Buffer } from "node:buffer";
2
- import { useRuntimeConfig } from "#imports";
3
2
  import { defineEventHandler } from "h3";
3
+ import { useRuntimeConfig } from "#imports";
4
4
  export default defineEventHandler((event) => {
5
5
  let basicAuthEnabled = false;
6
6
  let basicAuthUsers;
@@ -17,7 +17,7 @@ export default defineEventHandler((event) => {
17
17
  return;
18
18
  }
19
19
  let authenticated = false;
20
- const credentials = event.node.req.headers?.authorization?.split(" ")[1];
20
+ const credentials = event.node.req.headers?.authorization?.split(" ", 2)[1];
21
21
  if (credentials) {
22
22
  const [username, password] = Buffer.from(credentials, "base64").toString("ascii").split(":");
23
23
  const users = Array.isArray(config.users) ? config.users : config.users.split(",").map((user) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inzombieland/nuxt-common",
3
- "version": "1.20.4",
3
+ "version": "1.20.7",
4
4
  "license": "ISC",
5
5
  "type": "module",
6
6
  "exports": {
@@ -57,15 +57,13 @@
57
57
  "@nuxt/schema": "^4.3.0",
58
58
  "@nuxtjs/i18n": "^10.2.1",
59
59
  "@nuxtjs/tailwindcss": "^6.14.0",
60
- "@pinia/colada": "^0.21.2",
61
- "@pinia/colada-nuxt": "^0.3.1",
62
60
  "@pinia/nuxt": "^0.11.3",
63
61
  "@primeuix/themes": "^1.2.3",
64
62
  "@primevue/nuxt-module": "^4.3.9",
65
63
  "@rollup/plugin-commonjs": "^26.0.3",
66
64
  "@rollup/plugin-node-resolve": "^15.3.1",
67
65
  "@rollup/plugin-typescript": "^11.1.6",
68
- "@sxzz/eslint-config": "^6.2.0",
66
+ "@sxzz/eslint-config": "^8.1.1",
69
67
  "@types/node": "^22.18.6",
70
68
  "@vant/nuxt": "^1.0.7",
71
69
  "@vant/touch-emulator": "^1.4.0",
@@ -79,7 +77,7 @@
79
77
  "config": "^3.3.12",
80
78
  "cookie-es": "^2.0.0",
81
79
  "destr": "^2.0.5",
82
- "eslint": "^9.36.0",
80
+ "eslint": "^10.6.0",
83
81
  "klona": "^2.0.6",
84
82
  "lerna": "^8.2.2",
85
83
  "nuxt": "^4.3.0",
@@ -101,5 +99,11 @@
101
99
  "vue-tsc": "^2.2.12",
102
100
  "vue3-otp-input": "^0.5.21",
103
101
  "zod": "^4.1.12"
102
+ },
103
+ "packageManager": "pnpm@10.34.1",
104
+ "pnpm": {
105
+ "peerDependencyRules": {
106
+ "allowedVersions": {}
107
+ }
104
108
  }
105
109
  }