@nayhoo/ui 0.9.1 → 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 (159) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-3HAUMRRS.mjs → chunk-2H7ZFP5Y.mjs} +1 -1
  3. package/dist/chunk-2H7ZFP5Y.mjs.map +1 -0
  4. package/dist/{chunk-ICX6SDOZ.mjs → chunk-2TMFRLMM.mjs} +1 -1
  5. package/dist/chunk-2TMFRLMM.mjs.map +1 -0
  6. package/dist/{chunk-JZLACTAO.mjs → chunk-3STUDMUG.mjs} +1 -1
  7. package/dist/chunk-3STUDMUG.mjs.map +1 -0
  8. package/dist/{chunk-RAS2GZOT.mjs → chunk-54ZBX4ZK.mjs} +1 -1
  9. package/dist/chunk-54ZBX4ZK.mjs.map +1 -0
  10. package/dist/{chunk-IPBDMBQP.mjs → chunk-AIOSEM6O.mjs} +1 -1
  11. package/dist/{chunk-IPBDMBQP.mjs.map → chunk-AIOSEM6O.mjs.map} +1 -1
  12. package/dist/{chunk-LKYTRD4P.mjs → chunk-AXOHCT5Q.mjs} +1 -1
  13. package/dist/{chunk-LKYTRD4P.mjs.map → chunk-AXOHCT5Q.mjs.map} +1 -1
  14. package/dist/{chunk-67K3UKEB.mjs → chunk-DPZRGHY5.mjs} +1 -1
  15. package/dist/chunk-DPZRGHY5.mjs.map +1 -0
  16. package/dist/{chunk-S3GY7GCD.mjs → chunk-HFMY3EF3.mjs} +1 -1
  17. package/dist/{chunk-S3GY7GCD.mjs.map → chunk-HFMY3EF3.mjs.map} +1 -1
  18. package/dist/chunk-IUXU5IPB.mjs +1 -0
  19. package/dist/{chunk-FG2ZBTVM.mjs → chunk-L3WLGNH2.mjs} +1 -1
  20. package/dist/chunk-L3WLGNH2.mjs.map +1 -0
  21. package/dist/{chunk-A2I7UNX6.mjs → chunk-LF6VSYRD.mjs} +2 -2
  22. package/dist/{chunk-GI2XNLAW.mjs → chunk-MT2IF4CB.mjs} +3 -3
  23. package/dist/{chunk-OETJQIMJ.mjs → chunk-N535ABFC.mjs} +2 -2
  24. package/dist/{chunk-OETJQIMJ.mjs.map → chunk-N535ABFC.mjs.map} +1 -1
  25. package/dist/{chunk-NU7XYEVP.mjs → chunk-PIOIL3MF.mjs} +2 -2
  26. package/dist/{chunk-RW2UU73S.mjs → chunk-SC6WBBXG.mjs} +1 -1
  27. package/dist/{chunk-RW2UU73S.mjs.map → chunk-SC6WBBXG.mjs.map} +1 -1
  28. package/dist/{chunk-X6UXW66P.mjs → chunk-TF5DXR26.mjs} +3 -3
  29. package/dist/{chunk-65GTB4DD.mjs → chunk-TPPKQCXG.mjs} +1 -1
  30. package/dist/{chunk-65GTB4DD.mjs.map → chunk-TPPKQCXG.mjs.map} +1 -1
  31. package/dist/{chunk-RBFEMC5M.mjs → chunk-UVLWN6WJ.mjs} +1 -1
  32. package/dist/{chunk-RBFEMC5M.mjs.map → chunk-UVLWN6WJ.mjs.map} +1 -1
  33. package/dist/{chunk-3Z2HB2J6.mjs → chunk-WUIQQ7C2.mjs} +2 -2
  34. package/dist/{chunk-K625HY3P.mjs → chunk-Y6BNWBLR.mjs} +1 -1
  35. package/dist/{chunk-K625HY3P.mjs.map → chunk-Y6BNWBLR.mjs.map} +1 -1
  36. package/dist/{chunk-KL3725C5.mjs → chunk-YCHYGF5R.mjs} +1 -1
  37. package/dist/chunk-YCHYGF5R.mjs.map +1 -0
  38. package/dist/{chunk-IRWT2CO3.mjs → chunk-YFXFSV23.mjs} +1 -1
  39. package/dist/{chunk-IRWT2CO3.mjs.map → chunk-YFXFSV23.mjs.map} +1 -1
  40. package/dist/{chunk-SZB3FEBC.mjs → chunk-YZNF3EIN.mjs} +1 -1
  41. package/dist/{chunk-SZB3FEBC.mjs.map → chunk-YZNF3EIN.mjs.map} +1 -1
  42. package/dist/components/avatar.css +15 -15
  43. package/dist/components/avatar.css.map +1 -1
  44. package/dist/components/avatar.js +1 -1
  45. package/dist/components/avatar.js.map +1 -1
  46. package/dist/components/avatar.mjs +2 -2
  47. package/dist/components/badge.css +4 -4
  48. package/dist/components/badge.css.map +1 -1
  49. package/dist/components/badge.js.map +1 -1
  50. package/dist/components/badge.mjs +1 -1
  51. package/dist/components/button.css +33 -33
  52. package/dist/components/button.css.map +1 -1
  53. package/dist/components/button.js.map +1 -1
  54. package/dist/components/button.mjs +4 -4
  55. package/dist/components/card.css +4 -3
  56. package/dist/components/card.css.map +1 -1
  57. package/dist/components/card.js.map +1 -1
  58. package/dist/components/card.mjs +2 -2
  59. package/dist/components/checkbox.css +7 -7
  60. package/dist/components/checkbox.css.map +1 -1
  61. package/dist/components/checkbox.js.map +1 -1
  62. package/dist/components/checkbox.mjs +1 -1
  63. package/dist/components/dropdown-menu.css +7 -6
  64. package/dist/components/dropdown-menu.css.map +1 -1
  65. package/dist/components/dropdown-menu.js +1 -1
  66. package/dist/components/dropdown-menu.js.map +1 -1
  67. package/dist/components/dropdown-menu.mjs +4 -4
  68. package/dist/components/form.css +3 -3
  69. package/dist/components/form.css.map +1 -1
  70. package/dist/components/form.js.map +1 -1
  71. package/dist/components/form.mjs +1 -1
  72. package/dist/components/heading.css +6 -6
  73. package/dist/components/heading.css.map +1 -1
  74. package/dist/components/heading.js.map +1 -1
  75. package/dist/components/heading.mjs +2 -2
  76. package/dist/components/icon-button.css +33 -33
  77. package/dist/components/icon-button.css.map +1 -1
  78. package/dist/components/icon-button.js.map +1 -1
  79. package/dist/components/icon-button.mjs +4 -4
  80. package/dist/components/label.css +6 -6
  81. package/dist/components/label.css.map +1 -1
  82. package/dist/components/label.js.map +1 -1
  83. package/dist/components/label.mjs +1 -1
  84. package/dist/components/menu.css +7 -6
  85. package/dist/components/menu.css.map +1 -1
  86. package/dist/components/menu.js +1 -1
  87. package/dist/components/menu.js.map +1 -1
  88. package/dist/components/menu.mjs +4 -4
  89. package/dist/components/panel.css +4 -3
  90. package/dist/components/panel.css.map +1 -1
  91. package/dist/components/panel.js.map +1 -1
  92. package/dist/components/panel.mjs +2 -2
  93. package/dist/components/paragraph.css +6 -6
  94. package/dist/components/paragraph.css.map +1 -1
  95. package/dist/components/paragraph.js.map +1 -1
  96. package/dist/components/paragraph.mjs +25 -4
  97. package/dist/components/paragraph.mjs.map +1 -1
  98. package/dist/components/select.css +20 -19
  99. package/dist/components/select.css.map +1 -1
  100. package/dist/components/select.js.map +1 -1
  101. package/dist/components/select.mjs +4 -4
  102. package/dist/components/skeleton.css +25 -25
  103. package/dist/components/skeleton.css.map +1 -1
  104. package/dist/components/skeleton.js.map +1 -1
  105. package/dist/components/skeleton.mjs +1 -1
  106. package/dist/components/spinner.css +20 -20
  107. package/dist/components/spinner.css.map +1 -1
  108. package/dist/components/spinner.js.map +1 -1
  109. package/dist/components/spinner.mjs +2 -2
  110. package/dist/components/switch.css +9 -9
  111. package/dist/components/switch.css.map +1 -1
  112. package/dist/components/switch.js.map +1 -1
  113. package/dist/components/switch.mjs +1 -1
  114. package/dist/components/text-field.css +10 -10
  115. package/dist/components/text-field.css.map +1 -1
  116. package/dist/components/text-field.js.map +1 -1
  117. package/dist/components/text-field.mjs +1 -1
  118. package/dist/components/text.css +6 -6
  119. package/dist/components/text.css.map +1 -1
  120. package/dist/components/text.js.map +1 -1
  121. package/dist/components/text.mjs +2 -2
  122. package/dist/components/tooltip.css +8 -8
  123. package/dist/components/tooltip.css.map +1 -1
  124. package/dist/components/tooltip.js +16 -25
  125. package/dist/components/tooltip.js.map +1 -1
  126. package/dist/components/tooltip.mjs +7 -7
  127. package/dist/components/tooltip.mjs.map +1 -1
  128. package/dist/providers/index.css +164 -162
  129. package/dist/providers/index.css.map +1 -1
  130. package/dist/providers/index.d.mts +13 -11
  131. package/dist/providers/index.d.ts +13 -11
  132. package/dist/providers/index.js +73 -30
  133. package/dist/providers/index.js.map +1 -1
  134. package/dist/providers/index.mjs +87 -44
  135. package/dist/providers/index.mjs.map +1 -1
  136. package/dist/theme/index.css +371 -243
  137. package/dist/theme/index.css.map +1 -1
  138. package/dist/theme/index.d.mts +1 -0
  139. package/dist/theme/index.d.ts +1 -0
  140. package/dist/theme/index.js +1 -1
  141. package/dist/theme/index.js.map +1 -1
  142. package/dist/theme/index.mjs +18 -18
  143. package/package.json +1 -1
  144. package/dist/chunk-3HAUMRRS.mjs.map +0 -1
  145. package/dist/chunk-67K3UKEB.mjs.map +0 -1
  146. package/dist/chunk-FG2ZBTVM.mjs.map +0 -1
  147. package/dist/chunk-ICX6SDOZ.mjs.map +0 -1
  148. package/dist/chunk-JZLACTAO.mjs.map +0 -1
  149. package/dist/chunk-KL3725C5.mjs.map +0 -1
  150. package/dist/chunk-R6MZB2ED.mjs +0 -1
  151. package/dist/chunk-RAS2GZOT.mjs.map +0 -1
  152. package/dist/chunk-WG4IO5EQ.mjs +0 -31
  153. package/dist/chunk-WG4IO5EQ.mjs.map +0 -1
  154. /package/dist/{chunk-R6MZB2ED.mjs.map → chunk-IUXU5IPB.mjs.map} +0 -0
  155. /package/dist/{chunk-A2I7UNX6.mjs.map → chunk-LF6VSYRD.mjs.map} +0 -0
  156. /package/dist/{chunk-GI2XNLAW.mjs.map → chunk-MT2IF4CB.mjs.map} +0 -0
  157. /package/dist/{chunk-NU7XYEVP.mjs.map → chunk-PIOIL3MF.mjs.map} +0 -0
  158. /package/dist/{chunk-X6UXW66P.mjs.map → chunk-TF5DXR26.mjs.map} +0 -0
  159. /package/dist/{chunk-3Z2HB2J6.mjs.map → chunk-WUIQQ7C2.mjs.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Text
3
- } from "../chunk-3Z2HB2J6.mjs";
3
+ } from "../chunk-WUIQQ7C2.mjs";
4
4
  import {
5
5
  checkmark,
6
6
  darkTheme,
@@ -10,64 +10,104 @@ import {
10
10
  toastInner,
11
11
  toastRoot,
12
12
  toastViewport
13
- } from "../chunk-RAS2GZOT.mjs";
13
+ } from "../chunk-54ZBX4ZK.mjs";
14
14
  import {
15
15
  Heading
16
- } from "../chunk-NU7XYEVP.mjs";
16
+ } from "../chunk-PIOIL3MF.mjs";
17
17
  import {
18
18
  IconButton
19
- } from "../chunk-GI2XNLAW.mjs";
20
- import "../chunk-IRWT2CO3.mjs";
21
- import "../chunk-IPBDMBQP.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-X6UXW66P.mjs";
25
- import "../chunk-FG2ZBTVM.mjs";
26
- import "../chunk-A2I7UNX6.mjs";
27
- import "../chunk-S3GY7GCD.mjs";
28
- import {
29
- theme
30
- } from "../chunk-OETJQIMJ.mjs";
24
+ } from "../chunk-TF5DXR26.mjs";
25
+ import "../chunk-L3WLGNH2.mjs";
26
+ import "../chunk-LF6VSYRD.mjs";
27
+ import "../chunk-HFMY3EF3.mjs";
31
28
  import "../chunk-4N6P3Y54.mjs";
32
29
  import "../chunk-7EGQM3ZL.mjs";
33
30
  import "../chunk-LZOMFHX3.mjs";
34
31
 
35
32
  // src/providers/theme-provider.tsx
36
- import { createContext } from "react";
37
- import { jsx } from "react/jsx-runtime";
38
- var defaultThemeMode = "light";
39
- var ThemeContext = createContext(defaultThemeMode);
40
- var ThemeProvider = ({
41
- children,
42
- themeMode = defaultThemeMode
43
- }) => {
44
- const isDarkMode = themeMode === "dark";
45
- return /* @__PURE__ */ jsx(ThemeContext, { value: themeMode, children: /* @__PURE__ */ jsx(
46
- "div",
47
- {
48
- className: isDarkMode ? darkTheme : lightTheme,
49
- style: {
50
- backgroundColor: theme.semanticColors.background,
51
- color: theme.semanticColors.backgroundTextContrast
52
- },
53
- children
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);
53
+ } else {
54
+ (_c = document.querySelector("html")) == null ? void 0 : _c.classList.add(lightTheme);
55
+ (_d = document.querySelector("html")) == null ? void 0 : _d.classList.remove(darkTheme);
54
56
  }
55
- ) });
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";
69
+
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;
56
96
  };
57
97
 
58
- // src/providers/toaster.tsx
98
+ // src/providers/toast-provider.tsx
59
99
  import { Cross2Icon } from "@radix-ui/react-icons";
60
100
  import * as ToastPrimitives from "@radix-ui/react-toast";
61
101
  import * as React2 from "react";
62
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
63
- var defaultToaster = Object.assign(() => {
102
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
103
+ var defaultToast = Object.assign(() => {
64
104
  }, {
65
105
  success: () => {
66
106
  },
67
107
  error: () => {
68
108
  }
69
109
  });
70
- var ToasterContext = React2.createContext(defaultToaster);
110
+ var ToastProviderContext = React2.createContext(defaultToast);
71
111
  var toastElementsMapRef = React2.createRef();
72
112
  var defaultToastImpl = {
73
113
  toastElementsMapRef,
@@ -76,7 +116,7 @@ var defaultToastImpl = {
76
116
  };
77
117
  var ToastContextImpl = React2.createContext(defaultToastImpl);
78
118
  var ANIMATION_OUT_DURATION = 350;
79
- var Toaster = ({
119
+ var ToastProvider = ({
80
120
  children,
81
121
  ...props
82
122
  }) => {
@@ -125,7 +165,10 @@ var Toaster = ({
125
165
  [handleAddToast]
126
166
  );
127
167
  const handleDispatchError = React2.useCallback(
128
- (payload) => handleAddToast({ ...payload, status: "error" }),
168
+ (payload) => (
169
+ // default duration of 10 mins for `status: "error"`.
170
+ handleAddToast({ duration: 60 * 1e3 * 10, ...payload, status: "error" })
171
+ ),
129
172
  [handleAddToast]
130
173
  );
131
174
  React2.useEffect(() => {
@@ -162,7 +205,7 @@ var Toaster = ({
162
205
  }),
163
206
  [handleDispatchDefault, handleDispatchSuccess, handleDispatchError]
164
207
  );
165
- return /* @__PURE__ */ jsx2(ToasterContext.Provider, { value: toastApi, children: /* @__PURE__ */ jsx2(
208
+ return /* @__PURE__ */ jsx2(ToastProviderContext.Provider, { value: toastApi, children: /* @__PURE__ */ jsx2(
166
209
  ToastContextImpl.Provider,
167
210
  {
168
211
  value: React2.useMemo(
@@ -172,7 +215,7 @@ var Toaster = ({
172
215
  }),
173
216
  [sortToasts]
174
217
  ),
175
- children: /* @__PURE__ */ jsxs(ToastPrimitives.Provider, { ...props, children: [
218
+ children: /* @__PURE__ */ jsxs2(ToastPrimitives.Provider, { ...props, children: [
176
219
  children,
177
220
  Array.from(toasts).map(([key, toast]) => /* @__PURE__ */ jsx2(
178
221
  Toast,
@@ -225,7 +268,7 @@ var Toast = (props) => {
225
268
  duration: toast.duration,
226
269
  className: toastRoot,
227
270
  onOpenChange,
228
- children: /* @__PURE__ */ jsxs("div", { className: toastInner, "data-status": toast.status, children: [
271
+ children: /* @__PURE__ */ jsxs2("div", { className: toastInner, "data-status": toast.status, children: [
229
272
  /* @__PURE__ */ jsx2(ToastStatusIcon, { status: toast.status }),
230
273
  /* @__PURE__ */ jsx2(ToastPrimitives.Title, { asChild: true, style: { gridArea: "title" }, children: /* @__PURE__ */ jsx2(Heading, { level: "6", children: toast.title }) }),
231
274
  /* @__PURE__ */ jsx2(
@@ -251,7 +294,7 @@ var Toast = (props) => {
251
294
  );
252
295
  };
253
296
  var ToastStatusIcon = ({ status }) => {
254
- 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: [
255
298
  status === "success" && /* @__PURE__ */ jsx2(CheckmarkIcon, {}),
256
299
  status === "error" && /* @__PURE__ */ jsx2(ErrorIcon, {})
257
300
  ] }) : null;
@@ -275,7 +318,7 @@ export {
275
318
  ThemeContext,
276
319
  ThemeProvider,
277
320
  ToastAction,
278
- Toaster,
279
- ToasterContext
321
+ ToastProvider,
322
+ ToastProviderContext
280
323
  };
281
324
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/theme-provider.tsx","../../src/providers/toaster.tsx"],"sourcesContent":["import { theme } from \"@/theme/theme-contracts/theme-contract.css\";\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 const isDarkMode = themeMode === \"dark\";\n\n return (\n <ThemeContext value={themeMode}>\n <div\n className={isDarkMode ? darkTheme : lightTheme}\n style={{\n backgroundColor: theme.semanticColors.background,\n color: theme.semanticColors.backgroundTextContrast,\n }}\n >\n {children}\n </div>\n </ThemeContext>\n );\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 handleAddToast({ ...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"]}