@upstash/react-redis-browser 0.2.7-canary-3 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.css CHANGED
@@ -1403,6 +1403,10 @@
1403
1403
  .ups-db .bg-black\/50 {
1404
1404
  background-color: rgb(var(--color-black) / 0.5);
1405
1405
  }
1406
+ .ups-db .bg-blue-100 {
1407
+ --tw-bg-opacity: 1;
1408
+ background-color: rgb(var(--color-blue-100) / var(--tw-bg-opacity));
1409
+ }
1406
1410
  .ups-db .bg-emerald-500 {
1407
1411
  --tw-bg-opacity: 1;
1408
1412
  background-color: rgb(var(--color-emerald-500) / var(--tw-bg-opacity));
@@ -1986,6 +1990,10 @@
1986
1990
  .ups-db .hover\:bg-black\/10:hover {
1987
1991
  background-color: rgb(var(--color-black) / 0.1);
1988
1992
  }
1993
+ .ups-db .hover\:bg-blue-600:hover {
1994
+ --tw-bg-opacity: 1;
1995
+ background-color: rgb(var(--color-blue-600) / var(--tw-bg-opacity));
1996
+ }
1989
1997
  .ups-db .hover\:bg-emerald-600:hover {
1990
1998
  --tw-bg-opacity: 1;
1991
1999
  background-color: rgb(var(--color-emerald-600) / var(--tw-bg-opacity));
@@ -2011,6 +2019,10 @@
2011
2019
  --tw-bg-opacity: 1;
2012
2020
  background-color: rgb(var(--color-zinc-50) / var(--tw-bg-opacity));
2013
2021
  }
2022
+ .ups-db .hover\:text-white:hover {
2023
+ --tw-text-opacity: 1;
2024
+ color: rgb(var(--color-white) / var(--tw-text-opacity));
2025
+ }
2014
2026
  .ups-db .hover\:text-zinc-500:hover {
2015
2027
  --tw-text-opacity: 1;
2016
2028
  color: rgb(var(--color-zinc-500) / var(--tw-text-opacity));
package/dist/index.d.mts CHANGED
@@ -14,8 +14,14 @@ type RedisBrowserStorage = {
14
14
  set: (value: string) => void;
15
15
  get: () => string | null;
16
16
  };
17
- declare const RedisBrowser: ({ token, url, hideTabs, storage, darkMode, }: RedisCredentials & {
17
+ declare const RedisBrowser: ({ token, url, hideTabs, storage, onFullScreenClick, theme, }: RedisCredentials & {
18
18
  hideTabs?: boolean;
19
+ /**
20
+ * If defined, the databrowser will have a full screen button in the tab bar.
21
+ * Clicking on the button will call this function.
22
+ * @returns
23
+ */
24
+ onFullScreenClick?: () => void;
19
25
  /**
20
26
  * Persistence storage for the Databrowser.
21
27
  *
@@ -29,19 +35,19 @@ declare const RedisBrowser: ({ token, url, hideTabs, storage, darkMode, }: Redis
29
35
  */
30
36
  storage?: RedisBrowserStorage;
31
37
  /**
32
- * Dark mode configuration.
38
+ * Theme configuration (light or dark).
33
39
  *
34
40
  * @default "light"
35
41
  * @example
36
42
  * ```tsx
37
43
  * // Light mode (default)
38
- * <RedisBrowser darkMode="light" />
44
+ * <RedisBrowser theme="light" />
39
45
  *
40
46
  * // Dark mode
41
- * <RedisBrowser darkMode="dark" />
47
+ * <RedisBrowser theme="dark" />
42
48
  * ```
43
49
  */
44
- darkMode?: DarkModeOption;
50
+ theme?: DarkModeOption;
45
51
  }) => react_jsx_runtime.JSX.Element;
46
52
 
47
53
  export { type DarkModeOption, RedisBrowser, type RedisBrowserStorage };
package/dist/index.d.ts CHANGED
@@ -14,8 +14,14 @@ type RedisBrowserStorage = {
14
14
  set: (value: string) => void;
15
15
  get: () => string | null;
16
16
  };
17
- declare const RedisBrowser: ({ token, url, hideTabs, storage, darkMode, }: RedisCredentials & {
17
+ declare const RedisBrowser: ({ token, url, hideTabs, storage, onFullScreenClick, theme, }: RedisCredentials & {
18
18
  hideTabs?: boolean;
19
+ /**
20
+ * If defined, the databrowser will have a full screen button in the tab bar.
21
+ * Clicking on the button will call this function.
22
+ * @returns
23
+ */
24
+ onFullScreenClick?: () => void;
19
25
  /**
20
26
  * Persistence storage for the Databrowser.
21
27
  *
@@ -29,19 +35,19 @@ declare const RedisBrowser: ({ token, url, hideTabs, storage, darkMode, }: Redis
29
35
  */
30
36
  storage?: RedisBrowserStorage;
31
37
  /**
32
- * Dark mode configuration.
38
+ * Theme configuration (light or dark).
33
39
  *
34
40
  * @default "light"
35
41
  * @example
36
42
  * ```tsx
37
43
  * // Light mode (default)
38
- * <RedisBrowser darkMode="light" />
44
+ * <RedisBrowser theme="light" />
39
45
  *
40
46
  * // Dark mode
41
- * <RedisBrowser darkMode="dark" />
47
+ * <RedisBrowser theme="dark" />
42
48
  * ```
43
49
  */
44
- darkMode?: DarkModeOption;
50
+ theme?: DarkModeOption;
45
51
  }) => react_jsx_runtime.JSX.Element;
46
52
 
47
53
  export { type DarkModeOption, RedisBrowser, type RedisBrowserStorage };
package/dist/index.js CHANGED
@@ -7,16 +7,16 @@ var _jsxruntime = require('react/jsx-runtime');
7
7
  var DarkModeContext = _react.createContext.call(void 0, void 0);
8
8
  var DarkModeProvider = ({
9
9
  children,
10
- darkMode
10
+ theme
11
11
  }) => {
12
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DarkModeContext.Provider, { value: { darkMode }, children });
12
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DarkModeContext.Provider, { value: theme, children });
13
13
  };
14
- var useDarkMode = () => {
14
+ var useTheme = () => {
15
15
  const context = _react.useContext.call(void 0, DarkModeContext);
16
16
  if (!context) {
17
17
  throw new Error("useDarkMode must be used within a DarkModeProvider");
18
18
  }
19
- return context.darkMode;
19
+ return context;
20
20
  };
21
21
 
22
22
  // src/redis-context.tsx
@@ -5128,7 +5128,7 @@ var CustomEditor = ({
5128
5128
  const { active } = useTab();
5129
5129
  const monaco = _react2.useMonaco.call(void 0, );
5130
5130
  const editorRef = _react.useRef.call(void 0, );
5131
- const theme = useDarkMode();
5131
+ const theme = useTheme();
5132
5132
  _react.useEffect.call(void 0, () => {
5133
5133
  if (!active || !monaco || !editorRef.current) {
5134
5134
  return;
@@ -6472,7 +6472,7 @@ var SortableTab = ({ id }) => {
6472
6472
  }
6473
6473
  );
6474
6474
  };
6475
- var DatabrowserTabs = () => {
6475
+ var DatabrowserTabs = ({ onFullScreenClick }) => {
6476
6476
  const { tabs, reorderTabs, selectedTab, selectTab } = useDatabrowserStore();
6477
6477
  const sortedTabs = _react.useMemo.call(void 0, () => {
6478
6478
  return [...tabs].sort(([, a], [, b]) => {
@@ -6595,7 +6595,18 @@ var DatabrowserTabs = () => {
6595
6595
  ] }),
6596
6596
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-1 pl-1", children: [
6597
6597
  isOverflow && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AddTabButton, {}),
6598
- tabs.length > 1 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TabsListButton, { tabs, onSelectTab: selectTab })
6598
+ tabs.length > 1 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TabsListButton, { tabs, onSelectTab: selectTab }),
6599
+ onFullScreenClick && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
6600
+ Button,
6601
+ {
6602
+ "aria-label": "Toggle fullscreen",
6603
+ variant: "secondary",
6604
+ size: "icon-sm",
6605
+ onClick: onFullScreenClick,
6606
+ className: "flex-shrink-0 bg-blue-100 hover:bg-blue-600 hover:text-white",
6607
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _iconsreact.IconMaximize, { size: 16 })
6608
+ }
6609
+ )
6599
6610
  ] })
6600
6611
  ] })
6601
6612
  ] });
@@ -6687,20 +6698,29 @@ var RedisBrowser = ({
6687
6698
  url,
6688
6699
  hideTabs,
6689
6700
  storage,
6690
- darkMode = "light"
6701
+ onFullScreenClick,
6702
+ theme = "light"
6691
6703
  }) => {
6692
6704
  const credentials = _react.useMemo.call(void 0, () => ({ token, url }), [token, url]);
6693
6705
  const rootRef = _react.useRef.call(void 0, null);
6694
6706
  _react.useEffect.call(void 0, () => {
6695
6707
  queryClient.resetQueries();
6696
6708
  }, [credentials.url]);
6697
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactquery.QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, RedisProvider, { redisCredentials: credentials, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DarkModeProvider, { darkMode, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DatabrowserProvider, { storage, rootRef, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reacttooltip.TooltipProvider, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, RedisBrowserRoot, { hideTabs, rootRef }) }) }) }) }) });
6709
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactquery.QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, RedisProvider, { redisCredentials: credentials, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DarkModeProvider, { theme, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DatabrowserProvider, { storage, rootRef, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reacttooltip.TooltipProvider, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
6710
+ RedisBrowserRoot,
6711
+ {
6712
+ hideTabs,
6713
+ rootRef,
6714
+ onFullScreenClick
6715
+ }
6716
+ ) }) }) }) }) });
6698
6717
  };
6699
6718
  var RedisBrowserRoot = ({
6700
6719
  hideTabs,
6701
- rootRef
6720
+ rootRef,
6721
+ onFullScreenClick
6702
6722
  }) => {
6703
- const theme = useDarkMode();
6723
+ const theme = useTheme();
6704
6724
  _react.useEffect.call(void 0, () => {
6705
6725
  portalWrapper.classList.add("text-zinc-700");
6706
6726
  portalWrapper.classList.toggle("dark", theme === "dark");
@@ -6714,7 +6734,7 @@ var RedisBrowserRoot = ({
6714
6734
  style: { height: "100%" },
6715
6735
  ref: rootRef,
6716
6736
  children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-full flex-col text-zinc-700", children: [
6717
- !hideTabs && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DatabrowserTabs, {}),
6737
+ !hideTabs && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DatabrowserTabs, { onFullScreenClick }),
6718
6738
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DatabrowserInstances, {})
6719
6739
  ] })
6720
6740
  }
package/dist/index.mjs CHANGED
@@ -7,16 +7,16 @@ import { jsx } from "react/jsx-runtime";
7
7
  var DarkModeContext = createContext(void 0);
8
8
  var DarkModeProvider = ({
9
9
  children,
10
- darkMode
10
+ theme
11
11
  }) => {
12
- return /* @__PURE__ */ jsx(DarkModeContext.Provider, { value: { darkMode }, children });
12
+ return /* @__PURE__ */ jsx(DarkModeContext.Provider, { value: theme, children });
13
13
  };
14
- var useDarkMode = () => {
14
+ var useTheme = () => {
15
15
  const context = useContext(DarkModeContext);
16
16
  if (!context) {
17
17
  throw new Error("useDarkMode must be used within a DarkModeProvider");
18
18
  }
19
- return context.darkMode;
19
+ return context;
20
20
  };
21
21
 
22
22
  // src/redis-context.tsx
@@ -5128,7 +5128,7 @@ var CustomEditor = ({
5128
5128
  const { active } = useTab();
5129
5129
  const monaco = useMonaco();
5130
5130
  const editorRef = useRef2();
5131
- const theme = useDarkMode();
5131
+ const theme = useTheme();
5132
5132
  useEffect7(() => {
5133
5133
  if (!active || !monaco || !editorRef.current) {
5134
5134
  return;
@@ -6165,7 +6165,7 @@ import {
6165
6165
  import { restrictToHorizontalAxis } from "@dnd-kit/modifiers";
6166
6166
  import { horizontalListSortingStrategy, SortableContext, useSortable } from "@dnd-kit/sortable";
6167
6167
  import { CSS } from "@dnd-kit/utilities";
6168
- import { IconChevronDown as IconChevronDown2, IconPlus as IconPlus2 } from "@tabler/icons-react";
6168
+ import { IconChevronDown as IconChevronDown2, IconMaximize, IconPlus as IconPlus2 } from "@tabler/icons-react";
6169
6169
 
6170
6170
  // src/components/ui/command.tsx
6171
6171
  import * as React13 from "react";
@@ -6472,7 +6472,7 @@ var SortableTab = ({ id }) => {
6472
6472
  }
6473
6473
  );
6474
6474
  };
6475
- var DatabrowserTabs = () => {
6475
+ var DatabrowserTabs = ({ onFullScreenClick }) => {
6476
6476
  const { tabs, reorderTabs, selectedTab, selectTab } = useDatabrowserStore();
6477
6477
  const sortedTabs = useMemo8(() => {
6478
6478
  return [...tabs].sort(([, a], [, b]) => {
@@ -6595,7 +6595,18 @@ var DatabrowserTabs = () => {
6595
6595
  ] }),
6596
6596
  /* @__PURE__ */ jsxs35("div", { className: "flex items-center gap-1 pl-1", children: [
6597
6597
  isOverflow && /* @__PURE__ */ jsx52(AddTabButton, {}),
6598
- tabs.length > 1 && /* @__PURE__ */ jsx52(TabsListButton, { tabs, onSelectTab: selectTab })
6598
+ tabs.length > 1 && /* @__PURE__ */ jsx52(TabsListButton, { tabs, onSelectTab: selectTab }),
6599
+ onFullScreenClick && /* @__PURE__ */ jsx52(
6600
+ Button,
6601
+ {
6602
+ "aria-label": "Toggle fullscreen",
6603
+ variant: "secondary",
6604
+ size: "icon-sm",
6605
+ onClick: onFullScreenClick,
6606
+ className: "flex-shrink-0 bg-blue-100 hover:bg-blue-600 hover:text-white",
6607
+ children: /* @__PURE__ */ jsx52(IconMaximize, { size: 16 })
6608
+ }
6609
+ )
6599
6610
  ] })
6600
6611
  ] })
6601
6612
  ] });
@@ -6687,20 +6698,29 @@ var RedisBrowser = ({
6687
6698
  url,
6688
6699
  hideTabs,
6689
6700
  storage,
6690
- darkMode = "light"
6701
+ onFullScreenClick,
6702
+ theme = "light"
6691
6703
  }) => {
6692
6704
  const credentials = useMemo9(() => ({ token, url }), [token, url]);
6693
6705
  const rootRef = useRef6(null);
6694
6706
  useEffect14(() => {
6695
6707
  queryClient.resetQueries();
6696
6708
  }, [credentials.url]);
6697
- return /* @__PURE__ */ jsx53(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx53(RedisProvider, { redisCredentials: credentials, children: /* @__PURE__ */ jsx53(DarkModeProvider, { darkMode, children: /* @__PURE__ */ jsx53(DatabrowserProvider, { storage, rootRef, children: /* @__PURE__ */ jsx53(TooltipProvider, { children: /* @__PURE__ */ jsx53(RedisBrowserRoot, { hideTabs, rootRef }) }) }) }) }) });
6709
+ return /* @__PURE__ */ jsx53(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx53(RedisProvider, { redisCredentials: credentials, children: /* @__PURE__ */ jsx53(DarkModeProvider, { theme, children: /* @__PURE__ */ jsx53(DatabrowserProvider, { storage, rootRef, children: /* @__PURE__ */ jsx53(TooltipProvider, { children: /* @__PURE__ */ jsx53(
6710
+ RedisBrowserRoot,
6711
+ {
6712
+ hideTabs,
6713
+ rootRef,
6714
+ onFullScreenClick
6715
+ }
6716
+ ) }) }) }) }) });
6698
6717
  };
6699
6718
  var RedisBrowserRoot = ({
6700
6719
  hideTabs,
6701
- rootRef
6720
+ rootRef,
6721
+ onFullScreenClick
6702
6722
  }) => {
6703
- const theme = useDarkMode();
6723
+ const theme = useTheme();
6704
6724
  useEffect14(() => {
6705
6725
  portalWrapper.classList.add("text-zinc-700");
6706
6726
  portalWrapper.classList.toggle("dark", theme === "dark");
@@ -6714,7 +6734,7 @@ var RedisBrowserRoot = ({
6714
6734
  style: { height: "100%" },
6715
6735
  ref: rootRef,
6716
6736
  children: /* @__PURE__ */ jsxs36("div", { className: "flex h-full flex-col text-zinc-700", children: [
6717
- !hideTabs && /* @__PURE__ */ jsx53(DatabrowserTabs, {}),
6737
+ !hideTabs && /* @__PURE__ */ jsx53(DatabrowserTabs, { onFullScreenClick }),
6718
6738
  /* @__PURE__ */ jsx53(DatabrowserInstances, {})
6719
6739
  ] })
6720
6740
  }
package/package.json CHANGED
@@ -1 +1 @@
1
- { "name": "@upstash/react-redis-browser", "version": "v0.2.7-canary-3", "main": "./dist/index.js", "types": "./dist/index.d.ts", "license": "MIT", "private": false, "publishConfig": { "access": "public" }, "bugs": { "url": "https://github.com/upstash/react-redis-browser/issues" }, "homepage": "https://github.com/upstash/react-redis-browser", "files": [ "./dist/**" ], "scripts": { "build": "tsup", "dev": "vite", "lint": "tsc && eslint", "fmt": "prettier --write ./src" }, "lint-staged": { "**/*.{js,ts,tsx}": [ "prettier --write", "eslint --fix" ] }, "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@ianvs/prettier-plugin-sort-imports": "^4.4.0", "@monaco-editor/react": "^4.6.0", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-context-menu": "^2.2.2", "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-dropdown-menu": "^2.1.15", "@radix-ui/react-icons": "1.3.0", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-portal": "^1.1.2", "@radix-ui/react-scroll-area": "^1.0.3", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", "@tabler/icons-react": "^3.19.0", "@tanstack/react-query": "^5.32.0", "@types/bytes": "^3.1.4", "@upstash/redis": "^1.35.3", "bytes": "^3.1.2", "cmdk": "^1.1.1", "react-hook-form": "^7.53.0", "react-resizable-panels": "^2.1.4", "zustand": "5.0.0" }, "devDependencies": { "@playwright/test": "^1.53.1", "@types/node": "^22.8.4", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@typescript-eslint/eslint-plugin": "8.4.0", "@typescript-eslint/parser": "8.4.0", "@vitejs/plugin-react": "^4.1.0", "autoprefixer": "^10.4.14", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "dotenv": "^16.5.0", "eslint": "9.10.0", "eslint-plugin-unicorn": "55.0.0", "postcss": "^8.4.31", "postcss-prefix-selector": "^2.1.0", "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.5", "react": "^18.3.1", "react-dom": "^18.3.1", "tailwind-merge": "^2.5.4", "tailwindcss": "^3.4.14", "tailwindcss-animate": "^1.0.7", "tsup": "^8.3.5", "typescript": "^5.0.4", "vite": "^5.4.10", "vite-tsconfig-paths": "^5.0.1" }, "peerDependencies": { "react": "^18.2.0 || ^19", "react-dom": "^18.2.0 || ^19" } }
1
+ { "name": "@upstash/react-redis-browser", "version": "v0.2.7", "main": "./dist/index.js", "types": "./dist/index.d.ts", "license": "MIT", "private": false, "publishConfig": { "access": "public" }, "bugs": { "url": "https://github.com/upstash/react-redis-browser/issues" }, "homepage": "https://github.com/upstash/react-redis-browser", "files": [ "./dist/**" ], "scripts": { "build": "tsup", "dev": "vite", "lint": "tsc && eslint", "fmt": "prettier --write ./src" }, "lint-staged": { "**/*.{js,ts,tsx}": [ "prettier --write", "eslint --fix" ] }, "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@ianvs/prettier-plugin-sort-imports": "^4.4.0", "@monaco-editor/react": "^4.6.0", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-context-menu": "^2.2.2", "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-dropdown-menu": "^2.1.15", "@radix-ui/react-icons": "1.3.0", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-portal": "^1.1.2", "@radix-ui/react-scroll-area": "^1.0.3", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", "@tabler/icons-react": "^3.19.0", "@tanstack/react-query": "^5.32.0", "@types/bytes": "^3.1.4", "@upstash/redis": "^1.35.3", "bytes": "^3.1.2", "cmdk": "^1.1.1", "react-hook-form": "^7.53.0", "react-resizable-panels": "^2.1.4", "zustand": "5.0.0" }, "devDependencies": { "@playwright/test": "^1.56.1", "@types/node": "^22.8.4", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@typescript-eslint/eslint-plugin": "8.4.0", "@typescript-eslint/parser": "8.4.0", "@vitejs/plugin-react": "^4.1.0", "autoprefixer": "^10.4.14", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "dotenv": "^16.5.0", "eslint": "9.10.0", "eslint-plugin-unicorn": "55.0.0", "postcss": "^8.4.31", "postcss-prefix-selector": "^2.1.0", "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.5", "react": "^18.3.1", "react-dom": "^18.3.1", "tailwind-merge": "^2.5.4", "tailwindcss": "^3.4.14", "tailwindcss-animate": "^1.0.7", "tsup": "^8.3.5", "typescript": "^5.0.4", "vite": "^5.4.10", "vite-tsconfig-paths": "^5.0.1" }, "peerDependencies": { "react": "^18.2.0 || ^19", "react-dom": "^18.2.0 || ^19" } }