@scalar/use-hooks 0.1.47 → 0.1.48

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 (40) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +7 -0
  5. package/dist/useBindCx/cva.js +11 -9
  6. package/dist/useBindCx/cva.js.map +7 -0
  7. package/dist/useBindCx/cva.test.js +92 -0
  8. package/dist/useBindCx/cva.test.js.map +7 -0
  9. package/dist/useBindCx/index.js +8 -7
  10. package/dist/useBindCx/index.js.map +7 -0
  11. package/dist/useBindCx/useBindCx.js +17 -15
  12. package/dist/useBindCx/useBindCx.js.map +7 -0
  13. package/dist/useBindCx/useBindCx.test.js +173 -0
  14. package/dist/useBindCx/useBindCx.test.js.map +7 -0
  15. package/dist/useBreakpoints/index.js +2 -4
  16. package/dist/useBreakpoints/index.js.map +7 -0
  17. package/dist/useBreakpoints/useBreakpoints.js +17 -14
  18. package/dist/useBreakpoints/useBreakpoints.js.map +7 -0
  19. package/dist/useBreakpoints/useBreakpoints.test.js +49 -0
  20. package/dist/useBreakpoints/useBreakpoints.test.js.map +7 -0
  21. package/dist/useClipboard/index.js +2 -4
  22. package/dist/useClipboard/index.js.map +7 -0
  23. package/dist/useClipboard/types.js +1 -0
  24. package/dist/useClipboard/types.js.map +7 -0
  25. package/dist/useClipboard/useClipboard.d.ts +1 -1
  26. package/dist/useClipboard/useClipboard.js +14 -9
  27. package/dist/useClipboard/useClipboard.js.map +7 -0
  28. package/dist/useClipboard/useClipboard.test.js +70 -0
  29. package/dist/useClipboard/useClipboard.test.js.map +7 -0
  30. package/dist/useColorMode/index.d.ts +1 -1
  31. package/dist/useColorMode/index.js +3 -4
  32. package/dist/useColorMode/index.js.map +7 -0
  33. package/dist/useColorMode/types.js +1 -0
  34. package/dist/useColorMode/types.js.map +7 -0
  35. package/dist/useColorMode/useColorMode.d.ts +1 -1
  36. package/dist/useColorMode/useColorMode.js +67 -41
  37. package/dist/useColorMode/useColorMode.js.map +7 -0
  38. package/dist/useColorMode/useColorMode.test.js +171 -0
  39. package/dist/useColorMode/useColorMode.test.js.map +7 -0
  40. package/package.json +10 -7
@@ -1,4 +1,4 @@
1
- import type { UseClipboardOptions } from './types';
1
+ import type { UseClipboardOptions } from './types.js';
2
2
  /**
3
3
  * A hook for interacting with the clipboard
4
4
  */
@@ -1,15 +1,20 @@
1
- import { useToasts as c } from "@scalar/use-toasts";
2
- function p(t = {}) {
3
- const { notify: r = (o) => e(o, "info") } = t, { toast: e } = c();
4
- async function a(o) {
1
+ import { useToasts } from "@scalar/use-toasts";
2
+ function useClipboard(opts = {}) {
3
+ const { notify = (m) => toast(m, "info") } = opts;
4
+ const { toast } = useToasts();
5
+ async function copyToClipboard(value) {
5
6
  try {
6
- await navigator.clipboard.writeText(o), r("Copied to the clipboard");
7
- } catch (i) {
8
- console.error(i.message), r("Failed to copy to clipboard");
7
+ await navigator.clipboard.writeText(value);
8
+ notify("Copied to the clipboard");
9
+ } catch (e) {
10
+ const error = e;
11
+ console.error(error.message);
12
+ notify("Failed to copy to clipboard");
9
13
  }
10
14
  }
11
- return { copyToClipboard: a };
15
+ return { copyToClipboard };
12
16
  }
13
17
  export {
14
- p as useClipboard
18
+ useClipboard
15
19
  };
20
+ //# sourceMappingURL=useClipboard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useClipboard/useClipboard.ts"],
4
+ "sourcesContent": ["import { useToasts } from '@scalar/use-toasts'\n\nimport type { UseClipboardOptions } from './types'\n\n/**\n * A hook for interacting with the clipboard\n */\nexport function useClipboard(opts: UseClipboardOptions = {}) {\n const { notify = (m) => toast(m, 'info') } = opts\n const { toast } = useToasts()\n\n async function copyToClipboard(value: string) {\n try {\n await navigator.clipboard.writeText(value)\n notify('Copied to the clipboard')\n } catch (e) {\n const error = e as Error\n console.error(error.message)\n notify('Failed to copy to clipboard')\n }\n }\n\n return { copyToClipboard }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAOnB,SAAS,aAAa,OAA4B,CAAC,GAAG;AAC3D,QAAM,EAAE,SAAS,CAAC,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI;AAC7C,QAAM,EAAE,MAAM,IAAI,UAAU;AAE5B,iBAAe,gBAAgB,OAAe;AAC5C,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK;AACzC,aAAO,yBAAyB;AAAA,IAClC,SAAS,GAAG;AACV,YAAM,QAAQ;AACd,cAAQ,MAAM,MAAM,OAAO;AAC3B,aAAO,6BAA6B;AAAA,IACtC;AAAA,EACF;AAEA,SAAO,EAAE,gBAAgB;AAC3B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,70 @@
1
+ import { useToasts } from "@scalar/use-toasts";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { useClipboard } from "./useClipboard.js";
4
+ vi.mock("@scalar/use-toasts", () => ({
5
+ useToasts: vi.fn().mockReturnValue({
6
+ toast: vi.fn(),
7
+ initializeToasts: vi.fn()
8
+ })
9
+ }));
10
+ describe("useClipboard", () => {
11
+ beforeEach(() => {
12
+ Object.defineProperty(navigator, "clipboard", {
13
+ value: {
14
+ writeText: vi.fn().mockResolvedValue(void 0)
15
+ },
16
+ writable: true
17
+ });
18
+ });
19
+ afterEach(() => {
20
+ vi.clearAllMocks();
21
+ vi.unstubAllGlobals();
22
+ });
23
+ it("copies text to clipboard", async () => {
24
+ const { copyToClipboard } = useClipboard();
25
+ await copyToClipboard("test text");
26
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith("test text");
27
+ });
28
+ it("shows a toast notification when text is copied", async () => {
29
+ const mockToast = vi.fn();
30
+ vi.mocked(useToasts).mockReturnValue({
31
+ toast: mockToast,
32
+ initializeToasts: vi.fn()
33
+ });
34
+ const { copyToClipboard } = useClipboard();
35
+ await copyToClipboard("test text");
36
+ expect(mockToast).toHaveBeenCalledWith("Copied to the clipboard", "info");
37
+ });
38
+ it("calls custom notify function when provided", async () => {
39
+ const customNotify = vi.fn();
40
+ const { copyToClipboard } = useClipboard({ notify: customNotify });
41
+ await copyToClipboard("test text");
42
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith("test text");
43
+ expect(customNotify).toHaveBeenCalledWith("Copied to the clipboard");
44
+ });
45
+ it("handles clipboard errors gracefully", async () => {
46
+ const mockConsole = vi.fn();
47
+ vi.stubGlobal("console", { error: mockConsole });
48
+ Object.defineProperty(navigator, "clipboard", {
49
+ value: {
50
+ writeText: vi.fn().mockRejectedValue(new Error("Clipboard error"))
51
+ },
52
+ writable: true
53
+ });
54
+ const notify = vi.fn();
55
+ const { copyToClipboard } = useClipboard({ notify });
56
+ await copyToClipboard("test text");
57
+ expect(notify).toHaveBeenCalledWith("Failed to copy to clipboard");
58
+ expect(mockConsole).toHaveBeenCalledWith("Clipboard error");
59
+ });
60
+ it("works in SSG environment without navigator", async () => {
61
+ const originalNavigator = global.navigator;
62
+ delete global.navigator;
63
+ const notify = vi.fn();
64
+ const { copyToClipboard } = useClipboard({ notify });
65
+ await copyToClipboard("test text");
66
+ expect(notify).toHaveBeenCalledWith("Failed to copy to clipboard");
67
+ global.navigator = originalNavigator;
68
+ });
69
+ });
70
+ //# sourceMappingURL=useClipboard.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useClipboard/useClipboard.test.ts"],
4
+ "sourcesContent": ["import { useToasts } from '@scalar/use-toasts'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { useClipboard } from './useClipboard'\n\nvi.mock('@scalar/use-toasts', () => ({\n useToasts: vi.fn().mockReturnValue({\n toast: vi.fn(),\n initializeToasts: vi.fn(),\n }),\n}))\n\ndescribe('useClipboard', () => {\n beforeEach(() => {\n // Mock clipboard API\n Object.defineProperty(navigator, 'clipboard', {\n value: {\n writeText: vi.fn().mockResolvedValue(undefined),\n },\n writable: true,\n })\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n vi.unstubAllGlobals()\n })\n\n it('copies text to clipboard', async () => {\n const { copyToClipboard } = useClipboard()\n\n await copyToClipboard('test text')\n\n expect(navigator.clipboard.writeText).toHaveBeenCalledWith('test text')\n })\n\n it('shows a toast notification when text is copied', async () => {\n const mockToast = vi.fn()\n vi.mocked(useToasts).mockReturnValue({\n toast: mockToast,\n initializeToasts: vi.fn(),\n })\n\n const { copyToClipboard } = useClipboard()\n await copyToClipboard('test text')\n\n expect(mockToast).toHaveBeenCalledWith('Copied to the clipboard', 'info')\n })\n\n it('calls custom notify function when provided', async () => {\n const customNotify = vi.fn()\n const { copyToClipboard } = useClipboard({ notify: customNotify })\n\n await copyToClipboard('test text')\n\n expect(navigator.clipboard.writeText).toHaveBeenCalledWith('test text')\n expect(customNotify).toHaveBeenCalledWith('Copied to the clipboard')\n })\n\n it('handles clipboard errors gracefully', async () => {\n const mockConsole = vi.fn()\n vi.stubGlobal('console', { error: mockConsole })\n\n // Mock clipboard failure\n Object.defineProperty(navigator, 'clipboard', {\n value: {\n writeText: vi.fn().mockRejectedValue(new Error('Clipboard error')),\n },\n writable: true,\n })\n\n const notify = vi.fn()\n const { copyToClipboard } = useClipboard({ notify })\n\n await copyToClipboard('test text')\n\n expect(notify).toHaveBeenCalledWith('Failed to copy to clipboard')\n expect(mockConsole).toHaveBeenCalledWith('Clipboard error')\n })\n\n it('works in SSG environment without navigator', async () => {\n const originalNavigator = global.navigator\n\n // Mock SSG environment by removing navigator\n // @ts-expect-error\n delete global.navigator\n\n const notify = vi.fn()\n const { copyToClipboard } = useClipboard({ notify })\n\n await copyToClipboard('test text')\n\n // Should show error notification since clipboard is not available\n expect(notify).toHaveBeenCalledWith('Failed to copy to clipboard')\n\n // Restore navigator\n global.navigator = originalNavigator\n })\n})\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAC1B,SAAS,WAAW,YAAY,UAAU,QAAQ,IAAI,UAAU;AAEhE,SAAS,oBAAoB;AAE7B,GAAG,KAAK,sBAAsB,OAAO;AAAA,EACnC,WAAW,GAAG,GAAG,EAAE,gBAAgB;AAAA,IACjC,OAAO,GAAG,GAAG;AAAA,IACb,kBAAkB,GAAG,GAAG;AAAA,EAC1B,CAAC;AACH,EAAE;AAEF,SAAS,gBAAgB,MAAM;AAC7B,aAAW,MAAM;AAEf,WAAO,eAAe,WAAW,aAAa;AAAA,MAC5C,OAAO;AAAA,QACL,WAAW,GAAG,GAAG,EAAE,kBAAkB,MAAS;AAAA,MAChD;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AAED,YAAU,MAAM;AACd,OAAG,cAAc;AACjB,OAAG,iBAAiB;AAAA,EACtB,CAAC;AAED,KAAG,4BAA4B,YAAY;AACzC,UAAM,EAAE,gBAAgB,IAAI,aAAa;AAEzC,UAAM,gBAAgB,WAAW;AAEjC,WAAO,UAAU,UAAU,SAAS,EAAE,qBAAqB,WAAW;AAAA,EACxE,CAAC;AAED,KAAG,kDAAkD,YAAY;AAC/D,UAAM,YAAY,GAAG,GAAG;AACxB,OAAG,OAAO,SAAS,EAAE,gBAAgB;AAAA,MACnC,OAAO;AAAA,MACP,kBAAkB,GAAG,GAAG;AAAA,IAC1B,CAAC;AAED,UAAM,EAAE,gBAAgB,IAAI,aAAa;AACzC,UAAM,gBAAgB,WAAW;AAEjC,WAAO,SAAS,EAAE,qBAAqB,2BAA2B,MAAM;AAAA,EAC1E,CAAC;AAED,KAAG,8CAA8C,YAAY;AAC3D,UAAM,eAAe,GAAG,GAAG;AAC3B,UAAM,EAAE,gBAAgB,IAAI,aAAa,EAAE,QAAQ,aAAa,CAAC;AAEjE,UAAM,gBAAgB,WAAW;AAEjC,WAAO,UAAU,UAAU,SAAS,EAAE,qBAAqB,WAAW;AACtE,WAAO,YAAY,EAAE,qBAAqB,yBAAyB;AAAA,EACrE,CAAC;AAED,KAAG,uCAAuC,YAAY;AACpD,UAAM,cAAc,GAAG,GAAG;AAC1B,OAAG,WAAW,WAAW,EAAE,OAAO,YAAY,CAAC;AAG/C,WAAO,eAAe,WAAW,aAAa;AAAA,MAC5C,OAAO;AAAA,QACL,WAAW,GAAG,GAAG,EAAE,kBAAkB,IAAI,MAAM,iBAAiB,CAAC;AAAA,MACnE;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,SAAS,GAAG,GAAG;AACrB,UAAM,EAAE,gBAAgB,IAAI,aAAa,EAAE,OAAO,CAAC;AAEnD,UAAM,gBAAgB,WAAW;AAEjC,WAAO,MAAM,EAAE,qBAAqB,6BAA6B;AACjE,WAAO,WAAW,EAAE,qBAAqB,iBAAiB;AAAA,EAC5D,CAAC;AAED,KAAG,8CAA8C,YAAY;AAC3D,UAAM,oBAAoB,OAAO;AAIjC,WAAO,OAAO;AAEd,UAAM,SAAS,GAAG,GAAG;AACrB,UAAM,EAAE,gBAAgB,IAAI,aAAa,EAAE,OAAO,CAAC;AAEnD,UAAM,gBAAgB,WAAW;AAGjC,WAAO,MAAM,EAAE,qBAAqB,6BAA6B;AAGjE,WAAO,YAAY;AAAA,EACrB,CAAC;AACH,CAAC;",
6
+ "names": []
7
+ }
@@ -1,3 +1,3 @@
1
1
  export * from './useColorMode.js';
2
- export * from './types';
2
+ export * from './types.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,3 @@
1
- import { useColorMode as r } from "./useColorMode.js";
2
- export {
3
- r as useColorMode
4
- };
1
+ export * from "./useColorMode.js";
2
+ export * from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useColorMode/index.ts"],
4
+ "sourcesContent": ["export * from './useColorMode'\nexport * from './types'\n"],
5
+ "mappings": "AAAA,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,4 +1,4 @@
1
- import type { ColorMode, DarkLightMode, UseColorModeOptions } from './types';
1
+ import type { ColorMode, DarkLightMode, UseColorModeOptions } from './types.js';
2
2
  /**
3
3
  * A composable hook that provides color mode (dark/light) functionality.
4
4
  */
@@ -1,61 +1,87 @@
1
- import { ref as y, computed as a, watch as M, onMounted as h, onUnmounted as g } from "vue";
2
- import { z as p } from "zod";
3
- const o = y("dark"), v = p.enum(["dark", "light", "system"]).optional().catch(void 0);
4
- function L(c = {}) {
5
- var s;
6
- const { initialColorMode: l = "system", overrideColorMode: u } = c;
7
- function m() {
8
- var e;
9
- o.value = r.value === "dark" ? "light" : "dark", !(typeof window > "u") && ((e = window == null ? void 0 : window.localStorage) == null || e.setItem("colorMode", o.value));
1
+ import { computed, onMounted, onUnmounted, ref, watch } from "vue";
2
+ import { z } from "zod";
3
+ const colorMode = ref("dark");
4
+ const colorModeSchema = z.enum(["dark", "light", "system"]).optional().catch(void 0);
5
+ function useColorMode(opts = {}) {
6
+ const { initialColorMode = "system", overrideColorMode } = opts;
7
+ function toggleColorMode() {
8
+ colorMode.value = darkLightMode.value === "dark" ? "light" : "dark";
9
+ if (typeof window === "undefined") {
10
+ return;
11
+ }
12
+ window?.localStorage?.setItem("colorMode", colorMode.value);
10
13
  }
11
- function d(e) {
12
- var t;
13
- o.value = e, !(typeof window > "u") && ((t = window == null ? void 0 : window.localStorage) == null || t.setItem("colorMode", o.value));
14
+ function setColorMode(value) {
15
+ colorMode.value = value;
16
+ if (typeof window === "undefined") {
17
+ return;
18
+ }
19
+ window?.localStorage?.setItem("colorMode", colorMode.value);
14
20
  }
15
- function n() {
16
- var e;
17
- return typeof window > "u" ? "light" : typeof (window == null ? void 0 : window.matchMedia) != "function" || (e = window == null ? void 0 : window.matchMedia("(prefers-color-scheme: dark)")) != null && e.matches ? "dark" : "light";
21
+ function getSystemModePreference() {
22
+ if (typeof window === "undefined") {
23
+ return "light";
24
+ }
25
+ if (typeof window?.matchMedia !== "function") {
26
+ return "dark";
27
+ }
28
+ return window?.matchMedia("(prefers-color-scheme: dark)")?.matches ? "dark" : "light";
18
29
  }
19
- const r = a({
20
- get: () => o.value === "system" ? n() : o.value,
21
- set: d
22
- }), f = a({
23
- get: () => r.value === "dark",
24
- set: (e) => d(e ? "dark" : "light")
30
+ const darkLightMode = computed({
31
+ get: () => colorMode.value === "system" ? getSystemModePreference() : colorMode.value,
32
+ set: setColorMode
33
+ });
34
+ const isDarkMode = computed({
35
+ get: () => darkLightMode.value === "dark",
36
+ set: (value) => setColorMode(value ? "dark" : "light")
25
37
  });
26
- function i(e) {
27
- if (typeof document > "u" || typeof window > "u")
38
+ function applyColorMode(mode) {
39
+ if (typeof document === "undefined" || typeof window === "undefined") {
28
40
  return;
29
- (u ?? (e === "system" ? n() : e)) === "dark" ? (document.body.classList.add("dark-mode"), document.body.classList.remove("light-mode")) : (document.body.classList.add("light-mode"), document.body.classList.remove("dark-mode"));
41
+ }
42
+ const classMode = overrideColorMode ?? (mode === "system" ? getSystemModePreference() : mode);
43
+ if (classMode === "dark") {
44
+ document.body.classList.add("dark-mode");
45
+ document.body.classList.remove("light-mode");
46
+ } else {
47
+ document.body.classList.add("light-mode");
48
+ document.body.classList.remove("dark-mode");
49
+ }
30
50
  }
31
- const w = v.parse(
32
- typeof window < "u" ? (s = window == null ? void 0 : window.localStorage) == null ? void 0 : s.getItem("colorMode") : "system"
51
+ const savedColorMode = colorModeSchema.parse(
52
+ typeof window !== "undefined" ? window?.localStorage?.getItem("colorMode") : "system"
33
53
  );
34
- return o.value = w ?? l, M(o, i, { immediate: !0 }), h(() => {
35
- if (typeof window < "u" && typeof (window == null ? void 0 : window.matchMedia) == "function") {
36
- const e = window.matchMedia("(prefers-color-scheme: dark)"), t = () => o.value === "system" && i("system");
37
- e.addEventListener("change", t), g(() => {
38
- e.removeEventListener("change", t);
54
+ colorMode.value = savedColorMode ?? initialColorMode;
55
+ watch(colorMode, applyColorMode, { immediate: true });
56
+ onMounted(() => {
57
+ if (typeof window !== "undefined" && typeof window?.matchMedia === "function") {
58
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
59
+ const handleChange = () => colorMode.value === "system" && applyColorMode("system");
60
+ mediaQuery.addEventListener("change", handleChange);
61
+ onUnmounted(() => {
62
+ mediaQuery.removeEventListener("change", handleChange);
39
63
  });
40
64
  }
41
- }), {
65
+ });
66
+ return {
42
67
  /** The current color mode (writable). */
43
- colorMode: a({
44
- get: () => o.value,
45
- set: d
68
+ colorMode: computed({
69
+ get: () => colorMode.value,
70
+ set: setColorMode
46
71
  }),
47
72
  /** The computed dark/light mode (writable). */
48
- darkLightMode: r,
73
+ darkLightMode,
49
74
  /** Whether the current color mode is dark (writable). */
50
- isDarkMode: f,
75
+ isDarkMode,
51
76
  /** Toggles the color mode between light and dark. */
52
- toggleColorMode: m,
77
+ toggleColorMode,
53
78
  /** Sets the color mode to the specified value. */
54
- setColorMode: d,
79
+ setColorMode,
55
80
  /** Gets the system mode preference. */
56
- getSystemModePreference: n
81
+ getSystemModePreference
57
82
  };
58
83
  }
59
84
  export {
60
- L as useColorMode
85
+ useColorMode
61
86
  };
87
+ //# sourceMappingURL=useColorMode.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useColorMode/useColorMode.ts"],
4
+ "sourcesContent": ["import { computed, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { z } from 'zod'\n\nimport type { ColorMode, DarkLightMode, UseColorModeOptions } from './types'\n\nconst colorMode = ref<ColorMode>('dark')\n\nconst colorModeSchema = z.enum(['dark', 'light', 'system']).optional().catch(undefined)\n\n/**\n * A composable hook that provides color mode (dark/light) functionality.\n */\nexport function useColorMode(opts: UseColorModeOptions = {}) {\n const { initialColorMode = 'system', overrideColorMode } = opts\n\n /** Toggles the color mode between light and dark. */\n function toggleColorMode() {\n // Update state\n colorMode.value = darkLightMode.value === 'dark' ? 'light' : 'dark'\n\n // Store in local storage\n if (typeof window === 'undefined') {\n return\n }\n window?.localStorage?.setItem('colorMode', colorMode.value)\n }\n\n /** Sets the color mode to the specified value. */\n function setColorMode(value: ColorMode) {\n colorMode.value = value\n if (typeof window === 'undefined') {\n return\n }\n window?.localStorage?.setItem('colorMode', colorMode.value)\n }\n\n /** Gets the system mode preference. */\n function getSystemModePreference(): DarkLightMode {\n if (typeof window === 'undefined') {\n return 'light'\n }\n if (typeof window?.matchMedia !== 'function') {\n return 'dark'\n }\n\n return window?.matchMedia('(prefers-color-scheme: dark)')?.matches ? 'dark' : 'light'\n }\n\n /** Writable computed ref for dark/light mode with system preference applied */\n const darkLightMode = computed<DarkLightMode>({\n get: () => (colorMode.value === 'system' ? getSystemModePreference() : colorMode.value),\n set: setColorMode,\n })\n\n /** Writable computed ref for whether the current color mode is dark */\n const isDarkMode = computed<boolean>({\n get: () => darkLightMode.value === 'dark',\n set: (value) => setColorMode(value ? 'dark' : 'light'),\n })\n\n /** Applies the appropriate color mode class to the body. */\n function applyColorMode(mode: ColorMode): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n return\n }\n\n const classMode = overrideColorMode ?? (mode === 'system' ? getSystemModePreference() : mode)\n\n if (classMode === 'dark') {\n document.body.classList.add('dark-mode')\n document.body.classList.remove('light-mode')\n } else {\n document.body.classList.add('light-mode')\n document.body.classList.remove('dark-mode')\n }\n }\n\n // Priority of initial values is: LocalStorage -> App Config -> initial / Fallback\n const savedColorMode = colorModeSchema.parse(\n typeof window !== 'undefined' ? window?.localStorage?.getItem('colorMode') : 'system',\n )\n colorMode.value = savedColorMode ?? initialColorMode\n\n // Watch for colorMode changes and update the body class\n watch(colorMode, applyColorMode, { immediate: true })\n\n // Listen to system preference changes\n onMounted(() => {\n if (typeof window !== 'undefined' && typeof window?.matchMedia === 'function') {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handleChange = () => colorMode.value === 'system' && applyColorMode('system')\n\n mediaQuery.addEventListener('change', handleChange)\n\n onUnmounted(() => {\n mediaQuery.removeEventListener('change', handleChange)\n })\n }\n })\n\n return {\n /** The current color mode (writable). */\n colorMode: computed({\n get: () => colorMode.value,\n set: setColorMode,\n }),\n /** The computed dark/light mode (writable). */\n darkLightMode,\n /** Whether the current color mode is dark (writable). */\n isDarkMode,\n /** Toggles the color mode between light and dark. */\n toggleColorMode,\n /** Sets the color mode to the specified value. */\n setColorMode,\n /** Gets the system mode preference. */\n getSystemModePreference,\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,UAAU,WAAW,aAAa,KAAK,aAAa;AAC7D,SAAS,SAAS;AAIlB,MAAM,YAAY,IAAe,MAAM;AAEvC,MAAM,kBAAkB,EAAE,KAAK,CAAC,QAAQ,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,MAAS;AAK/E,SAAS,aAAa,OAA4B,CAAC,GAAG;AAC3D,QAAM,EAAE,mBAAmB,UAAU,kBAAkB,IAAI;AAG3D,WAAS,kBAAkB;AAEzB,cAAU,QAAQ,cAAc,UAAU,SAAS,UAAU;AAG7D,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AACA,YAAQ,cAAc,QAAQ,aAAa,UAAU,KAAK;AAAA,EAC5D;AAGA,WAAS,aAAa,OAAkB;AACtC,cAAU,QAAQ;AAClB,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AACA,YAAQ,cAAc,QAAQ,aAAa,UAAU,KAAK;AAAA,EAC5D;AAGA,WAAS,0BAAyC;AAChD,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AACA,QAAI,OAAO,QAAQ,eAAe,YAAY;AAC5C,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ,WAAW,8BAA8B,GAAG,UAAU,SAAS;AAAA,EAChF;AAGA,QAAM,gBAAgB,SAAwB;AAAA,IAC5C,KAAK,MAAO,UAAU,UAAU,WAAW,wBAAwB,IAAI,UAAU;AAAA,IACjF,KAAK;AAAA,EACP,CAAC;AAGD,QAAM,aAAa,SAAkB;AAAA,IACnC,KAAK,MAAM,cAAc,UAAU;AAAA,IACnC,KAAK,CAAC,UAAU,aAAa,QAAQ,SAAS,OAAO;AAAA,EACvD,CAAC;AAGD,WAAS,eAAe,MAAuB;AAC7C,QAAI,OAAO,aAAa,eAAe,OAAO,WAAW,aAAa;AACpE;AAAA,IACF;AAEA,UAAM,YAAY,sBAAsB,SAAS,WAAW,wBAAwB,IAAI;AAExF,QAAI,cAAc,QAAQ;AACxB,eAAS,KAAK,UAAU,IAAI,WAAW;AACvC,eAAS,KAAK,UAAU,OAAO,YAAY;AAAA,IAC7C,OAAO;AACL,eAAS,KAAK,UAAU,IAAI,YAAY;AACxC,eAAS,KAAK,UAAU,OAAO,WAAW;AAAA,IAC5C;AAAA,EACF;AAGA,QAAM,iBAAiB,gBAAgB;AAAA,IACrC,OAAO,WAAW,cAAc,QAAQ,cAAc,QAAQ,WAAW,IAAI;AAAA,EAC/E;AACA,YAAU,QAAQ,kBAAkB;AAGpC,QAAM,WAAW,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAGpD,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,eAAe,OAAO,QAAQ,eAAe,YAAY;AAC7E,YAAM,aAAa,OAAO,WAAW,8BAA8B;AACnE,YAAM,eAAe,MAAM,UAAU,UAAU,YAAY,eAAe,QAAQ;AAElF,iBAAW,iBAAiB,UAAU,YAAY;AAElD,kBAAY,MAAM;AAChB,mBAAW,oBAAoB,UAAU,YAAY;AAAA,MACvD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AAAA;AAAA,IAEL,WAAW,SAAS;AAAA,MAClB,KAAK,MAAM,UAAU;AAAA,MACrB,KAAK;AAAA,IACP,CAAC;AAAA;AAAA,IAED;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,171 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { nextTick } from "vue";
3
+ import { useColorMode } from "./useColorMode.js";
4
+ vi.mock("vue", async () => {
5
+ const actual = await vi.importActual("vue");
6
+ return { ...actual, onMounted: vi.fn((fn) => fn()), onUnmounted: vi.fn() };
7
+ });
8
+ const actualMatchMedia = window.matchMedia;
9
+ describe("useColorMode", () => {
10
+ beforeEach(() => {
11
+ document.body.classList.remove("dark-mode", "light-mode");
12
+ localStorage.clear();
13
+ });
14
+ afterEach(() => {
15
+ vi.restoreAllMocks();
16
+ window.matchMedia = actualMatchMedia;
17
+ });
18
+ it("defaults to system mode preference", () => {
19
+ const { colorMode } = useColorMode();
20
+ expect(colorMode.value).toBe("system");
21
+ });
22
+ it.each(["light", "dark"])("respects localStorage value: %s", (mode) => {
23
+ localStorage.setItem("colorMode", mode);
24
+ const { colorMode } = useColorMode();
25
+ expect(colorMode.value).toBe(mode);
26
+ });
27
+ it("handles unknown localStorage values", () => {
28
+ localStorage.setItem("colorMode", "foobar");
29
+ expect(() => useColorMode()).not.toThrow();
30
+ });
31
+ it.each(["light", "dark"])("toggles between light and dark mode when system is %s", (mode) => {
32
+ window.matchMedia = vi.fn().mockImplementation((query) => ({
33
+ matches: query === `(prefers-color-scheme: ${mode})`,
34
+ addEventListener: vi.fn(),
35
+ removeEventListener: vi.fn()
36
+ }));
37
+ const { colorMode, darkLightMode, toggleColorMode } = useColorMode();
38
+ expect(colorMode.value).toBe("system");
39
+ expect(darkLightMode.value).toBe(mode);
40
+ toggleColorMode();
41
+ const inverted = mode === "light" ? "dark" : "light";
42
+ expect(colorMode.value).toBe(inverted);
43
+ expect(darkLightMode.value).toBe(inverted);
44
+ expect(localStorage.getItem("colorMode")).toBe(inverted);
45
+ toggleColorMode();
46
+ expect(colorMode.value).toBe(mode);
47
+ expect(darkLightMode.value).toBe(mode);
48
+ expect(localStorage.getItem("colorMode")).toBe(mode);
49
+ });
50
+ it("sets specific color mode", () => {
51
+ const { colorMode, darkLightMode, setColorMode } = useColorMode();
52
+ setColorMode("light");
53
+ expect(colorMode.value).toBe("light");
54
+ expect(darkLightMode.value).toBe("light");
55
+ expect(localStorage.getItem("colorMode")).toBe("light");
56
+ setColorMode("dark");
57
+ expect(colorMode.value).toBe("dark");
58
+ expect(darkLightMode.value).toBe("dark");
59
+ expect(localStorage.getItem("colorMode")).toBe("dark");
60
+ });
61
+ it("allows setting colorMode via the computed ref", () => {
62
+ const { colorMode } = useColorMode();
63
+ colorMode.value = "dark";
64
+ expect(colorMode.value).toBe("dark");
65
+ colorMode.value = "light";
66
+ expect(colorMode.value).toBe("light");
67
+ });
68
+ it.each(["light", "dark"])("isDarkMode is computed correctly when colorMode is %s", (mode) => {
69
+ const { isDarkMode, setColorMode } = useColorMode();
70
+ setColorMode(mode);
71
+ expect(isDarkMode.value).toBe(mode === "dark");
72
+ });
73
+ it("allows setting isDarkMode via the computed ref", () => {
74
+ const { isDarkMode } = useColorMode();
75
+ isDarkMode.value = true;
76
+ expect(isDarkMode.value).toBe(true);
77
+ isDarkMode.value = false;
78
+ expect(isDarkMode.value).toBe(false);
79
+ });
80
+ it.each(["light", "dark"])("detects system %s mode preference", (mode) => {
81
+ window.matchMedia = vi.fn().mockImplementation((query) => ({
82
+ matches: query === `(prefers-color-scheme: ${mode})`,
83
+ addEventListener: vi.fn(),
84
+ removeEventListener: vi.fn()
85
+ }));
86
+ const { getSystemModePreference, darkLightMode } = useColorMode();
87
+ expect(getSystemModePreference()).toBe(mode);
88
+ expect(darkLightMode.value).toBe(mode);
89
+ });
90
+ it("applies correct classes to body", async () => {
91
+ const { setColorMode } = useColorMode();
92
+ setColorMode("dark");
93
+ await nextTick();
94
+ expect(document.body.classList.contains("dark-mode")).toBe(true);
95
+ expect(document.body.classList.contains("light-mode")).toBe(false);
96
+ setColorMode("light");
97
+ await nextTick();
98
+ expect(document.body.classList.contains("light-mode")).toBe(true);
99
+ expect(document.body.classList.contains("dark-mode")).toBe(false);
100
+ });
101
+ it("listens to system preference changes", async () => {
102
+ let mediaQueryCallback = () => {
103
+ };
104
+ const mockMediaQuery = (matches) => ({
105
+ matches,
106
+ addEventListener: vi.fn((_, callback) => mediaQueryCallback = callback),
107
+ removeEventListener: vi.fn()
108
+ });
109
+ const mocked = mockMediaQuery(false);
110
+ window.matchMedia = vi.fn().mockReturnValue(mocked);
111
+ const { setColorMode } = useColorMode();
112
+ setColorMode("system");
113
+ expect(mocked.addEventListener).toHaveBeenCalledWith("change", expect.any(Function));
114
+ await nextTick();
115
+ expect(document.body.classList.contains("light-mode")).toBe(true);
116
+ expect(document.body.classList.contains("dark-mode")).toBe(false);
117
+ if (mediaQueryCallback) {
118
+ window.matchMedia = vi.fn().mockReturnValue(mockMediaQuery(true));
119
+ mediaQueryCallback();
120
+ await nextTick();
121
+ expect(document.body.classList.contains("light-mode")).toBe(false);
122
+ expect(document.body.classList.contains("dark-mode")).toBe(true);
123
+ }
124
+ });
125
+ it.each(["light", "dark", "system"])("respects initialColorMode option: %s", (initialColorMode) => {
126
+ const { colorMode } = useColorMode({ initialColorMode });
127
+ expect(colorMode.value).toBe(initialColorMode);
128
+ });
129
+ it("initialColorMode is overridden by localStorage value", () => {
130
+ localStorage.setItem("colorMode", "dark");
131
+ const { colorMode } = useColorMode({ initialColorMode: "light" });
132
+ expect(colorMode.value).toBe("dark");
133
+ });
134
+ it("respects overrideColorMode option", async () => {
135
+ const { setColorMode } = useColorMode({ overrideColorMode: "dark" });
136
+ setColorMode("light");
137
+ await nextTick();
138
+ expect(document.body.classList.contains("dark-mode")).toBe(true);
139
+ expect(document.body.classList.contains("light-mode")).toBe(false);
140
+ window.matchMedia = vi.fn().mockImplementation((query) => ({
141
+ matches: query === "(prefers-color-scheme: light)",
142
+ addEventListener: vi.fn(),
143
+ removeEventListener: vi.fn()
144
+ }));
145
+ setColorMode("system");
146
+ await nextTick();
147
+ expect(document.body.classList.contains("dark-mode")).toBe(true);
148
+ expect(document.body.classList.contains("light-mode")).toBe(false);
149
+ });
150
+ it("works in SSG environment without window/document", () => {
151
+ const originalWindow = global.window;
152
+ const originalDocument = global.document;
153
+ delete global.window;
154
+ delete global.document;
155
+ const { colorMode, darkLightMode, setColorMode, toggleColorMode } = useColorMode();
156
+ expect(colorMode.value).toBe("system");
157
+ expect(darkLightMode.value).toBe("light");
158
+ expect(() => setColorMode("dark")).not.toThrow();
159
+ expect(() => toggleColorMode()).not.toThrow();
160
+ global.window = originalWindow;
161
+ global.document = originalDocument;
162
+ });
163
+ it("handles missing matchMedia gracefully", () => {
164
+ const originalMatchMedia = window.matchMedia;
165
+ delete window.matchMedia;
166
+ const { darkLightMode } = useColorMode();
167
+ expect(darkLightMode.value).toBe("dark");
168
+ window.matchMedia = originalMatchMedia;
169
+ });
170
+ });
171
+ //# sourceMappingURL=useColorMode.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useColorMode/useColorMode.test.ts"],
4
+ "sourcesContent": ["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\nimport { nextTick } from 'vue'\n\nimport { useColorMode } from './useColorMode'\n\n// Mock only onMounted, keep real nextTick\nvi.mock('vue', async () => {\n const actual = await vi.importActual('vue')\n return { ...actual, onMounted: vi.fn((fn) => fn()), onUnmounted: vi.fn() }\n})\n\nconst actualMatchMedia = window.matchMedia\n\ndescribe('useColorMode', () => {\n beforeEach(() => {\n // Reset the DOM\n document.body.classList.remove('dark-mode', 'light-mode')\n\n // Clear localStorage\n localStorage.clear()\n })\n\n afterEach(() => {\n // Restore all mocks\n vi.restoreAllMocks()\n\n // Restore the original matchMedia\n window.matchMedia = actualMatchMedia\n })\n\n it('defaults to system mode preference', () => {\n const { colorMode } = useColorMode()\n expect(colorMode.value).toBe('system')\n })\n\n it.each(['light', 'dark'] as const)('respects localStorage value: %s', (mode) => {\n localStorage.setItem('colorMode', mode)\n const { colorMode } = useColorMode()\n expect(colorMode.value).toBe(mode)\n })\n\n it('handles unknown localStorage values', () => {\n localStorage.setItem('colorMode', 'foobar')\n expect(() => useColorMode()).not.toThrow()\n })\n\n it.each(['light', 'dark'] as const)('toggles between light and dark mode when system is %s', (mode) => {\n // Mock the matchMedia to simulate system dark mode\n window.matchMedia = vi.fn().mockImplementation((query) => ({\n matches: query === `(prefers-color-scheme: ${mode})`,\n addEventListener: vi.fn(),\n removeEventListener: vi.fn(),\n }))\n\n const { colorMode, darkLightMode, toggleColorMode } = useColorMode()\n expect(colorMode.value).toBe('system')\n expect(darkLightMode.value).toBe(mode)\n\n toggleColorMode()\n const inverted = mode === 'light' ? 'dark' : 'light'\n expect(colorMode.value).toBe(inverted)\n expect(darkLightMode.value).toBe(inverted)\n expect(localStorage.getItem('colorMode')).toBe(inverted)\n\n toggleColorMode()\n expect(colorMode.value).toBe(mode)\n expect(darkLightMode.value).toBe(mode)\n expect(localStorage.getItem('colorMode')).toBe(mode)\n })\n\n it('sets specific color mode', () => {\n const { colorMode, darkLightMode, setColorMode } = useColorMode()\n\n setColorMode('light')\n expect(colorMode.value).toBe('light')\n expect(darkLightMode.value).toBe('light')\n expect(localStorage.getItem('colorMode')).toBe('light')\n\n setColorMode('dark')\n expect(colorMode.value).toBe('dark')\n expect(darkLightMode.value).toBe('dark')\n expect(localStorage.getItem('colorMode')).toBe('dark')\n })\n\n it('allows setting colorMode via the computed ref', () => {\n const { colorMode } = useColorMode()\n\n colorMode.value = 'dark'\n expect(colorMode.value).toBe('dark')\n\n colorMode.value = 'light'\n expect(colorMode.value).toBe('light')\n })\n\n it.each(['light', 'dark'] as const)('isDarkMode is computed correctly when colorMode is %s', (mode) => {\n const { isDarkMode, setColorMode } = useColorMode()\n\n setColorMode(mode)\n expect(isDarkMode.value).toBe(mode === 'dark')\n })\n\n it('allows setting isDarkMode via the computed ref', () => {\n const { isDarkMode } = useColorMode()\n\n isDarkMode.value = true\n expect(isDarkMode.value).toBe(true)\n\n isDarkMode.value = false\n expect(isDarkMode.value).toBe(false)\n })\n\n it.each(['light', 'dark'] as const)('detects system %s mode preference', (mode) => {\n window.matchMedia = vi.fn().mockImplementation((query) => ({\n matches: query === `(prefers-color-scheme: ${mode})`,\n addEventListener: vi.fn(),\n removeEventListener: vi.fn(),\n }))\n\n const { getSystemModePreference, darkLightMode } = useColorMode()\n expect(getSystemModePreference()).toBe(mode)\n expect(darkLightMode.value).toBe(mode)\n })\n\n it('applies correct classes to body', async () => {\n const { setColorMode } = useColorMode()\n\n setColorMode('dark')\n await nextTick()\n expect(document.body.classList.contains('dark-mode')).toBe(true)\n expect(document.body.classList.contains('light-mode')).toBe(false)\n\n setColorMode('light')\n await nextTick()\n expect(document.body.classList.contains('light-mode')).toBe(true)\n expect(document.body.classList.contains('dark-mode')).toBe(false)\n })\n\n it('listens to system preference changes', async () => {\n let mediaQueryCallback: () => void = () => {}\n\n const mockMediaQuery = (matches: boolean) => ({\n matches,\n addEventListener: vi.fn((_, callback) => (mediaQueryCallback = callback)),\n removeEventListener: vi.fn(),\n })\n\n // Set the mock to return false for '(prefers-color-scheme: dark)'\n const mocked = mockMediaQuery(false)\n window.matchMedia = vi.fn().mockReturnValue(mocked)\n\n const { setColorMode } = useColorMode()\n setColorMode('system')\n\n expect(mocked.addEventListener).toHaveBeenCalledWith('change', expect.any(Function))\n\n await nextTick()\n\n expect(document.body.classList.contains('light-mode')).toBe(true)\n expect(document.body.classList.contains('dark-mode')).toBe(false)\n\n // Simulate system preference change\n if (mediaQueryCallback) {\n window.matchMedia = vi.fn().mockReturnValue(mockMediaQuery(true))\n mediaQueryCallback()\n await nextTick()\n expect(document.body.classList.contains('light-mode')).toBe(false)\n expect(document.body.classList.contains('dark-mode')).toBe(true)\n }\n })\n\n it.each(['light', 'dark', 'system'] as const)('respects initialColorMode option: %s', (initialColorMode) => {\n const { colorMode } = useColorMode({ initialColorMode })\n expect(colorMode.value).toBe(initialColorMode)\n })\n\n it('initialColorMode is overridden by localStorage value', () => {\n localStorage.setItem('colorMode', 'dark')\n const { colorMode } = useColorMode({ initialColorMode: 'light' })\n expect(colorMode.value).toBe('dark')\n })\n\n it('respects overrideColorMode option', async () => {\n const { setColorMode } = useColorMode({ overrideColorMode: 'dark' })\n\n // Even when setting to light mode, it should stay dark due to override\n setColorMode('light')\n await nextTick()\n expect(document.body.classList.contains('dark-mode')).toBe(true)\n expect(document.body.classList.contains('light-mode')).toBe(false)\n\n // Should stay dark even when system preference is light\n window.matchMedia = vi.fn().mockImplementation((query) => ({\n matches: query === '(prefers-color-scheme: light)',\n addEventListener: vi.fn(),\n removeEventListener: vi.fn(),\n }))\n\n setColorMode('system')\n await nextTick()\n expect(document.body.classList.contains('dark-mode')).toBe(true)\n expect(document.body.classList.contains('light-mode')).toBe(false)\n })\n\n it('works in SSG environment without window/document', () => {\n const originalWindow = global.window\n const originalDocument = global.document\n\n // Mock SSG environment by removing window/document\n // @ts-expect-error\n delete global.window\n // @ts-expect-error\n delete global.document\n\n const { colorMode, darkLightMode, setColorMode, toggleColorMode } = useColorMode()\n\n // Should default to light mode in SSG\n expect(colorMode.value).toBe('system')\n expect(darkLightMode.value).toBe('light')\n\n // Methods should not throw without window/document\n expect(() => setColorMode('dark')).not.toThrow()\n expect(() => toggleColorMode()).not.toThrow()\n\n // Restore window/document/localStorage\n global.window = originalWindow\n global.document = originalDocument\n })\n\n it('handles missing matchMedia gracefully', () => {\n const originalMatchMedia = window.matchMedia\n // @ts-expect-error - Intentionally removing matchMedia\n delete window.matchMedia\n\n const { darkLightMode } = useColorMode()\n expect(darkLightMode.value).toBe('dark') // Should default to dark when matchMedia is unavailable\n\n window.matchMedia = originalMatchMedia\n })\n})\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "url": "git+https://github.com/scalar/scalar.git",
11
11
  "directory": "packages/use-hooks"
12
12
  },
13
- "version": "0.1.47",
13
+ "version": "0.1.48",
14
14
  "engines": {
15
15
  "node": ">=18"
16
16
  },
@@ -18,6 +18,11 @@
18
18
  "main": "./dist/index.cjs",
19
19
  "types": "./dist/index.d.ts",
20
20
  "exports": {
21
+ ".": {
22
+ "import": "./dist/index.js",
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
25
+ },
21
26
  "./useBindCx": {
22
27
  "import": "./dist/useBindCx/index.js",
23
28
  "types": "./dist/useBindCx/index.d.ts",
@@ -49,20 +54,18 @@
49
54
  "tailwind-merge": "^2.5.5",
50
55
  "vue": "^3.5.12",
51
56
  "zod": "3.24.1",
52
- "@scalar/use-toasts": "0.7.9",
53
- "@scalar/themes": "0.11.0"
57
+ "@scalar/themes": "0.11.1",
58
+ "@scalar/use-toasts": "0.7.10"
54
59
  },
55
60
  "devDependencies": {
56
61
  "@vitejs/plugin-vue": "^5.0.4",
57
62
  "@vue/test-utils": "^2.4.1",
58
63
  "vite": "^5.4.10",
59
64
  "zod-to-ts": "^1.2.0",
60
- "@scalar/build-tooling": "0.1.18"
65
+ "@scalar/build-tooling": "0.1.19"
61
66
  },
62
67
  "scripts": {
63
- "build": "scalar-build-vite",
64
- "format": "scalar-format",
65
- "format:check": "scalar-format-check",
68
+ "build": "scalar-build-esbuild",
66
69
  "lint:check": "scalar-lint-check",
67
70
  "lint:fix": "scalar-lint-fix",
68
71
  "test": "vitest",