@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 +12 -0
- package/dist/index.d.mts +11 -5
- package/dist/index.d.ts +11 -5
- package/dist/index.js +32 -12
- package/dist/index.mjs +33 -13
- package/package.json +1 -1
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,
|
|
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
|
-
*
|
|
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
|
|
44
|
+
* <RedisBrowser theme="light" />
|
|
39
45
|
*
|
|
40
46
|
* // Dark mode
|
|
41
|
-
* <RedisBrowser
|
|
47
|
+
* <RedisBrowser theme="dark" />
|
|
42
48
|
* ```
|
|
43
49
|
*/
|
|
44
|
-
|
|
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,
|
|
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
|
-
*
|
|
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
|
|
44
|
+
* <RedisBrowser theme="light" />
|
|
39
45
|
*
|
|
40
46
|
* // Dark mode
|
|
41
|
-
* <RedisBrowser
|
|
47
|
+
* <RedisBrowser theme="dark" />
|
|
42
48
|
* ```
|
|
43
49
|
*/
|
|
44
|
-
|
|
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
|
-
|
|
10
|
+
theme
|
|
11
11
|
}) => {
|
|
12
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DarkModeContext.Provider, { value:
|
|
12
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DarkModeContext.Provider, { value: theme, children });
|
|
13
13
|
};
|
|
14
|
-
var
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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, {
|
|
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 =
|
|
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
|
-
|
|
10
|
+
theme
|
|
11
11
|
}) => {
|
|
12
|
-
return /* @__PURE__ */ jsx(DarkModeContext.Provider, { value:
|
|
12
|
+
return /* @__PURE__ */ jsx(DarkModeContext.Provider, { value: theme, children });
|
|
13
13
|
};
|
|
14
|
-
var
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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, {
|
|
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 =
|
|
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
|
|
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" } }
|