@nayhoo/ui 0.9.2 → 0.9.3

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 (137) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-T3GW2EMR.mjs → chunk-2TMFRLMM.mjs} +1 -1
  3. package/dist/{chunk-T3GW2EMR.mjs.map → chunk-2TMFRLMM.mjs.map} +1 -1
  4. package/dist/{chunk-ZNKUE6YY.mjs → chunk-3STUDMUG.mjs} +1 -1
  5. package/dist/{chunk-ZNKUE6YY.mjs.map → chunk-3STUDMUG.mjs.map} +1 -1
  6. package/dist/{chunk-64TEKDKL.mjs → chunk-52RVZRC4.mjs} +2 -2
  7. package/dist/{chunk-MXFGBAZU.mjs → chunk-54ZBX4ZK.mjs} +1 -1
  8. package/dist/{chunk-MXFGBAZU.mjs.map → chunk-54ZBX4ZK.mjs.map} +1 -1
  9. package/dist/{chunk-G4YCF3A2.mjs → chunk-AIOSEM6O.mjs} +1 -1
  10. package/dist/{chunk-G4YCF3A2.mjs.map → chunk-AIOSEM6O.mjs.map} +1 -1
  11. package/dist/{chunk-QEBSZEY2.mjs → chunk-HFMY3EF3.mjs} +1 -1
  12. package/dist/{chunk-QEBSZEY2.mjs.map → chunk-HFMY3EF3.mjs.map} +1 -1
  13. package/dist/{chunk-SOIEM2O2.mjs → chunk-L3WLGNH2.mjs} +1 -1
  14. package/dist/{chunk-SOIEM2O2.mjs.map → chunk-L3WLGNH2.mjs.map} +1 -1
  15. package/dist/{chunk-DC6VQ7BG.mjs → chunk-LF6VSYRD.mjs} +2 -2
  16. package/dist/{chunk-IEZTYE5I.mjs → chunk-M6OYH5UA.mjs} +1 -1
  17. package/dist/{chunk-IEZTYE5I.mjs.map → chunk-M6OYH5UA.mjs.map} +1 -1
  18. package/dist/{chunk-5RLHLI27.mjs → chunk-MT2IF4CB.mjs} +3 -3
  19. package/dist/{chunk-GGJKRS5V.mjs → chunk-PIOIL3MF.mjs} +2 -2
  20. package/dist/{chunk-3HV65JYW.mjs → chunk-RD6HAWH5.mjs} +1 -1
  21. package/dist/{chunk-3HV65JYW.mjs.map → chunk-RD6HAWH5.mjs.map} +1 -1
  22. package/dist/{chunk-HRXZ3ELS.mjs → chunk-SC6WBBXG.mjs} +1 -1
  23. package/dist/{chunk-HRXZ3ELS.mjs.map → chunk-SC6WBBXG.mjs.map} +1 -1
  24. package/dist/{chunk-YO4LZRGU.mjs → chunk-SI36SYJ2.mjs} +1 -1
  25. package/dist/{chunk-YO4LZRGU.mjs.map → chunk-SI36SYJ2.mjs.map} +1 -1
  26. package/dist/{chunk-JI6FRWSC.mjs → chunk-TF5DXR26.mjs} +3 -3
  27. package/dist/{chunk-PGCB7RGD.mjs → chunk-TPPKQCXG.mjs} +1 -1
  28. package/dist/{chunk-PGCB7RGD.mjs.map → chunk-TPPKQCXG.mjs.map} +1 -1
  29. package/dist/{chunk-6UOQ737G.mjs → chunk-UVLWN6WJ.mjs} +1 -1
  30. package/dist/{chunk-6UOQ737G.mjs.map → chunk-UVLWN6WJ.mjs.map} +1 -1
  31. package/dist/{chunk-RYAY35UB.mjs → chunk-WUIQQ7C2.mjs} +2 -2
  32. package/dist/{chunk-DERDJR33.mjs → chunk-YCHYGF5R.mjs} +1 -1
  33. package/dist/{chunk-DERDJR33.mjs.map → chunk-YCHYGF5R.mjs.map} +1 -1
  34. package/dist/{chunk-6N652IDI.mjs → chunk-YFXFSV23.mjs} +1 -1
  35. package/dist/{chunk-6N652IDI.mjs.map → chunk-YFXFSV23.mjs.map} +1 -1
  36. package/dist/{chunk-IQLI5J2V.mjs → chunk-YZNF3EIN.mjs} +1 -1
  37. package/dist/{chunk-IQLI5J2V.mjs.map → chunk-YZNF3EIN.mjs.map} +1 -1
  38. package/dist/components/avatar.css +1 -1
  39. package/dist/components/avatar.css.map +1 -1
  40. package/dist/components/avatar.js.map +1 -1
  41. package/dist/components/avatar.mjs +1 -1
  42. package/dist/components/badge.css +1 -1
  43. package/dist/components/badge.css.map +1 -1
  44. package/dist/components/badge.js.map +1 -1
  45. package/dist/components/badge.mjs +1 -1
  46. package/dist/components/button.css +2 -2
  47. package/dist/components/button.css.map +1 -1
  48. package/dist/components/button.js.map +1 -1
  49. package/dist/components/button.mjs +4 -4
  50. package/dist/components/checkbox.css +1 -1
  51. package/dist/components/checkbox.css.map +1 -1
  52. package/dist/components/checkbox.js.map +1 -1
  53. package/dist/components/checkbox.mjs +1 -1
  54. package/dist/components/dropdown-menu.css +2 -2
  55. package/dist/components/dropdown-menu.css.map +1 -1
  56. package/dist/components/dropdown-menu.js.map +1 -1
  57. package/dist/components/dropdown-menu.mjs +3 -3
  58. package/dist/components/flex.css +1 -1
  59. package/dist/components/flex.css.map +1 -1
  60. package/dist/components/flex.js.map +1 -1
  61. package/dist/components/flex.mjs +2 -2
  62. package/dist/components/grid.css +1 -1
  63. package/dist/components/grid.css.map +1 -1
  64. package/dist/components/grid.js.map +1 -1
  65. package/dist/components/grid.mjs +1 -1
  66. package/dist/components/heading.css +1 -1
  67. package/dist/components/heading.css.map +1 -1
  68. package/dist/components/heading.js.map +1 -1
  69. package/dist/components/heading.mjs +2 -2
  70. package/dist/components/icon-button.css +2 -2
  71. package/dist/components/icon-button.css.map +1 -1
  72. package/dist/components/icon-button.js.map +1 -1
  73. package/dist/components/icon-button.mjs +4 -4
  74. package/dist/components/label.css +1 -1
  75. package/dist/components/label.css.map +1 -1
  76. package/dist/components/label.js.map +1 -1
  77. package/dist/components/label.mjs +1 -1
  78. package/dist/components/link.css +1 -1
  79. package/dist/components/link.css.map +1 -1
  80. package/dist/components/link.js.map +1 -1
  81. package/dist/components/link.mjs +1 -1
  82. package/dist/components/menu.css +2 -2
  83. package/dist/components/menu.css.map +1 -1
  84. package/dist/components/menu.js.map +1 -1
  85. package/dist/components/menu.mjs +3 -3
  86. package/dist/components/paragraph.css +1 -1
  87. package/dist/components/paragraph.css.map +1 -1
  88. package/dist/components/paragraph.js.map +1 -1
  89. package/dist/components/paragraph.mjs +1 -1
  90. package/dist/components/select.css +2 -2
  91. package/dist/components/select.css.map +1 -1
  92. package/dist/components/select.js.map +1 -1
  93. package/dist/components/select.mjs +2 -2
  94. package/dist/components/skeleton.css +1 -1
  95. package/dist/components/skeleton.css.map +1 -1
  96. package/dist/components/skeleton.js.map +1 -1
  97. package/dist/components/skeleton.mjs +1 -1
  98. package/dist/components/spinner.css +1 -1
  99. package/dist/components/spinner.css.map +1 -1
  100. package/dist/components/spinner.js.map +1 -1
  101. package/dist/components/spinner.mjs +2 -2
  102. package/dist/components/switch.css +1 -1
  103. package/dist/components/switch.css.map +1 -1
  104. package/dist/components/switch.js.map +1 -1
  105. package/dist/components/switch.mjs +1 -1
  106. package/dist/components/text-field.css +1 -1
  107. package/dist/components/text-field.css.map +1 -1
  108. package/dist/components/text-field.js.map +1 -1
  109. package/dist/components/text-field.mjs +1 -1
  110. package/dist/components/text.css +1 -1
  111. package/dist/components/text.css.map +1 -1
  112. package/dist/components/text.js.map +1 -1
  113. package/dist/components/text.mjs +2 -2
  114. package/dist/components/tooltip.css +1 -1
  115. package/dist/components/tooltip.css.map +1 -1
  116. package/dist/components/tooltip.js.map +1 -1
  117. package/dist/components/tooltip.mjs +2 -2
  118. package/dist/providers/index.css +8 -8
  119. package/dist/providers/index.css.map +1 -1
  120. package/dist/providers/index.d.mts +13 -11
  121. package/dist/providers/index.d.ts +13 -11
  122. package/dist/providers/index.js +71 -35
  123. package/dist/providers/index.js.map +1 -1
  124. package/dist/providers/index.mjs +82 -46
  125. package/dist/providers/index.mjs.map +1 -1
  126. package/dist/theme/index.css +20 -20
  127. package/dist/theme/index.css.map +1 -1
  128. package/dist/theme/index.js.map +1 -1
  129. package/dist/theme/index.mjs +15 -15
  130. package/dist/theme/index.mjs.map +1 -1
  131. package/package.json +1 -1
  132. /package/dist/{chunk-64TEKDKL.mjs.map → chunk-52RVZRC4.mjs.map} +0 -0
  133. /package/dist/{chunk-DC6VQ7BG.mjs.map → chunk-LF6VSYRD.mjs.map} +0 -0
  134. /package/dist/{chunk-5RLHLI27.mjs.map → chunk-MT2IF4CB.mjs.map} +0 -0
  135. /package/dist/{chunk-GGJKRS5V.mjs.map → chunk-PIOIL3MF.mjs.map} +0 -0
  136. /package/dist/{chunk-JI6FRWSC.mjs.map → chunk-TF5DXR26.mjs.map} +0 -0
  137. /package/dist/{chunk-RYAY35UB.mjs.map → chunk-WUIQQ7C2.mjs.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Text
3
- } from "../chunk-RYAY35UB.mjs";
3
+ } from "../chunk-WUIQQ7C2.mjs";
4
4
  import {
5
5
  checkmark,
6
6
  darkTheme,
@@ -10,68 +10,104 @@ import {
10
10
  toastInner,
11
11
  toastRoot,
12
12
  toastViewport
13
- } from "../chunk-MXFGBAZU.mjs";
13
+ } from "../chunk-54ZBX4ZK.mjs";
14
14
  import {
15
15
  Heading
16
- } from "../chunk-GGJKRS5V.mjs";
16
+ } from "../chunk-PIOIL3MF.mjs";
17
17
  import {
18
18
  IconButton
19
- } from "../chunk-5RLHLI27.mjs";
20
- import "../chunk-6N652IDI.mjs";
21
- import "../chunk-G4YCF3A2.mjs";
19
+ } from "../chunk-MT2IF4CB.mjs";
20
+ import "../chunk-YFXFSV23.mjs";
21
+ import "../chunk-AIOSEM6O.mjs";
22
22
  import {
23
23
  Button
24
- } from "../chunk-JI6FRWSC.mjs";
25
- import "../chunk-SOIEM2O2.mjs";
26
- import "../chunk-DC6VQ7BG.mjs";
27
- import "../chunk-QEBSZEY2.mjs";
24
+ } from "../chunk-TF5DXR26.mjs";
25
+ import "../chunk-L3WLGNH2.mjs";
26
+ import "../chunk-LF6VSYRD.mjs";
27
+ import "../chunk-HFMY3EF3.mjs";
28
28
  import "../chunk-4N6P3Y54.mjs";
29
29
  import "../chunk-7EGQM3ZL.mjs";
30
30
  import "../chunk-LZOMFHX3.mjs";
31
31
 
32
- // src/hooks/use-body-class-toggle.ts
33
- import { useEffect } from "react";
34
- var useBodyClassToggle = (className, condition) => {
35
- useEffect(() => {
36
- const { body } = document;
37
- if (condition) {
38
- body.classList.add(className);
32
+ // src/providers/theme-provider.tsx
33
+ import { createContext, useEffect, useState } from "react";
34
+ import { jsx, jsxs } from "react/jsx-runtime";
35
+ var themes = ["light", "dark", "system"];
36
+ var storageKey = "nayhoo-theme";
37
+ var ThemeContext = createContext({
38
+ theme: "system",
39
+ setTheme: () => {
40
+ },
41
+ themes
42
+ });
43
+ var defaultTheme = "system";
44
+ var ThemeProvider = ({ children }) => {
45
+ const [theme, setTheme] = useState(() => getTheme());
46
+ const applyTheme = (theme2) => {
47
+ var _a, _b, _c, _d;
48
+ const isDark = theme2 === "dark";
49
+ const isSystem = theme2 === "system";
50
+ if (isDark || (isSystem || !(storageKey in localStorage)) && window.matchMedia("(prefers-color-scheme: dark)").matches) {
51
+ (_a = document.querySelector("html")) == null ? void 0 : _a.classList.add(darkTheme);
52
+ (_b = document.querySelector("html")) == null ? void 0 : _b.classList.remove(lightTheme);
39
53
  } else {
40
- body.classList.remove(className);
54
+ (_c = document.querySelector("html")) == null ? void 0 : _c.classList.add(lightTheme);
55
+ (_d = document.querySelector("html")) == null ? void 0 : _d.classList.remove(darkTheme);
41
56
  }
42
- return () => {
43
- body.classList.remove(className);
44
- };
45
- }, [className, condition]);
46
- };
57
+ };
58
+ useEffect(() => {
59
+ applyTheme(theme);
60
+ try {
61
+ localStorage.setItem(storageKey, theme);
62
+ } catch {
63
+ }
64
+ }, [theme]);
65
+ return /* @__PURE__ */ jsxs(ThemeContext, { value: { theme, setTheme, themes }, children: [
66
+ /* @__PURE__ */ jsx("script", { children: `
67
+ const isDark = localStorage.getItem("${storageKey}") === "dark";
68
+ const isSystem = localStorage.getItem("${storageKey}") === "system";
47
69
 
48
- // src/providers/theme-provider.tsx
49
- import { createContext } from "react";
50
- import { jsx } from "react/jsx-runtime";
51
- var defaultThemeMode = "light";
52
- var ThemeContext = createContext(defaultThemeMode);
53
- var ThemeProvider = ({
54
- children,
55
- themeMode = defaultThemeMode
56
- }) => {
57
- useBodyClassToggle(lightTheme, themeMode === "light");
58
- useBodyClassToggle(darkTheme, themeMode === "dark");
59
- return /* @__PURE__ */ jsx(ThemeContext, { value: themeMode, children });
70
+ if (
71
+ isDark ||
72
+ ((isSystem || !("${storageKey}" in localStorage)) &&
73
+ window.matchMedia("(prefers-color-scheme: dark)").matches)
74
+ ) {
75
+ document.querySelector("html")?.classList.add("${darkTheme}");
76
+ document.querySelector("html")?.classList.remove("${lightTheme}");
77
+ } else {
78
+ document.querySelector("html")?.classList.add("${lightTheme}");
79
+ document.querySelector("html")?.classList.remove("${darkTheme}");
80
+ }
81
+ ` }),
82
+ children
83
+ ] });
84
+ };
85
+ var getTheme = () => {
86
+ var _a;
87
+ if (typeof window === "undefined") {
88
+ return defaultTheme;
89
+ }
90
+ let theme;
91
+ try {
92
+ theme = localStorage.getItem(storageKey) || void 0;
93
+ } catch {
94
+ }
95
+ return (_a = themes.find((t) => t === theme)) != null ? _a : defaultTheme;
60
96
  };
61
97
 
62
- // src/providers/toaster.tsx
98
+ // src/providers/toast-provider.tsx
63
99
  import { Cross2Icon } from "@radix-ui/react-icons";
64
100
  import * as ToastPrimitives from "@radix-ui/react-toast";
65
101
  import * as React2 from "react";
66
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
67
- var defaultToaster = Object.assign(() => {
102
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
103
+ var defaultToast = Object.assign(() => {
68
104
  }, {
69
105
  success: () => {
70
106
  },
71
107
  error: () => {
72
108
  }
73
109
  });
74
- var ToasterContext = React2.createContext(defaultToaster);
110
+ var ToastProviderContext = React2.createContext(defaultToast);
75
111
  var toastElementsMapRef = React2.createRef();
76
112
  var defaultToastImpl = {
77
113
  toastElementsMapRef,
@@ -80,7 +116,7 @@ var defaultToastImpl = {
80
116
  };
81
117
  var ToastContextImpl = React2.createContext(defaultToastImpl);
82
118
  var ANIMATION_OUT_DURATION = 350;
83
- var Toaster = ({
119
+ var ToastProvider = ({
84
120
  children,
85
121
  ...props
86
122
  }) => {
@@ -169,7 +205,7 @@ var Toaster = ({
169
205
  }),
170
206
  [handleDispatchDefault, handleDispatchSuccess, handleDispatchError]
171
207
  );
172
- return /* @__PURE__ */ jsx2(ToasterContext.Provider, { value: toastApi, children: /* @__PURE__ */ jsx2(
208
+ return /* @__PURE__ */ jsx2(ToastProviderContext.Provider, { value: toastApi, children: /* @__PURE__ */ jsx2(
173
209
  ToastContextImpl.Provider,
174
210
  {
175
211
  value: React2.useMemo(
@@ -179,7 +215,7 @@ var Toaster = ({
179
215
  }),
180
216
  [sortToasts]
181
217
  ),
182
- children: /* @__PURE__ */ jsxs(ToastPrimitives.Provider, { ...props, children: [
218
+ children: /* @__PURE__ */ jsxs2(ToastPrimitives.Provider, { ...props, children: [
183
219
  children,
184
220
  Array.from(toasts).map(([key, toast]) => /* @__PURE__ */ jsx2(
185
221
  Toast,
@@ -232,7 +268,7 @@ var Toast = (props) => {
232
268
  duration: toast.duration,
233
269
  className: toastRoot,
234
270
  onOpenChange,
235
- children: /* @__PURE__ */ jsxs("div", { className: toastInner, "data-status": toast.status, children: [
271
+ children: /* @__PURE__ */ jsxs2("div", { className: toastInner, "data-status": toast.status, children: [
236
272
  /* @__PURE__ */ jsx2(ToastStatusIcon, { status: toast.status }),
237
273
  /* @__PURE__ */ jsx2(ToastPrimitives.Title, { asChild: true, style: { gridArea: "title" }, children: /* @__PURE__ */ jsx2(Heading, { level: "6", children: toast.title }) }),
238
274
  /* @__PURE__ */ jsx2(
@@ -258,7 +294,7 @@ var Toast = (props) => {
258
294
  );
259
295
  };
260
296
  var ToastStatusIcon = ({ status }) => {
261
- return status !== "default" ? /* @__PURE__ */ jsxs("div", { style: { gridArea: "icon", alignSelf: "start" }, children: [
297
+ return status !== "default" ? /* @__PURE__ */ jsxs2("div", { style: { gridArea: "icon", alignSelf: "start" }, children: [
262
298
  status === "success" && /* @__PURE__ */ jsx2(CheckmarkIcon, {}),
263
299
  status === "error" && /* @__PURE__ */ jsx2(ErrorIcon, {})
264
300
  ] }) : null;
@@ -282,7 +318,7 @@ export {
282
318
  ThemeContext,
283
319
  ThemeProvider,
284
320
  ToastAction,
285
- Toaster,
286
- ToasterContext
321
+ ToastProvider,
322
+ ToastProviderContext
287
323
  };
288
324
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/use-body-class-toggle.ts","../../src/providers/theme-provider.tsx","../../src/providers/toaster.tsx"],"sourcesContent":["// dup of packages/hooks/src/use-body-class-toggle.ts\n\nimport { useEffect } from \"react\";\n\n/**\n * A React hook that toggles a class on the document.body based on a condition.\n *\n * @param className - The class name to toggle on the document.body.\n * @param condition - The condition to determine whether to add or remove the class.\n */\nexport const useBodyClassToggle = (\n className: string,\n condition: boolean,\n): void => {\n useEffect(() => {\n // Get a reference to the document.body\n const { body } = document;\n\n // Add or remove the specified class based on the condition\n if (condition) {\n body.classList.add(className);\n } else {\n body.classList.remove(className);\n }\n\n // Cleanup function to remove the class when the component unmounts\n return () => {\n body.classList.remove(className);\n };\n }, [className, condition]); // Re-run effect when className or condition changes\n};\n","import { useBodyClassToggle } from \"@/hooks/use-body-class-toggle\";\nimport { darkTheme } from \"@/theme/themes/dark-theme.css\";\nimport { lightTheme } from \"@/theme/themes/light-theme.css\";\nimport { ThemeMode } from \"@/types/theme-mode\";\nimport React, { createContext } from \"react\";\n\nconst defaultThemeMode: ThemeMode = \"light\";\n\nexport const ThemeContext = createContext<ThemeMode>(defaultThemeMode);\n\ntype ThemeProviderProps = {\n children: React.ReactNode;\n themeMode?: ThemeMode;\n};\n\n/**\n * This component applies the theme css. It should preferably be used at the root of your component tree.\n */\nexport const ThemeProvider = ({\n children,\n themeMode = defaultThemeMode,\n}: ThemeProviderProps) => {\n // light theme handler\n useBodyClassToggle(lightTheme, themeMode === \"light\");\n\n // dark theme handler\n useBodyClassToggle(darkTheme, themeMode === \"dark\");\n\n return <ThemeContext value={themeMode}>{children}</ThemeContext>;\n};\n","// Credits: https://codesandbox.io/p/sandbox/radix-toast-stack-dpfx5f\n\nimport { Button } from \"@/components/button\";\nimport { Heading } from \"@/components/heading\";\nimport { IconButton } from \"@/components/icon-button\";\nimport { Text } from \"@/components/text\";\nimport {\n checkmark,\n error,\n toastClose,\n toastInner,\n toastRoot,\n toastViewport,\n} from \"@/theme/styles/toaster.css\";\nimport { Cross2Icon } from \"@radix-ui/react-icons\";\nimport * as ToastPrimitives from \"@radix-ui/react-toast\";\nimport * as React from \"react\";\n\ntype Toast = {\n title?: string;\n description?: string;\n status: \"default\" | \"error\" | \"success\";\n action?: React.ReactNode;\n} & ToastPrimitives.ToastProps;\n\ntype AddToastPayload = Omit<Toast, \"status\">;\n\ntype ToasterContextProps = ((payload: AddToastPayload) => void) & {\n error: (payload: AddToastPayload) => void;\n success: (payload: AddToastPayload) => void;\n};\n\nconst defaultToaster: ToasterContextProps = Object.assign(() => {}, {\n success: () => {},\n error: () => {},\n});\n\nexport const ToasterContext = React.createContext(defaultToaster);\n\ntype ToastContextImplProps = {\n toastElementsMapRef: React.RefObject<Map<string, HTMLLIElement> | null>;\n sortToasts: () => void;\n};\n\nconst toastElementsMapRef = React.createRef<Map<string, HTMLLIElement>>();\n\nconst defaultToastImpl: ToastContextImplProps = {\n toastElementsMapRef,\n sortToasts: () => {},\n};\n\nconst ToastContextImpl = React.createContext(defaultToastImpl);\n\nconst ANIMATION_OUT_DURATION = 350;\n\nexport const Toaster = ({\n children,\n ...props\n}: ToastPrimitives.ToastProviderProps) => {\n const [toasts, setToasts] = React.useState<Map<string, Toast>>(new Map());\n const toastElementsMapRef = React.useRef<Map<string, HTMLLIElement>>(\n new Map(),\n );\n const viewportRef = React.useRef<HTMLOListElement>(null);\n\n const sortToasts = React.useCallback(() => {\n const toastElements = Array.from(toastElementsMapRef.current).reverse();\n const heights: number[] = [];\n\n toastElements.forEach(([, toast], index) => {\n if (!toast) return;\n const height = toast.clientHeight;\n heights.push(height);\n const frontToastHeight = heights[0];\n toast.setAttribute(\"data-front\", `${index === 0}`);\n toast.setAttribute(\"data-hidden\", `${index > 2}`);\n toast.style.setProperty(\"--index\", `${index}`);\n toast.style.setProperty(\"--height\", `${height}px`);\n toast.style.setProperty(\"--front-height\", `${frontToastHeight}px`);\n const hoverOffsetY = heights\n .slice(0, index)\n .reduce((res, next) => (res += next), 0);\n toast.style.setProperty(\"--hover-offset-y\", `-${hoverOffsetY}px`);\n });\n }, []);\n\n const handleAddToast = React.useCallback((toast: Toast) => {\n setToasts((currentToasts) => {\n const newMap = new Map(currentToasts);\n newMap.set(String(Date.now()), { ...toast, open: true });\n\n return newMap;\n });\n }, []);\n\n const handleRemoveToast = React.useCallback((key: string) => {\n setToasts((currentToasts) => {\n const newMap = new Map(currentToasts);\n newMap.delete(key);\n\n return newMap;\n });\n }, []);\n\n const handleDispatchDefault = React.useCallback(\n (payload: AddToastPayload) =>\n handleAddToast({ ...payload, status: \"default\" }),\n [handleAddToast],\n );\n\n const handleDispatchSuccess = React.useCallback(\n (payload: AddToastPayload) =>\n handleAddToast({ ...payload, status: \"success\" }),\n [handleAddToast],\n );\n\n const handleDispatchError = React.useCallback(\n (payload: AddToastPayload) =>\n // default duration of 10 mins for `status: \"error\"`.\n handleAddToast({ duration: 60 * 1000 * 10, ...payload, status: \"error\" }),\n [handleAddToast],\n );\n\n React.useEffect(() => {\n const viewport = viewportRef.current;\n\n if (viewport) {\n const handleFocus = () => {\n toastElementsMapRef.current.forEach((toast) => {\n toast.setAttribute(\"data-hovering\", \"true\");\n });\n };\n\n // @ts-expect-error TODO: get the correct type\n const handleBlur = (event) => {\n if (!viewport.contains(event.target) || viewport === event.target) {\n toastElementsMapRef.current.forEach((toast) => {\n toast.setAttribute(\"data-hovering\", \"false\");\n });\n }\n };\n\n viewport.addEventListener(\"pointermove\", handleFocus);\n viewport.addEventListener(\"pointerleave\", handleBlur);\n viewport.addEventListener(\"focusin\", handleFocus);\n viewport.addEventListener(\"focusout\", handleBlur);\n\n return () => {\n viewport.removeEventListener(\"pointermove\", handleFocus);\n viewport.removeEventListener(\"pointerleave\", handleBlur);\n viewport.removeEventListener(\"focusin\", handleFocus);\n viewport.removeEventListener(\"focusout\", handleBlur);\n };\n }\n }, []);\n\n const toastApi = React.useMemo(\n () =>\n Object.assign(handleDispatchDefault, {\n success: handleDispatchSuccess,\n error: handleDispatchError,\n }),\n [handleDispatchDefault, handleDispatchSuccess, handleDispatchError],\n );\n\n return (\n <ToasterContext.Provider value={toastApi}>\n <ToastContextImpl.Provider\n value={React.useMemo(\n () => ({\n toastElementsMapRef,\n sortToasts,\n }),\n [sortToasts],\n )}\n >\n <ToastPrimitives.Provider {...props}>\n {children}\n {Array.from(toasts).map(([key, toast]) => (\n <Toast\n key={key}\n id={key}\n toast={toast}\n onOpenChange={(open) => {\n if (!open) {\n toastElementsMapRef.current.delete(key);\n sortToasts();\n\n if (!open) {\n setTimeout(() => {\n handleRemoveToast(key);\n }, ANIMATION_OUT_DURATION);\n }\n }\n }}\n />\n ))}\n <ToastPrimitives.Viewport\n ref={viewportRef}\n className={toastViewport}\n />\n </ToastPrimitives.Provider>\n </ToastContextImpl.Provider>\n </ToasterContext.Provider>\n );\n};\n\nconst Toast = (props: ToastPrimitives.ToastProps & { toast: Toast }) => {\n const { onOpenChange, toast, id, ...toastProps } = props;\n const ref = React.useRef<HTMLLIElement>(null);\n const context = React.useContext(ToastContextImpl);\n const { sortToasts, toastElementsMapRef } = context;\n const toastElementsMap = toastElementsMapRef.current;\n\n React.useLayoutEffect(() => {\n if (ref.current) {\n toastElementsMap?.set(id as string, ref.current);\n sortToasts();\n }\n }, [id, sortToasts, toastElementsMap]);\n\n return (\n <ToastPrimitives.Root\n {...toastProps}\n ref={ref}\n type={toast.type}\n duration={toast.duration}\n className={toastRoot}\n onOpenChange={onOpenChange}\n >\n <div className={toastInner} data-status={toast.status}>\n <ToastStatusIcon status={toast.status} />\n <ToastPrimitives.Title asChild style={{ gridArea: \"title\" }}>\n <Heading level=\"6\">{toast.title}</Heading>\n </ToastPrimitives.Title>\n <ToastPrimitives.Description\n asChild\n style={{ gridArea: \"description\" }}\n >\n <Text color=\"subtle\" size=\"2\">\n {toast.description}\n </Text>\n </ToastPrimitives.Description>\n {toast.action}\n <ToastPrimitives.Close\n aria-label=\"Close\"\n asChild\n className={toastClose}\n >\n <IconButton variant=\"outline\">\n <Cross2Icon />\n </IconButton>\n </ToastPrimitives.Close>\n </div>\n </ToastPrimitives.Root>\n );\n};\n\nconst ToastStatusIcon = ({ status }: { status: Toast[\"status\"] }) => {\n return status !== \"default\" ? (\n <div style={{ gridArea: \"icon\", alignSelf: \"start\" }}>\n {status === \"success\" && <CheckmarkIcon />}\n {status === \"error\" && <ErrorIcon />}\n </div>\n ) : null;\n};\n\nconst ErrorIcon = () => <div aria-hidden className={error} />;\nconst CheckmarkIcon = () => <div aria-hidden className={checkmark} />;\n\nexport const ToastAction = ({\n ...props\n}: Omit<ToastPrimitives.ToastActionProps, \"asChild\">) => {\n return (\n <ToastPrimitives.Action\n {...props}\n style={{ gridArea: \"action\", ...props.style }}\n asChild\n >\n <Button size=\"1\" variant=\"outline\">\n {props.children}\n </Button>\n </ToastPrimitives.Action>\n );\n};\n"],"mappings":"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","names":["React","jsx","toastElementsMapRef"]}
1
+ {"version":3,"sources":["../../src/providers/theme-provider.tsx","../../src/providers/toast-provider.tsx"],"sourcesContent":["import { darkTheme } from \"@/theme/themes/dark-theme.css\";\nimport { lightTheme } from \"@/theme/themes/light-theme.css\";\nimport { theme as Theme } from \"@/types/theme\";\nimport React, { createContext, useEffect, useState } from \"react\";\n\nconst themes: Theme[] = [\"light\", \"dark\", \"system\"];\nconst storageKey = \"nayhoo-theme\";\n\ntype ThemeContextProps = {\n theme: Theme;\n setTheme: React.Dispatch<React.SetStateAction<Theme>>;\n themes: Theme[];\n};\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n theme: \"system\",\n setTheme: () => {},\n themes,\n});\n\ntype ThemeProviderProps = {\n children: React.ReactNode;\n defaultTheme?: Theme;\n};\n\nconst defaultTheme = \"system\";\n\nexport const ThemeProvider = ({ children }: ThemeProviderProps) => {\n const [theme, setTheme] = useState(() => getTheme());\n\n const applyTheme = (theme: Theme) => {\n const isDark = theme === \"dark\";\n const isSystem = theme === \"system\";\n\n if (\n isDark ||\n ((isSystem || !(storageKey in localStorage)) &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\n ) {\n document.querySelector(\"html\")?.classList.add(darkTheme);\n document.querySelector(\"html\")?.classList.remove(lightTheme);\n } else {\n document.querySelector(\"html\")?.classList.add(lightTheme);\n document.querySelector(\"html\")?.classList.remove(darkTheme);\n }\n };\n\n useEffect(() => {\n applyTheme(theme);\n\n try {\n localStorage.setItem(storageKey, theme);\n } catch {}\n }, [theme]);\n\n return (\n <ThemeContext value={{ theme, setTheme, themes }}>\n <script>\n {` \n const isDark = localStorage.getItem(\"${storageKey}\") === \"dark\";\n const isSystem = localStorage.getItem(\"${storageKey}\") === \"system\";\n\n if (\n isDark ||\n ((isSystem || !(\"${storageKey}\" in localStorage)) &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\n ) {\n document.querySelector(\"html\")?.classList.add(\"${darkTheme}\");\n document.querySelector(\"html\")?.classList.remove(\"${lightTheme}\");\n } else {\n document.querySelector(\"html\")?.classList.add(\"${lightTheme}\");\n document.querySelector(\"html\")?.classList.remove(\"${darkTheme}\");\n }\n `}\n </script>\n\n {children}\n </ThemeContext>\n );\n};\n\nconst getTheme = () => {\n if (typeof window === \"undefined\") {\n return defaultTheme;\n }\n\n let theme: string | undefined;\n\n try {\n theme = localStorage.getItem(storageKey) || undefined;\n } catch {}\n\n return themes.find((t) => t === theme) ?? defaultTheme;\n};\n","// Credits: https://codesandbox.io/p/sandbox/radix-toast-stack-dpfx5f\n\nimport { Button } from \"@/components/button\";\nimport { Heading } from \"@/components/heading\";\nimport { IconButton } from \"@/components/icon-button\";\nimport { Text } from \"@/components/text\";\nimport {\n checkmark,\n error,\n toastClose,\n toastInner,\n toastRoot,\n toastViewport,\n} from \"@/theme/styles/toaster.css\";\nimport { Cross2Icon } from \"@radix-ui/react-icons\";\nimport * as ToastPrimitives from \"@radix-ui/react-toast\";\nimport * as React from \"react\";\n\ntype Toast = {\n title?: string;\n description?: string;\n status: \"default\" | \"error\" | \"success\";\n action?: React.ReactNode;\n} & ToastPrimitives.ToastProps;\n\ntype AddToastPayload = Omit<Toast, \"status\">;\n\ntype ToastProviderContextProps = ((payload: AddToastPayload) => void) & {\n error: (payload: AddToastPayload) => void;\n success: (payload: AddToastPayload) => void;\n};\n\nconst defaultToast: ToastProviderContextProps = Object.assign(() => {}, {\n success: () => {},\n error: () => {},\n});\n\nexport const ToastProviderContext = React.createContext(defaultToast);\n\ntype ToastContextImplProps = {\n toastElementsMapRef: React.RefObject<Map<string, HTMLLIElement> | null>;\n sortToasts: () => void;\n};\n\nconst toastElementsMapRef = React.createRef<Map<string, HTMLLIElement>>();\n\nconst defaultToastImpl: ToastContextImplProps = {\n toastElementsMapRef,\n sortToasts: () => {},\n};\n\nconst ToastContextImpl = React.createContext(defaultToastImpl);\n\nconst ANIMATION_OUT_DURATION = 350;\n\nexport const ToastProvider = ({\n children,\n ...props\n}: ToastPrimitives.ToastProviderProps) => {\n const [toasts, setToasts] = React.useState<Map<string, Toast>>(new Map());\n const toastElementsMapRef = React.useRef<Map<string, HTMLLIElement>>(\n new Map(),\n );\n const viewportRef = React.useRef<HTMLOListElement>(null);\n\n const sortToasts = React.useCallback(() => {\n const toastElements = Array.from(toastElementsMapRef.current).reverse();\n const heights: number[] = [];\n\n toastElements.forEach(([, toast], index) => {\n if (!toast) return;\n const height = toast.clientHeight;\n heights.push(height);\n const frontToastHeight = heights[0];\n toast.setAttribute(\"data-front\", `${index === 0}`);\n toast.setAttribute(\"data-hidden\", `${index > 2}`);\n toast.style.setProperty(\"--index\", `${index}`);\n toast.style.setProperty(\"--height\", `${height}px`);\n toast.style.setProperty(\"--front-height\", `${frontToastHeight}px`);\n const hoverOffsetY = heights\n .slice(0, index)\n .reduce((res, next) => (res += next), 0);\n toast.style.setProperty(\"--hover-offset-y\", `-${hoverOffsetY}px`);\n });\n }, []);\n\n const handleAddToast = React.useCallback((toast: Toast) => {\n setToasts((currentToasts) => {\n const newMap = new Map(currentToasts);\n newMap.set(String(Date.now()), { ...toast, open: true });\n\n return newMap;\n });\n }, []);\n\n const handleRemoveToast = React.useCallback((key: string) => {\n setToasts((currentToasts) => {\n const newMap = new Map(currentToasts);\n newMap.delete(key);\n\n return newMap;\n });\n }, []);\n\n const handleDispatchDefault = React.useCallback(\n (payload: AddToastPayload) =>\n handleAddToast({ ...payload, status: \"default\" }),\n [handleAddToast],\n );\n\n const handleDispatchSuccess = React.useCallback(\n (payload: AddToastPayload) =>\n handleAddToast({ ...payload, status: \"success\" }),\n [handleAddToast],\n );\n\n const handleDispatchError = React.useCallback(\n (payload: AddToastPayload) =>\n // default duration of 10 mins for `status: \"error\"`.\n handleAddToast({ duration: 60 * 1000 * 10, ...payload, status: \"error\" }),\n [handleAddToast],\n );\n\n React.useEffect(() => {\n const viewport = viewportRef.current;\n\n if (viewport) {\n const handleFocus = () => {\n toastElementsMapRef.current.forEach((toast) => {\n toast.setAttribute(\"data-hovering\", \"true\");\n });\n };\n\n // @ts-expect-error TODO: get the correct type\n const handleBlur = (event) => {\n if (!viewport.contains(event.target) || viewport === event.target) {\n toastElementsMapRef.current.forEach((toast) => {\n toast.setAttribute(\"data-hovering\", \"false\");\n });\n }\n };\n\n viewport.addEventListener(\"pointermove\", handleFocus);\n viewport.addEventListener(\"pointerleave\", handleBlur);\n viewport.addEventListener(\"focusin\", handleFocus);\n viewport.addEventListener(\"focusout\", handleBlur);\n\n return () => {\n viewport.removeEventListener(\"pointermove\", handleFocus);\n viewport.removeEventListener(\"pointerleave\", handleBlur);\n viewport.removeEventListener(\"focusin\", handleFocus);\n viewport.removeEventListener(\"focusout\", handleBlur);\n };\n }\n }, []);\n\n const toastApi = React.useMemo(\n () =>\n Object.assign(handleDispatchDefault, {\n success: handleDispatchSuccess,\n error: handleDispatchError,\n }),\n [handleDispatchDefault, handleDispatchSuccess, handleDispatchError],\n );\n\n return (\n <ToastProviderContext.Provider value={toastApi}>\n <ToastContextImpl.Provider\n value={React.useMemo(\n () => ({\n toastElementsMapRef,\n sortToasts,\n }),\n [sortToasts],\n )}\n >\n <ToastPrimitives.Provider {...props}>\n {children}\n {Array.from(toasts).map(([key, toast]) => (\n <Toast\n key={key}\n id={key}\n toast={toast}\n onOpenChange={(open) => {\n if (!open) {\n toastElementsMapRef.current.delete(key);\n sortToasts();\n\n if (!open) {\n setTimeout(() => {\n handleRemoveToast(key);\n }, ANIMATION_OUT_DURATION);\n }\n }\n }}\n />\n ))}\n <ToastPrimitives.Viewport\n ref={viewportRef}\n className={toastViewport}\n />\n </ToastPrimitives.Provider>\n </ToastContextImpl.Provider>\n </ToastProviderContext.Provider>\n );\n};\n\nconst Toast = (props: ToastPrimitives.ToastProps & { toast: Toast }) => {\n const { onOpenChange, toast, id, ...toastProps } = props;\n const ref = React.useRef<HTMLLIElement>(null);\n const context = React.useContext(ToastContextImpl);\n const { sortToasts, toastElementsMapRef } = context;\n const toastElementsMap = toastElementsMapRef.current;\n\n React.useLayoutEffect(() => {\n if (ref.current) {\n toastElementsMap?.set(id as string, ref.current);\n sortToasts();\n }\n }, [id, sortToasts, toastElementsMap]);\n\n return (\n <ToastPrimitives.Root\n {...toastProps}\n ref={ref}\n type={toast.type}\n duration={toast.duration}\n className={toastRoot}\n onOpenChange={onOpenChange}\n >\n <div className={toastInner} data-status={toast.status}>\n <ToastStatusIcon status={toast.status} />\n <ToastPrimitives.Title asChild style={{ gridArea: \"title\" }}>\n <Heading level=\"6\">{toast.title}</Heading>\n </ToastPrimitives.Title>\n <ToastPrimitives.Description\n asChild\n style={{ gridArea: \"description\" }}\n >\n <Text color=\"subtle\" size=\"2\">\n {toast.description}\n </Text>\n </ToastPrimitives.Description>\n {toast.action}\n <ToastPrimitives.Close\n aria-label=\"Close\"\n asChild\n className={toastClose}\n >\n <IconButton variant=\"outline\">\n <Cross2Icon />\n </IconButton>\n </ToastPrimitives.Close>\n </div>\n </ToastPrimitives.Root>\n );\n};\n\nconst ToastStatusIcon = ({ status }: { status: Toast[\"status\"] }) => {\n return status !== \"default\" ? (\n <div style={{ gridArea: \"icon\", alignSelf: \"start\" }}>\n {status === \"success\" && <CheckmarkIcon />}\n {status === \"error\" && <ErrorIcon />}\n </div>\n ) : null;\n};\n\nconst ErrorIcon = () => <div aria-hidden className={error} />;\nconst CheckmarkIcon = () => <div aria-hidden className={checkmark} />;\n\nexport const ToastAction = ({\n ...props\n}: Omit<ToastPrimitives.ToastActionProps, \"asChild\">) => {\n return (\n <ToastPrimitives.Action\n {...props}\n style={{ gridArea: \"action\", ...props.style }}\n asChild\n >\n <Button size=\"1\" variant=\"outline\">\n {props.children}\n </Button>\n </ToastPrimitives.Action>\n );\n};\n"],"mappings":"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","names":["theme","React","jsx","jsxs","toastElementsMapRef"]}