@rageshpikalmunde/rp-image-editor-react 1.1.0
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/cjs/RpImageEditor.js +40 -0
- package/dist/cjs/RpImageEditor.js.map +1 -0
- package/dist/cjs/index.js +14 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/useRpImageEditor.js +32 -0
- package/dist/cjs/useRpImageEditor.js.map +1 -0
- package/dist/esm/RpImageEditor.js +36 -0
- package/dist/esm/RpImageEditor.js.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/useRpImageEditor.js +28 -0
- package/dist/esm/useRpImageEditor.js.map +1 -0
- package/dist/types/RpImageEditor.d.ts +21 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/useRpImageEditor.d.ts +23 -0
- package/package.json +49 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RpImageEditorComponent = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const rp_image_editor_1 = require("@rageshpikalmunde/rp-image-editor");
|
|
7
|
+
/**
|
|
8
|
+
* React component that renders the image editor inline.
|
|
9
|
+
* For modal usage, use the `useRpImageEditor()` hook instead.
|
|
10
|
+
*/
|
|
11
|
+
const RpImageEditorComponent = ({ image, config, onImageEdited, onError, className, style, }) => {
|
|
12
|
+
const containerRef = (0, react_1.useRef)(null);
|
|
13
|
+
const editorRef = (0, react_1.useRef)(null);
|
|
14
|
+
(0, react_1.useEffect)(() => {
|
|
15
|
+
if (!image || !containerRef.current)
|
|
16
|
+
return;
|
|
17
|
+
// Destroy previous editor
|
|
18
|
+
if (editorRef.current) {
|
|
19
|
+
editorRef.current.destroy();
|
|
20
|
+
}
|
|
21
|
+
const editor = new rp_image_editor_1.RpImageEditor(containerRef.current, config);
|
|
22
|
+
editorRef.current = editor;
|
|
23
|
+
editor.on('error', (err) => onError?.(err));
|
|
24
|
+
editor.loadImage(image).catch((err) => onError?.(err));
|
|
25
|
+
return () => {
|
|
26
|
+
editor.destroy();
|
|
27
|
+
editorRef.current = null;
|
|
28
|
+
};
|
|
29
|
+
}, [image]); // Re-init when image changes
|
|
30
|
+
return ((0, jsx_runtime_1.jsx)("div", { ref: containerRef, className: className || 'rp-image-editor-host', style: {
|
|
31
|
+
width: '100%',
|
|
32
|
+
height: '100%',
|
|
33
|
+
display: 'flex',
|
|
34
|
+
flexDirection: 'column',
|
|
35
|
+
minHeight: 300,
|
|
36
|
+
...style,
|
|
37
|
+
} }));
|
|
38
|
+
};
|
|
39
|
+
exports.RpImageEditorComponent = RpImageEditorComponent;
|
|
40
|
+
//# sourceMappingURL=RpImageEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpImageEditor.js","sourceRoot":"","sources":["../../src/RpImageEditor.tsx"],"names":[],"mappings":";;;;AAAA,iCAA8D;AAC9D,uEAAkG;AAsBlG;;;GAGG;AACI,MAAM,sBAAsB,GAAiC,CAAC,EACnE,KAAK,EACL,MAAM,EACN,aAAa,EACb,OAAO,EACP,SAAS,EACT,KAAK,GACN,EAAE,EAAE;IACH,MAAM,YAAY,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAA,cAAM,EAAuB,IAAI,CAAC,CAAC;IAErD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE,OAAO;QAE5C,0BAA0B;QAC1B,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,+BAAa,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/D,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;QAE3B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAE5C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,6BAA6B;IAE1C,OAAO,CACL,gCACE,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,SAAS,IAAI,sBAAsB,EAC9C,KAAK,EAAE;YACL,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,GAAG;YACd,GAAG,KAAK;SACT,GACD,CACH,CAAC;AACJ,CAAC,CAAC;AA9CW,QAAA,sBAAsB,0BA8CjC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @rageshpikalmunde/rp-image-editor-react
|
|
4
|
+
* React wrapper for the rp-image-editor plugin
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.useRpImageEditor = exports.RpImageEditorComponent = void 0;
|
|
8
|
+
// Component
|
|
9
|
+
var RpImageEditor_1 = require("./RpImageEditor");
|
|
10
|
+
Object.defineProperty(exports, "RpImageEditorComponent", { enumerable: true, get: function () { return RpImageEditor_1.RpImageEditorComponent; } });
|
|
11
|
+
// Hook
|
|
12
|
+
var useRpImageEditor_1 = require("./useRpImageEditor");
|
|
13
|
+
Object.defineProperty(exports, "useRpImageEditor", { enumerable: true, get: function () { return useRpImageEditor_1.useRpImageEditor; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,YAAY;AACZ,iDAAyD;AAAhD,uHAAA,sBAAsB,OAAA;AAG/B,OAAO;AACP,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useRpImageEditor = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const rp_image_editor_1 = require("@rageshpikalmunde/rp-image-editor");
|
|
6
|
+
/**
|
|
7
|
+
* React hook to open the image editor as a modal overlay.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```tsx
|
|
11
|
+
* function MyComponent() {
|
|
12
|
+
* const { openEditor } = useRpImageEditor();
|
|
13
|
+
*
|
|
14
|
+
* const handleEdit = async (file: File) => {
|
|
15
|
+
* const result = await openEditor(file, {
|
|
16
|
+
* theme: { applyButtonBackground: '#28a745' }
|
|
17
|
+
* });
|
|
18
|
+
* if (result) {
|
|
19
|
+
* console.log(result.file); // upload
|
|
20
|
+
* }
|
|
21
|
+
* };
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function useRpImageEditor() {
|
|
26
|
+
const openEditor = (0, react_1.useCallback)(async (image, config) => {
|
|
27
|
+
return (0, rp_image_editor_1.openEditorModal)({ image, config });
|
|
28
|
+
}, []);
|
|
29
|
+
return { openEditor };
|
|
30
|
+
}
|
|
31
|
+
exports.useRpImageEditor = useRpImageEditor;
|
|
32
|
+
//# sourceMappingURL=useRpImageEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRpImageEditor.js","sourceRoot":"","sources":["../../src/useRpImageEditor.ts"],"names":[],"mappings":";;;AAAA,iCAAoC;AACpC,uEAI2C;AAE3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,gBAAgB;IAC9B,MAAM,UAAU,GAAG,IAAA,mBAAW,EAC5B,KAAK,EACH,KAA2B,EAC3B,MAAgC,EACA,EAAE;QAClC,OAAO,IAAA,iCAAe,EAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC,EACD,EAAE,CACH,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,CAAC;AACxB,CAAC;AAZD,4CAYC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect } from 'react';
|
|
3
|
+
import { RpImageEditor } from '@rageshpikalmunde/rp-image-editor';
|
|
4
|
+
/**
|
|
5
|
+
* React component that renders the image editor inline.
|
|
6
|
+
* For modal usage, use the `useRpImageEditor()` hook instead.
|
|
7
|
+
*/
|
|
8
|
+
export const RpImageEditorComponent = ({ image, config, onImageEdited, onError, className, style, }) => {
|
|
9
|
+
const containerRef = useRef(null);
|
|
10
|
+
const editorRef = useRef(null);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!image || !containerRef.current)
|
|
13
|
+
return;
|
|
14
|
+
// Destroy previous editor
|
|
15
|
+
if (editorRef.current) {
|
|
16
|
+
editorRef.current.destroy();
|
|
17
|
+
}
|
|
18
|
+
const editor = new RpImageEditor(containerRef.current, config);
|
|
19
|
+
editorRef.current = editor;
|
|
20
|
+
editor.on('error', (err) => onError?.(err));
|
|
21
|
+
editor.loadImage(image).catch((err) => onError?.(err));
|
|
22
|
+
return () => {
|
|
23
|
+
editor.destroy();
|
|
24
|
+
editorRef.current = null;
|
|
25
|
+
};
|
|
26
|
+
}, [image]); // Re-init when image changes
|
|
27
|
+
return (_jsx("div", { ref: containerRef, className: className || 'rp-image-editor-host', style: {
|
|
28
|
+
width: '100%',
|
|
29
|
+
height: '100%',
|
|
30
|
+
display: 'flex',
|
|
31
|
+
flexDirection: 'column',
|
|
32
|
+
minHeight: 300,
|
|
33
|
+
...style,
|
|
34
|
+
} }));
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=RpImageEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpImageEditor.js","sourceRoot":"","sources":["../../src/RpImageEditor.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,MAAM,EAAE,SAAS,EAAe,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAkC,MAAM,mCAAmC,CAAC;AAsBlG;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAiC,CAAC,EACnE,KAAK,EACL,MAAM,EACN,aAAa,EACb,OAAO,EACP,SAAS,EACT,KAAK,GACN,EAAE,EAAE;IACH,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAErD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE,OAAO;QAE5C,0BAA0B;QAC1B,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/D,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;QAE3B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAE5C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,6BAA6B;IAE1C,OAAO,CACL,cACE,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,SAAS,IAAI,sBAAsB,EAC9C,KAAK,EAAE;YACL,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,GAAG;YACd,GAAG,KAAK;SACT,GACD,CACH,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rageshpikalmunde/rp-image-editor-react
|
|
3
|
+
* React wrapper for the rp-image-editor plugin
|
|
4
|
+
*/
|
|
5
|
+
// Component
|
|
6
|
+
export { RpImageEditorComponent } from './RpImageEditor';
|
|
7
|
+
// Hook
|
|
8
|
+
export { useRpImageEditor } from './useRpImageEditor';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY;AACZ,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO;AACP,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { openEditorModal, } from '@rageshpikalmunde/rp-image-editor';
|
|
3
|
+
/**
|
|
4
|
+
* React hook to open the image editor as a modal overlay.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```tsx
|
|
8
|
+
* function MyComponent() {
|
|
9
|
+
* const { openEditor } = useRpImageEditor();
|
|
10
|
+
*
|
|
11
|
+
* const handleEdit = async (file: File) => {
|
|
12
|
+
* const result = await openEditor(file, {
|
|
13
|
+
* theme: { applyButtonBackground: '#28a745' }
|
|
14
|
+
* });
|
|
15
|
+
* if (result) {
|
|
16
|
+
* console.log(result.file); // upload
|
|
17
|
+
* }
|
|
18
|
+
* };
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function useRpImageEditor() {
|
|
23
|
+
const openEditor = useCallback(async (image, config) => {
|
|
24
|
+
return openEditorModal({ image, config });
|
|
25
|
+
}, []);
|
|
26
|
+
return { openEditor };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=useRpImageEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRpImageEditor.js","sourceRoot":"","sources":["../../src/useRpImageEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAGL,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAE3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,WAAW,CAC5B,KAAK,EACH,KAA2B,EAC3B,MAAgC,EACA,EAAE;QAClC,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC,EACD,EAAE,CACH,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { RpEditorConfig, RpEditorResult } from '@rageshpikalmunde/rp-image-editor';
|
|
3
|
+
export interface RpImageEditorProps {
|
|
4
|
+
/** Image source — File, Blob, or URL string */
|
|
5
|
+
image: File | Blob | string | null;
|
|
6
|
+
/** Editor configuration */
|
|
7
|
+
config?: Partial<RpEditorConfig>;
|
|
8
|
+
/** Called when user clicks Apply */
|
|
9
|
+
onImageEdited?: (result: RpEditorResult) => void;
|
|
10
|
+
/** Called when editor encounters an error */
|
|
11
|
+
onError?: (error: Error) => void;
|
|
12
|
+
/** Custom class name for the container */
|
|
13
|
+
className?: string;
|
|
14
|
+
/** Custom style for the container */
|
|
15
|
+
style?: React.CSSProperties;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* React component that renders the image editor inline.
|
|
19
|
+
* For modal usage, use the `useRpImageEditor()` hook instead.
|
|
20
|
+
*/
|
|
21
|
+
export declare const RpImageEditorComponent: React.FC<RpImageEditorProps>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rageshpikalmunde/rp-image-editor-react
|
|
3
|
+
* React wrapper for the rp-image-editor plugin
|
|
4
|
+
*/
|
|
5
|
+
export { RpImageEditorComponent } from './RpImageEditor';
|
|
6
|
+
export type { RpImageEditorProps } from './RpImageEditor';
|
|
7
|
+
export { useRpImageEditor } from './useRpImageEditor';
|
|
8
|
+
export type { RpEditorConfig, RpEditorTheme, RpEditorResult, CropAspectRatio, EditorMode, } from '@rageshpikalmunde/rp-image-editor';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { RpEditorConfig, RpEditorResult } from '@rageshpikalmunde/rp-image-editor';
|
|
2
|
+
/**
|
|
3
|
+
* React hook to open the image editor as a modal overlay.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* ```tsx
|
|
7
|
+
* function MyComponent() {
|
|
8
|
+
* const { openEditor } = useRpImageEditor();
|
|
9
|
+
*
|
|
10
|
+
* const handleEdit = async (file: File) => {
|
|
11
|
+
* const result = await openEditor(file, {
|
|
12
|
+
* theme: { applyButtonBackground: '#28a745' }
|
|
13
|
+
* });
|
|
14
|
+
* if (result) {
|
|
15
|
+
* console.log(result.file); // upload
|
|
16
|
+
* }
|
|
17
|
+
* };
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function useRpImageEditor(): {
|
|
22
|
+
openEditor: (image: File | Blob | string, config?: Partial<RpEditorConfig>) => Promise<RpEditorResult | null>;
|
|
23
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rageshpikalmunde/rp-image-editor-react",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "React wrapper for rp-image-editor — use inside Ionic+React apps",
|
|
5
|
+
"main": "dist/cjs/index.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"types": "dist/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/esm/index.js",
|
|
11
|
+
"require": "./dist/cjs/index.js",
|
|
12
|
+
"types": "./dist/types/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "npm run build:esm && npm run build:cjs && npm run build:types",
|
|
20
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
21
|
+
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
22
|
+
"build:types": "tsc -p tsconfig.types.json",
|
|
23
|
+
"clean": "rm -rf dist"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"image-editor",
|
|
27
|
+
"react",
|
|
28
|
+
"ionic",
|
|
29
|
+
"capacitor"
|
|
30
|
+
],
|
|
31
|
+
"author": "Ragesh Pikalmunde",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@rageshpikalmunde/rp-image-editor": "^1.1.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"react": ">=17.0.0",
|
|
41
|
+
"react-dom": ">=17.0.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"react": "^18.2.0",
|
|
45
|
+
"react-dom": "^18.2.0",
|
|
46
|
+
"@types/react": "^18.2.0",
|
|
47
|
+
"typescript": "~5.3.0"
|
|
48
|
+
}
|
|
49
|
+
}
|