@bindu-dashing/dam-solution-v2 5.9.230 → 5.9.232
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/build/MyDrive/PdfEditor/EditPdfModal.d.ts +8 -0
- package/build/MyDrive/PdfEditor/EditPdfModal.js +28 -0
- package/build/MyDrive/PdfEditor/PdfEditor.d.ts +6 -0
- package/build/MyDrive/PdfEditor/PdfEditor.js +201 -0
- package/build/MyDrive/PdfEditor/PdfEditorCanvas.d.ts +39 -0
- package/build/MyDrive/PdfEditor/PdfEditorCanvas.js +631 -0
- package/build/MyDrive/fileDetails/PdfOptions.d.ts +2 -1
- package/build/MyDrive/fileDetails/PdfOptions.js +11 -5
- package/build/MyDrive/fileDetails/PdfViewer.d.ts +2 -1
- package/build/MyDrive/fileDetails/PdfViewer.js +2 -2
- package/build/MyDrive/fileDetails/Previewdetails.js +5 -23
- package/build/style.css +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { FileEntity } from "../../utilities/constants/interface";
|
|
3
|
+
declare const EditPdfModal: ({ open, handleClose, file, }: {
|
|
4
|
+
handleClose: () => void;
|
|
5
|
+
open: boolean;
|
|
6
|
+
file: FileEntity;
|
|
7
|
+
}) => React.ReactPortal | null;
|
|
8
|
+
export default EditPdfModal;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import ReactDOM from "react-dom";
|
|
4
|
+
import PdfEditorComponent from "./PdfEditor";
|
|
5
|
+
const EditPdfModal = ({ open, handleClose, file, }) => {
|
|
6
|
+
const [state, setState] = useState({
|
|
7
|
+
visible: false,
|
|
8
|
+
});
|
|
9
|
+
const { visible } = state;
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (open) {
|
|
12
|
+
setTimeout(() => setState((prevState) => (Object.assign(Object.assign({}, prevState), { visible: true }))), 10);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { visible: false })));
|
|
16
|
+
}
|
|
17
|
+
}, [open]);
|
|
18
|
+
if (!open && !visible)
|
|
19
|
+
return null;
|
|
20
|
+
const modalContent = (_jsx("div", { className: `md-lib-fixed md-lib-inset-0 md-lib-z-[1001] md-lib-w-screen md-lib-h-screen md-lib-bg-white dark:md-lib-bg-darkPrimary md-lib-text-black dark:md-lib-text-white md-lib-overflow-auto md-lib-transform md-lib-transition-all md-lib-duration-300 md-lib-ease-in-out ${open && visible
|
|
21
|
+
? "md-lib-opacity-100 md-lib-translate-y-0"
|
|
22
|
+
: "md-lib-opacity-0 md-lib-translate-y-4"}`, onTransitionEnd: () => {
|
|
23
|
+
if (!open)
|
|
24
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { visible: false })));
|
|
25
|
+
}, children: _jsx(PdfEditorComponent, { file: file, handleClose: handleClose }) }));
|
|
26
|
+
return ReactDOM.createPortal(modalContent, document.body);
|
|
27
|
+
};
|
|
28
|
+
export default EditPdfModal;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
12
|
+
import { Tooltip, Popover } from "antd";
|
|
13
|
+
import { GoArrowLeft } from "react-icons/go";
|
|
14
|
+
import { PiFloppyDisk } from "react-icons/pi";
|
|
15
|
+
import { AiOutlineHighlight, AiOutlineLine, AiOutlineDelete, AiOutlineDrag, } from "react-icons/ai";
|
|
16
|
+
import { BsCursorText, BsPencil, BsSquare, BsCircle, } from "react-icons/bs";
|
|
17
|
+
import { MdOutlineRotateRight, } from "react-icons/md";
|
|
18
|
+
import { RiDeleteBin6Line, } from "react-icons/ri";
|
|
19
|
+
import { useMemo, useRef, useState } from "react";
|
|
20
|
+
import { NotificationStatus, } from "../../utilities/constants/interface";
|
|
21
|
+
import { get } from "lodash";
|
|
22
|
+
import CustomButton from "../../common/Button";
|
|
23
|
+
import { showNotification } from "../../common/notifications";
|
|
24
|
+
import { FILE_UPLOAD_ERROR, SOMETHING_WENT_WRONG, UPDATE_SUCCESS, } from "../../utilities/constants/messages";
|
|
25
|
+
import { SAVE_EDITED_FILE_THUMBNAIL_URL, SAVE_EDITED_FILE_URL, } from "../../utilities/constants/apiUrls";
|
|
26
|
+
import { generateFoldersQueryKey, invalidateData, QueryKeys, } from "../../utilities/constants/queryKeys";
|
|
27
|
+
import { useQueryClient } from "react-query";
|
|
28
|
+
import { useDamConfig } from "../../hocs/DamConfigContext";
|
|
29
|
+
import { createApiClient } from "../../hocs/configureAxios";
|
|
30
|
+
import useAppParams from "../../utilities/useAppParams";
|
|
31
|
+
import PdfEditorCanvas from "./PdfEditorCanvas";
|
|
32
|
+
const GoArrowLeftIcon = GoArrowLeft;
|
|
33
|
+
const PiFloppyDiskIcon = PiFloppyDisk;
|
|
34
|
+
const BsCursorTextIcon = BsCursorText;
|
|
35
|
+
const BsPencilIcon = BsPencil;
|
|
36
|
+
const BsSquareIcon = BsSquare;
|
|
37
|
+
const BsCircleIcon = BsCircle;
|
|
38
|
+
const AiOutlineHighlightIcon = AiOutlineHighlight;
|
|
39
|
+
const AiOutlineLineIcon = AiOutlineLine;
|
|
40
|
+
const AiOutlineDeleteIcon = AiOutlineDelete;
|
|
41
|
+
const MdOutlineRotateRightIcon = MdOutlineRotateRight;
|
|
42
|
+
const RiDeleteBin6LineIcon = RiDeleteBin6Line;
|
|
43
|
+
const AiOutlineDragIcon = AiOutlineDrag;
|
|
44
|
+
const COLORS = [
|
|
45
|
+
"#000000",
|
|
46
|
+
"#FF0000",
|
|
47
|
+
"#0000FF",
|
|
48
|
+
"#00AA00",
|
|
49
|
+
"#FF6600",
|
|
50
|
+
"#9900CC",
|
|
51
|
+
"#FFCC00",
|
|
52
|
+
"#FFFFFF",
|
|
53
|
+
];
|
|
54
|
+
const PdfEditorComponent = ({ file, handleClose, }) => {
|
|
55
|
+
const queryClient = useQueryClient();
|
|
56
|
+
const damConfig = useDamConfig();
|
|
57
|
+
const { rootFolderId } = damConfig;
|
|
58
|
+
const api = useMemo(() => createApiClient(damConfig), [damConfig]);
|
|
59
|
+
const { type, folderId } = useAppParams();
|
|
60
|
+
const [state, setState] = useState({
|
|
61
|
+
loading: false,
|
|
62
|
+
});
|
|
63
|
+
const { loading } = state;
|
|
64
|
+
const editorRef = useRef(null);
|
|
65
|
+
const [currentTool, setCurrentTool] = useState("select");
|
|
66
|
+
const [color, setColor] = useState("#FF0000");
|
|
67
|
+
const [fontSize, setFontSize] = useState(20);
|
|
68
|
+
const [lineWidth, setLineWidth] = useState(3);
|
|
69
|
+
const [totalPages, setTotalPages] = useState(0);
|
|
70
|
+
const [pages, setPages] = useState([]);
|
|
71
|
+
const [pageRotations, setPageRotations] = useState({});
|
|
72
|
+
const handlePagesLoaded = (numPages) => {
|
|
73
|
+
setTotalPages(numPages);
|
|
74
|
+
setPages(Array.from({ length: numPages }, (_, i) => i));
|
|
75
|
+
};
|
|
76
|
+
const handleRotatePage = (pageIndex) => {
|
|
77
|
+
setPageRotations((prev) => (Object.assign(Object.assign({}, prev), { [pageIndex]: ((prev[pageIndex] || 0) + 90) % 360 })));
|
|
78
|
+
};
|
|
79
|
+
const handleDeletePage = (pageIndex) => {
|
|
80
|
+
if (pages.length <= 1) {
|
|
81
|
+
showNotification("Cannot delete the last page", NotificationStatus.ERROR);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
setPages((prev) => prev.filter((p) => p !== pageIndex));
|
|
85
|
+
};
|
|
86
|
+
const handleMovePage = (fromIndex, direction) => {
|
|
87
|
+
setPages((prev) => {
|
|
88
|
+
const idx = prev.indexOf(fromIndex);
|
|
89
|
+
if (idx < 0)
|
|
90
|
+
return prev;
|
|
91
|
+
const newIdx = direction === "up" ? idx - 1 : idx + 1;
|
|
92
|
+
if (newIdx < 0 || newIdx >= prev.length)
|
|
93
|
+
return prev;
|
|
94
|
+
const newPages = [...prev];
|
|
95
|
+
[newPages[idx], newPages[newIdx]] = [newPages[newIdx], newPages[idx]];
|
|
96
|
+
return newPages;
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
const handleSave = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
100
|
+
var _a;
|
|
101
|
+
const editedFile = yield ((_a = editorRef.current) === null || _a === void 0 ? void 0 : _a.getEditedPdfFile());
|
|
102
|
+
if (editedFile) {
|
|
103
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { loading: true })));
|
|
104
|
+
try {
|
|
105
|
+
const response = yield api.put(SAVE_EDITED_FILE_URL, {
|
|
106
|
+
path: get(file, "s3Path"),
|
|
107
|
+
});
|
|
108
|
+
const url = get(response, "data");
|
|
109
|
+
if (url) {
|
|
110
|
+
try {
|
|
111
|
+
const response = yield fetch(url, {
|
|
112
|
+
method: "PUT",
|
|
113
|
+
headers: {
|
|
114
|
+
"Content-Type": "application/pdf",
|
|
115
|
+
},
|
|
116
|
+
body: editedFile,
|
|
117
|
+
});
|
|
118
|
+
if (response.ok) {
|
|
119
|
+
try {
|
|
120
|
+
yield api.put(SAVE_EDITED_FILE_THUMBNAIL_URL.replace(":fileId", get(file, "_id")), {});
|
|
121
|
+
invalidateData(queryClient, generateFoldersQueryKey(type), folderId ? folderId : rootFolderId);
|
|
122
|
+
invalidateData(queryClient, QueryKeys.FILE, get(file, "_id"));
|
|
123
|
+
showNotification(UPDATE_SUCCESS, NotificationStatus.SUCCESS);
|
|
124
|
+
handleClose();
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
showNotification(get(error, "message", FILE_UPLOAD_ERROR), NotificationStatus.ERROR);
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { loading: false })));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
showNotification(FILE_UPLOAD_ERROR, NotificationStatus.ERROR);
|
|
135
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { loading: false })));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
showNotification(get(error, "message", FILE_UPLOAD_ERROR), NotificationStatus.ERROR);
|
|
140
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { loading: false })));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
showNotification(FILE_UPLOAD_ERROR, NotificationStatus.ERROR);
|
|
145
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { loading: false })));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
showNotification(get(error, "message", SOMETHING_WENT_WRONG), NotificationStatus.ERROR);
|
|
150
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { loading: false })));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
showNotification("Error while saving PDF", NotificationStatus.ERROR);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
const toolButtons = [
|
|
158
|
+
{
|
|
159
|
+
tool: "select",
|
|
160
|
+
icon: _jsx(AiOutlineDragIcon, { size: 18 }),
|
|
161
|
+
label: "Select",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
tool: "text",
|
|
165
|
+
icon: _jsx(BsCursorTextIcon, { size: 18 }),
|
|
166
|
+
label: "Add Text",
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
tool: "freehand",
|
|
170
|
+
icon: _jsx(BsPencilIcon, { size: 18 }),
|
|
171
|
+
label: "Draw",
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
tool: "rectangle",
|
|
175
|
+
icon: _jsx(BsSquareIcon, { size: 18 }),
|
|
176
|
+
label: "Rectangle",
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
tool: "circle",
|
|
180
|
+
icon: _jsx(BsCircleIcon, { size: 18 }),
|
|
181
|
+
label: "Circle",
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
tool: "line",
|
|
185
|
+
icon: _jsx(AiOutlineLineIcon, { size: 18 }),
|
|
186
|
+
label: "Line",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
tool: "highlight",
|
|
190
|
+
icon: _jsx(AiOutlineHighlightIcon, { size: 18 }),
|
|
191
|
+
label: "Highlight",
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
const colorPicker = (_jsxs("div", { className: "md-lib-flex md-lib-flex-wrap md-lib-gap-2 md-lib-p-2 md-lib-max-w-[160px]", children: [COLORS.map((c) => (_jsx("button", { className: `md-lib-w-7 md-lib-h-7 md-lib-rounded-full md-lib-border-2 ${color === c
|
|
195
|
+
? "md-lib-border-white md-lib-ring-2 md-lib-ring-blue-400"
|
|
196
|
+
: "md-lib-border-gray-600"}`, style: { backgroundColor: c }, onClick: () => setColor(c) }, c))), _jsx("div", { className: "md-lib-w-full md-lib-mt-1", children: _jsx("input", { type: "color", value: color, onChange: (e) => setColor(e.target.value), className: "md-lib-w-full md-lib-h-8 md-lib-cursor-pointer" }) })] }));
|
|
197
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "md-lib-bg-darkPrimaryBg md-lib-py-3 md-lib-px-5 md-lib-flex md-lib-justify-between md-lib-items-center", children: [_jsxs("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-5", children: [_jsx(GoArrowLeftIcon, { className: "md-lib-text-darkTextColor md-lib-cursor-pointer", size: 24, onClick: handleClose }), _jsx("h4", { className: "md-lib-font-semibold md-lib-text-darkTextColor md-lib-text-base md-lib-truncate md-lib-w-96", title: get(file, "name", "N/A"), children: get(file, "name", "N/A") })] }), _jsxs("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-4", children: [_jsx(CustomButton, { size: "large", onClick: handleClose, label: "Cancel", type: "default", className: "md-lib-bg-secondaryColor md-lib-hover:bg-secondaryHoverColor md-lib-border-none" }), _jsx(CustomButton, { size: "large", type: "primary", icon: _jsx(PiFloppyDiskIcon, { size: 24 }), onClick: handleSave, label: "Save", loading: loading })] })] }), _jsxs("div", { className: "md-lib-bg-[#3a3a3a] md-lib-px-4 md-lib-py-2 md-lib-flex md-lib-items-center md-lib-gap-1 md-lib-flex-wrap md-lib-border-b md-lib-border-gray-600", children: [_jsx("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-1", children: toolButtons.map(({ tool, icon, label }) => (_jsx(Tooltip, { title: label, placement: "bottom", children: _jsx("button", { className: `md-lib-p-2 md-lib-rounded md-lib-text-white md-lib-transition-colors ${currentTool === tool
|
|
198
|
+
? "md-lib-bg-blue-600"
|
|
199
|
+
: "hover:md-lib-bg-gray-600"}`, onClick: () => setCurrentTool(tool), children: icon }) }, tool))) }), _jsx("div", { className: "md-lib-w-px md-lib-h-6 md-lib-bg-gray-500 md-lib-mx-2" }), _jsx(Popover, { content: colorPicker, trigger: "click", placement: "bottom", children: _jsx(Tooltip, { title: "Color", placement: "bottom", children: _jsx("button", { className: "md-lib-p-2 md-lib-rounded hover:md-lib-bg-gray-600 md-lib-flex md-lib-items-center md-lib-gap-1", children: _jsx("div", { className: "md-lib-w-5 md-lib-h-5 md-lib-rounded-full md-lib-border md-lib-border-gray-400", style: { backgroundColor: color } }) }) }) }), _jsxs("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-1 md-lib-text-white md-lib-text-xs", children: [_jsx("span", { children: "Size:" }), _jsx("select", { value: fontSize, onChange: (e) => setFontSize(Number(e.target.value)), className: "md-lib-bg-gray-700 md-lib-text-white md-lib-rounded md-lib-px-1 md-lib-py-0.5 md-lib-text-xs md-lib-border-none", children: [12, 16, 20, 24, 28, 32, 40, 48].map((s) => (_jsxs("option", { value: s, children: [s, "px"] }, s))) })] }), _jsxs("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-1 md-lib-text-white md-lib-text-xs", children: [_jsx("span", { children: "Width:" }), _jsx("select", { value: lineWidth, onChange: (e) => setLineWidth(Number(e.target.value)), className: "md-lib-bg-gray-700 md-lib-text-white md-lib-rounded md-lib-px-1 md-lib-py-0.5 md-lib-text-xs md-lib-border-none", children: [1, 2, 3, 4, 5, 8, 10].map((w) => (_jsxs("option", { value: w, children: [w, "px"] }, w))) })] }), _jsx("div", { className: "md-lib-w-px md-lib-h-6 md-lib-bg-gray-500 md-lib-mx-2" }), _jsx(Tooltip, { title: "Delete Selected", placement: "bottom", children: _jsx("button", { className: "md-lib-p-2 md-lib-rounded md-lib-text-white hover:md-lib-bg-red-700 md-lib-transition-colors", onClick: () => { var _a; return (_a = editorRef.current) === null || _a === void 0 ? void 0 : _a.deleteSelectedAnnotation(); }, children: _jsx(AiOutlineDeleteIcon, { size: 18 }) }) }), _jsx("div", { className: "md-lib-w-px md-lib-h-6 md-lib-bg-gray-500 md-lib-mx-2" }), _jsx("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-1", children: _jsx(Popover, { trigger: "click", placement: "bottom", content: _jsxs("div", { className: "md-lib-max-h-[300px] md-lib-overflow-auto", children: [_jsx("p", { className: "md-lib-font-semibold md-lib-mb-2 md-lib-text-sm", children: "Page Operations" }), pages.map((pageIndex, idx) => (_jsxs("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-2 md-lib-py-1 md-lib-border-b md-lib-border-gray-200 last:md-lib-border-0", children: [_jsxs("span", { className: "md-lib-text-sm md-lib-min-w-[60px]", children: ["Page ", pageIndex + 1] }), _jsx(Tooltip, { title: "Move Up", children: _jsx("button", { className: "md-lib-p-1 md-lib-rounded hover:md-lib-bg-gray-100 md-lib-text-xs", onClick: () => handleMovePage(pageIndex, "up"), disabled: idx === 0, children: "\u2191" }) }), _jsx(Tooltip, { title: "Move Down", children: _jsx("button", { className: "md-lib-p-1 md-lib-rounded hover:md-lib-bg-gray-100 md-lib-text-xs", onClick: () => handleMovePage(pageIndex, "down"), disabled: idx === pages.length - 1, children: "\u2193" }) }), _jsx(Tooltip, { title: "Rotate 90\u00B0", children: _jsx("button", { className: "md-lib-p-1 md-lib-rounded hover:md-lib-bg-gray-100", onClick: () => handleRotatePage(pageIndex), children: _jsx(MdOutlineRotateRightIcon, { size: 16 }) }) }), _jsx(Tooltip, { title: "Delete Page", children: _jsx("button", { className: "md-lib-p-1 md-lib-rounded hover:md-lib-bg-red-100 md-lib-text-red-500", onClick: () => handleDeletePage(pageIndex), disabled: pages.length <= 1, children: _jsx(RiDeleteBin6LineIcon, { size: 16 }) }) })] }, pageIndex)))] }), children: _jsx(Tooltip, { title: "Page Operations", placement: "bottom", children: _jsxs("button", { className: "md-lib-p-2 md-lib-rounded md-lib-text-white hover:md-lib-bg-gray-600 md-lib-flex md-lib-items-center md-lib-gap-1 md-lib-text-xs", children: ["Pages (", pages.length, "/", totalPages, ")"] }) }) }) })] }), _jsx(PdfEditorCanvas, { ref: editorRef, fileUrl: get(file, "s3Url") || get(file, "downloadUrl", ""), s3Path: get(file, "s3Path", ""), currentTool: currentTool, color: color, fontSize: fontSize, lineWidth: lineWidth, pages: pages, pageRotations: pageRotations, onPagesLoaded: handlePagesLoaded })] }));
|
|
200
|
+
};
|
|
201
|
+
export default PdfEditorComponent;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type AnnotationType = "text" | "freehand" | "rectangle" | "circle" | "highlight" | "line";
|
|
3
|
+
export type Tool = "select" | "text" | "freehand" | "rectangle" | "circle" | "highlight" | "line";
|
|
4
|
+
export interface Annotation {
|
|
5
|
+
id: string;
|
|
6
|
+
type: AnnotationType;
|
|
7
|
+
pageIndex: number;
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
width?: number;
|
|
11
|
+
height?: number;
|
|
12
|
+
text?: string;
|
|
13
|
+
points?: {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
}[];
|
|
17
|
+
color: string;
|
|
18
|
+
fontSize?: number;
|
|
19
|
+
lineWidth?: number;
|
|
20
|
+
opacity?: number;
|
|
21
|
+
}
|
|
22
|
+
interface PdfEditorCanvasProps {
|
|
23
|
+
fileUrl: string;
|
|
24
|
+
s3Path: string;
|
|
25
|
+
currentTool: Tool;
|
|
26
|
+
color: string;
|
|
27
|
+
fontSize: number;
|
|
28
|
+
lineWidth: number;
|
|
29
|
+
pages: number[];
|
|
30
|
+
pageRotations: Record<number, number>;
|
|
31
|
+
onPagesLoaded: (totalPages: number) => void;
|
|
32
|
+
}
|
|
33
|
+
export interface PdfEditorCanvasRef {
|
|
34
|
+
getEditedPdfFile: () => Promise<File | null>;
|
|
35
|
+
getAnnotations: () => Annotation[];
|
|
36
|
+
deleteSelectedAnnotation: () => void;
|
|
37
|
+
}
|
|
38
|
+
declare const PdfEditorCanvas: React.ForwardRefExoticComponent<PdfEditorCanvasProps & React.RefAttributes<PdfEditorCanvasRef>>;
|
|
39
|
+
export default PdfEditorCanvas;
|
|
@@ -0,0 +1,631 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { useEffect, useRef, useState, useCallback, forwardRef, useImperativeHandle, } from "react";
|
|
12
|
+
import * as pdfjsLib from "pdfjs-dist";
|
|
13
|
+
import { PDFDocument, rgb, StandardFonts, degrees } from "pdf-lib";
|
|
14
|
+
import { get } from "lodash";
|
|
15
|
+
import { useDamConfig } from "../../hocs/DamConfigContext";
|
|
16
|
+
import { useMemo } from "react";
|
|
17
|
+
import { createApiClient } from "../../hocs/configureAxios";
|
|
18
|
+
import { GET_BASE64_USING_PATH_URL } from "../../utilities/constants/apiUrls";
|
|
19
|
+
pdfjsLib.GlobalWorkerOptions.workerSrc = `https://unpkg.com/pdfjs-dist@3.11.174/build/pdf.worker.min.js`;
|
|
20
|
+
const PdfEditorCanvas = forwardRef(({ fileUrl, s3Path, currentTool, color, fontSize, lineWidth, pages, pageRotations, onPagesLoaded, }, ref) => {
|
|
21
|
+
const containerRef = useRef(null);
|
|
22
|
+
const canvasRefs = useRef(new Map());
|
|
23
|
+
const overlayRefs = useRef(new Map());
|
|
24
|
+
const [annotations, setAnnotations] = useState([]);
|
|
25
|
+
const [selectedAnnotation, setSelectedAnnotation] = useState(null);
|
|
26
|
+
const [isDrawing, setIsDrawing] = useState(false);
|
|
27
|
+
const [currentAnnotation, setCurrentAnnotation] = useState(null);
|
|
28
|
+
const [pdfBytes, setPdfBytes] = useState(null);
|
|
29
|
+
const [pdfDoc, setPdfDoc] = useState(null);
|
|
30
|
+
const [editingTextId, setEditingTextId] = useState(null);
|
|
31
|
+
const [pageScales, setPageScales] = useState(new Map());
|
|
32
|
+
const damConfig = useDamConfig();
|
|
33
|
+
const api = useMemo(() => createApiClient(damConfig), [damConfig]);
|
|
34
|
+
// Load PDF bytes
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
const loadPdf = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
|
+
try {
|
|
38
|
+
// Try fetching via API base64 first (same as image editor)
|
|
39
|
+
if (s3Path) {
|
|
40
|
+
const response = yield api.get(`${GET_BASE64_USING_PATH_URL}?key=${s3Path}`);
|
|
41
|
+
const base64 = get(response, "base64", "");
|
|
42
|
+
if (base64) {
|
|
43
|
+
const binaryString = atob(base64);
|
|
44
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
45
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
46
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
47
|
+
}
|
|
48
|
+
setPdfBytes(bytes);
|
|
49
|
+
const doc = yield pdfjsLib.getDocument({ data: bytes }).promise;
|
|
50
|
+
setPdfDoc(doc);
|
|
51
|
+
onPagesLoaded(doc.numPages);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Fallback: fetch from URL
|
|
56
|
+
const response = yield fetch(fileUrl);
|
|
57
|
+
const arrayBuffer = yield response.arrayBuffer();
|
|
58
|
+
const bytes = new Uint8Array(arrayBuffer);
|
|
59
|
+
setPdfBytes(bytes);
|
|
60
|
+
const doc = yield pdfjsLib.getDocument({ data: bytes }).promise;
|
|
61
|
+
setPdfDoc(doc);
|
|
62
|
+
onPagesLoaded(doc.numPages);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.error("Error loading PDF:", err);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
loadPdf();
|
|
69
|
+
}, [fileUrl, s3Path]);
|
|
70
|
+
// Render PDF pages
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (!pdfDoc)
|
|
73
|
+
return;
|
|
74
|
+
const renderPages = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
75
|
+
for (const pageIndex of pages) {
|
|
76
|
+
const pageNum = pageIndex + 1;
|
|
77
|
+
if (pageNum > pdfDoc.numPages)
|
|
78
|
+
continue;
|
|
79
|
+
const page = yield pdfDoc.getPage(pageNum);
|
|
80
|
+
const rotation = pageRotations[pageIndex] || 0;
|
|
81
|
+
const viewport = page.getViewport({ scale: 1.5, rotation });
|
|
82
|
+
const canvas = canvasRefs.current.get(pageIndex);
|
|
83
|
+
if (!canvas)
|
|
84
|
+
continue;
|
|
85
|
+
canvas.width = viewport.width;
|
|
86
|
+
canvas.height = viewport.height;
|
|
87
|
+
const ctx = canvas.getContext("2d");
|
|
88
|
+
if (!ctx)
|
|
89
|
+
continue;
|
|
90
|
+
// Store scale for coordinate conversion
|
|
91
|
+
setPageScales((prev) => {
|
|
92
|
+
const newMap = new Map(prev);
|
|
93
|
+
newMap.set(pageIndex, 1.5);
|
|
94
|
+
return newMap;
|
|
95
|
+
});
|
|
96
|
+
yield page.render({
|
|
97
|
+
canvasContext: ctx,
|
|
98
|
+
viewport,
|
|
99
|
+
}).promise;
|
|
100
|
+
// Size overlay canvas to match
|
|
101
|
+
const overlay = overlayRefs.current.get(pageIndex);
|
|
102
|
+
if (overlay) {
|
|
103
|
+
overlay.width = viewport.width;
|
|
104
|
+
overlay.height = viewport.height;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
renderPages();
|
|
109
|
+
}, [pdfDoc, pages, pageRotations]);
|
|
110
|
+
// Redraw annotations overlay
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
for (const pageIndex of pages) {
|
|
113
|
+
const overlay = overlayRefs.current.get(pageIndex);
|
|
114
|
+
if (!overlay)
|
|
115
|
+
continue;
|
|
116
|
+
const ctx = overlay.getContext("2d");
|
|
117
|
+
if (!ctx)
|
|
118
|
+
continue;
|
|
119
|
+
ctx.clearRect(0, 0, overlay.width, overlay.height);
|
|
120
|
+
const pageAnnotations = annotations.filter((a) => a.pageIndex === pageIndex);
|
|
121
|
+
for (const ann of pageAnnotations) {
|
|
122
|
+
const isSelected = ann.id === selectedAnnotation;
|
|
123
|
+
drawAnnotation(ctx, ann, isSelected);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}, [annotations, selectedAnnotation, pages]);
|
|
127
|
+
const drawAnnotation = (ctx, ann, isSelected) => {
|
|
128
|
+
ctx.save();
|
|
129
|
+
if (isSelected) {
|
|
130
|
+
ctx.strokeStyle = "#2196F3";
|
|
131
|
+
ctx.lineWidth = 2;
|
|
132
|
+
ctx.setLineDash([5, 3]);
|
|
133
|
+
const padding = 4;
|
|
134
|
+
if (ann.type === "text") {
|
|
135
|
+
ctx.font = `${ann.fontSize || 16}px Helvetica`;
|
|
136
|
+
const metrics = ctx.measureText(ann.text || "");
|
|
137
|
+
ctx.strokeRect(ann.x - padding, ann.y - (ann.fontSize || 16) - padding, metrics.width + padding * 2, (ann.fontSize || 16) + padding * 2);
|
|
138
|
+
}
|
|
139
|
+
else if (ann.type === "rectangle" || ann.type === "highlight") {
|
|
140
|
+
ctx.strokeRect(ann.x - padding, ann.y - padding, (ann.width || 0) + padding * 2, (ann.height || 0) + padding * 2);
|
|
141
|
+
}
|
|
142
|
+
else if (ann.type === "circle") {
|
|
143
|
+
const cx = ann.x + (ann.width || 0) / 2;
|
|
144
|
+
const cy = ann.y + (ann.height || 0) / 2;
|
|
145
|
+
const rx = Math.abs(ann.width || 0) / 2 + padding;
|
|
146
|
+
const ry = Math.abs(ann.height || 0) / 2 + padding;
|
|
147
|
+
ctx.beginPath();
|
|
148
|
+
ctx.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2);
|
|
149
|
+
ctx.stroke();
|
|
150
|
+
}
|
|
151
|
+
ctx.setLineDash([]);
|
|
152
|
+
}
|
|
153
|
+
switch (ann.type) {
|
|
154
|
+
case "text":
|
|
155
|
+
ctx.font = `${ann.fontSize || 16}px Helvetica`;
|
|
156
|
+
ctx.fillStyle = ann.color;
|
|
157
|
+
ctx.fillText(ann.text || "", ann.x, ann.y);
|
|
158
|
+
break;
|
|
159
|
+
case "freehand":
|
|
160
|
+
if (ann.points && ann.points.length > 1) {
|
|
161
|
+
ctx.strokeStyle = ann.color;
|
|
162
|
+
ctx.lineWidth = ann.lineWidth || 2;
|
|
163
|
+
ctx.lineCap = "round";
|
|
164
|
+
ctx.lineJoin = "round";
|
|
165
|
+
ctx.beginPath();
|
|
166
|
+
ctx.moveTo(ann.points[0].x, ann.points[0].y);
|
|
167
|
+
for (let i = 1; i < ann.points.length; i++) {
|
|
168
|
+
ctx.lineTo(ann.points[i].x, ann.points[i].y);
|
|
169
|
+
}
|
|
170
|
+
ctx.stroke();
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
case "rectangle":
|
|
174
|
+
ctx.strokeStyle = ann.color;
|
|
175
|
+
ctx.lineWidth = ann.lineWidth || 2;
|
|
176
|
+
ctx.strokeRect(ann.x, ann.y, ann.width || 0, ann.height || 0);
|
|
177
|
+
break;
|
|
178
|
+
case "circle":
|
|
179
|
+
ctx.strokeStyle = ann.color;
|
|
180
|
+
ctx.lineWidth = ann.lineWidth || 2;
|
|
181
|
+
ctx.beginPath();
|
|
182
|
+
const cx = ann.x + (ann.width || 0) / 2;
|
|
183
|
+
const cy = ann.y + (ann.height || 0) / 2;
|
|
184
|
+
const rx = Math.abs(ann.width || 0) / 2;
|
|
185
|
+
const ry = Math.abs(ann.height || 0) / 2;
|
|
186
|
+
ctx.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2);
|
|
187
|
+
ctx.stroke();
|
|
188
|
+
break;
|
|
189
|
+
case "highlight":
|
|
190
|
+
ctx.fillStyle = ann.color;
|
|
191
|
+
ctx.globalAlpha = ann.opacity || 0.3;
|
|
192
|
+
ctx.fillRect(ann.x, ann.y, ann.width || 0, ann.height || 0);
|
|
193
|
+
ctx.globalAlpha = 1;
|
|
194
|
+
break;
|
|
195
|
+
case "line":
|
|
196
|
+
ctx.strokeStyle = ann.color;
|
|
197
|
+
ctx.lineWidth = ann.lineWidth || 2;
|
|
198
|
+
ctx.beginPath();
|
|
199
|
+
ctx.moveTo(ann.x, ann.y);
|
|
200
|
+
ctx.lineTo(ann.x + (ann.width || 0), ann.y + (ann.height || 0));
|
|
201
|
+
ctx.stroke();
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
ctx.restore();
|
|
205
|
+
};
|
|
206
|
+
const getCanvasCoords = (e, canvas) => {
|
|
207
|
+
const rect = canvas.getBoundingClientRect();
|
|
208
|
+
const scaleX = canvas.width / rect.width;
|
|
209
|
+
const scaleY = canvas.height / rect.height;
|
|
210
|
+
return {
|
|
211
|
+
x: (e.clientX - rect.left) * scaleX,
|
|
212
|
+
y: (e.clientY - rect.top) * scaleY,
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
const handleMouseDown = useCallback((e, pageIndex) => {
|
|
216
|
+
const overlay = overlayRefs.current.get(pageIndex);
|
|
217
|
+
if (!overlay)
|
|
218
|
+
return;
|
|
219
|
+
const coords = getCanvasCoords(e, overlay);
|
|
220
|
+
if (currentTool === "select") {
|
|
221
|
+
// Check if clicked on an annotation
|
|
222
|
+
const clicked = findAnnotationAt(coords.x, coords.y, pageIndex);
|
|
223
|
+
setSelectedAnnotation((clicked === null || clicked === void 0 ? void 0 : clicked.id) || null);
|
|
224
|
+
setEditingTextId(null);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (currentTool === "text") {
|
|
228
|
+
const id = `ann-${Date.now()}`;
|
|
229
|
+
const newAnn = {
|
|
230
|
+
id,
|
|
231
|
+
type: "text",
|
|
232
|
+
pageIndex,
|
|
233
|
+
x: coords.x,
|
|
234
|
+
y: coords.y,
|
|
235
|
+
text: "",
|
|
236
|
+
color,
|
|
237
|
+
fontSize,
|
|
238
|
+
};
|
|
239
|
+
setAnnotations((prev) => [...prev, newAnn]);
|
|
240
|
+
setEditingTextId(id);
|
|
241
|
+
setSelectedAnnotation(id);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
setIsDrawing(true);
|
|
245
|
+
const id = `ann-${Date.now()}`;
|
|
246
|
+
const newAnn = Object.assign({ id, type: currentTool, pageIndex, x: coords.x, y: coords.y, color,
|
|
247
|
+
lineWidth,
|
|
248
|
+
fontSize, opacity: currentTool === "highlight" ? 0.3 : 1 }, (currentTool === "freehand"
|
|
249
|
+
? { points: [{ x: coords.x, y: coords.y }] }
|
|
250
|
+
: { width: 0, height: 0 }));
|
|
251
|
+
setCurrentAnnotation(newAnn);
|
|
252
|
+
}, [currentTool, color, fontSize, lineWidth]);
|
|
253
|
+
const handleMouseMove = useCallback((e, pageIndex) => {
|
|
254
|
+
if (!isDrawing || !currentAnnotation)
|
|
255
|
+
return;
|
|
256
|
+
const overlay = overlayRefs.current.get(pageIndex);
|
|
257
|
+
if (!overlay)
|
|
258
|
+
return;
|
|
259
|
+
const coords = getCanvasCoords(e, overlay);
|
|
260
|
+
if (currentAnnotation.type === "freehand") {
|
|
261
|
+
setCurrentAnnotation((prev) => {
|
|
262
|
+
if (!prev)
|
|
263
|
+
return prev;
|
|
264
|
+
return Object.assign(Object.assign({}, prev), { points: [...(prev.points || []), { x: coords.x, y: coords.y }] });
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
setCurrentAnnotation((prev) => {
|
|
269
|
+
if (!prev)
|
|
270
|
+
return prev;
|
|
271
|
+
return Object.assign(Object.assign({}, prev), { width: coords.x - prev.x, height: coords.y - prev.y });
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}, [isDrawing, currentAnnotation]);
|
|
275
|
+
const handleMouseUp = useCallback(() => {
|
|
276
|
+
var _a;
|
|
277
|
+
if (!isDrawing || !currentAnnotation)
|
|
278
|
+
return;
|
|
279
|
+
setIsDrawing(false);
|
|
280
|
+
// Only add if it has meaningful size
|
|
281
|
+
const hasSize = currentAnnotation.type === "freehand"
|
|
282
|
+
? (((_a = currentAnnotation.points) === null || _a === void 0 ? void 0 : _a.length) || 0) > 2
|
|
283
|
+
: Math.abs(currentAnnotation.width || 0) > 5 ||
|
|
284
|
+
Math.abs(currentAnnotation.height || 0) > 5;
|
|
285
|
+
if (hasSize) {
|
|
286
|
+
setAnnotations((prev) => [...prev, currentAnnotation]);
|
|
287
|
+
setSelectedAnnotation(currentAnnotation.id);
|
|
288
|
+
}
|
|
289
|
+
setCurrentAnnotation(null);
|
|
290
|
+
}, [isDrawing, currentAnnotation]);
|
|
291
|
+
// Draw current annotation in progress
|
|
292
|
+
useEffect(() => {
|
|
293
|
+
if (!currentAnnotation)
|
|
294
|
+
return;
|
|
295
|
+
const overlay = overlayRefs.current.get(currentAnnotation.pageIndex);
|
|
296
|
+
if (!overlay)
|
|
297
|
+
return;
|
|
298
|
+
const ctx = overlay.getContext("2d");
|
|
299
|
+
if (!ctx)
|
|
300
|
+
return;
|
|
301
|
+
// Redraw all annotations + current
|
|
302
|
+
ctx.clearRect(0, 0, overlay.width, overlay.height);
|
|
303
|
+
const pageAnnotations = annotations.filter((a) => a.pageIndex === currentAnnotation.pageIndex);
|
|
304
|
+
for (const ann of pageAnnotations) {
|
|
305
|
+
drawAnnotation(ctx, ann, false);
|
|
306
|
+
}
|
|
307
|
+
drawAnnotation(ctx, currentAnnotation, false);
|
|
308
|
+
}, [currentAnnotation]);
|
|
309
|
+
const findAnnotationAt = (x, y, pageIndex) => {
|
|
310
|
+
var _a;
|
|
311
|
+
const pageAnnotations = annotations.filter((a) => a.pageIndex === pageIndex);
|
|
312
|
+
for (let i = pageAnnotations.length - 1; i >= 0; i--) {
|
|
313
|
+
const ann = pageAnnotations[i];
|
|
314
|
+
const hitPadding = 10;
|
|
315
|
+
switch (ann.type) {
|
|
316
|
+
case "text": {
|
|
317
|
+
const approxWidth = (((_a = ann.text) === null || _a === void 0 ? void 0 : _a.length) || 0) * (ann.fontSize || 16) * 0.6;
|
|
318
|
+
if (x >= ann.x - hitPadding &&
|
|
319
|
+
x <= ann.x + approxWidth + hitPadding &&
|
|
320
|
+
y >= ann.y - (ann.fontSize || 16) - hitPadding &&
|
|
321
|
+
y <= ann.y + hitPadding) {
|
|
322
|
+
return ann;
|
|
323
|
+
}
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case "freehand": {
|
|
327
|
+
if (ann.points) {
|
|
328
|
+
for (const p of ann.points) {
|
|
329
|
+
if (Math.abs(p.x - x) < hitPadding &&
|
|
330
|
+
Math.abs(p.y - y) < hitPadding) {
|
|
331
|
+
return ann;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
default: {
|
|
338
|
+
const minX = Math.min(ann.x, ann.x + (ann.width || 0));
|
|
339
|
+
const maxX = Math.max(ann.x, ann.x + (ann.width || 0));
|
|
340
|
+
const minY = Math.min(ann.y, ann.y + (ann.height || 0));
|
|
341
|
+
const maxY = Math.max(ann.y, ann.y + (ann.height || 0));
|
|
342
|
+
if (x >= minX - hitPadding &&
|
|
343
|
+
x <= maxX + hitPadding &&
|
|
344
|
+
y >= minY - hitPadding &&
|
|
345
|
+
y <= maxY + hitPadding) {
|
|
346
|
+
return ann;
|
|
347
|
+
}
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return null;
|
|
353
|
+
};
|
|
354
|
+
const handleTextChange = (id, text) => {
|
|
355
|
+
setAnnotations((prev) => prev.map((a) => (a.id === id ? Object.assign(Object.assign({}, a), { text }) : a)));
|
|
356
|
+
};
|
|
357
|
+
const deleteSelectedAnnotation = useCallback(() => {
|
|
358
|
+
if (selectedAnnotation) {
|
|
359
|
+
setAnnotations((prev) => prev.filter((a) => a.id !== selectedAnnotation));
|
|
360
|
+
setSelectedAnnotation(null);
|
|
361
|
+
setEditingTextId(null);
|
|
362
|
+
}
|
|
363
|
+
}, [selectedAnnotation]);
|
|
364
|
+
// Build final PDF with annotations baked in
|
|
365
|
+
const getEditedPdfFile = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
366
|
+
if (!pdfBytes)
|
|
367
|
+
return null;
|
|
368
|
+
try {
|
|
369
|
+
const pdfDocLib = yield PDFDocument.load(pdfBytes);
|
|
370
|
+
const helveticaFont = yield pdfDocLib.embedFont(StandardFonts.Helvetica);
|
|
371
|
+
const allPages = pdfDocLib.getPages();
|
|
372
|
+
// Apply page rotations
|
|
373
|
+
for (const [pageIdx, rotation] of Object.entries(pageRotations)) {
|
|
374
|
+
const idx = parseInt(pageIdx);
|
|
375
|
+
if (idx < allPages.length && rotation !== 0) {
|
|
376
|
+
allPages[idx].setRotation(degrees(rotation));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Remove deleted pages (pages not in the pages array)
|
|
380
|
+
const allPageIndices = Array.from({ length: allPages.length }, (_, i) => i);
|
|
381
|
+
const pagesToRemove = allPageIndices
|
|
382
|
+
.filter((i) => !pages.includes(i))
|
|
383
|
+
.sort((a, b) => b - a); // Remove from end to preserve indices
|
|
384
|
+
for (const idx of pagesToRemove) {
|
|
385
|
+
pdfDocLib.removePage(idx);
|
|
386
|
+
}
|
|
387
|
+
// Reorder pages if needed
|
|
388
|
+
// pdf-lib doesn't have a native reorder, so we create a new doc
|
|
389
|
+
if (pages.length > 0 &&
|
|
390
|
+
!pages.every((p, i) => p ===
|
|
391
|
+
allPageIndices.filter((idx) => pages.includes(idx))[i])) {
|
|
392
|
+
const newDoc = yield PDFDocument.create();
|
|
393
|
+
for (const pageIdx of pages) {
|
|
394
|
+
// Find where this page ended up after removals
|
|
395
|
+
const remainingPages = allPageIndices.filter((i) => pages.includes(i));
|
|
396
|
+
const newIdx = remainingPages.indexOf(pageIdx);
|
|
397
|
+
if (newIdx >= 0 && newIdx < pdfDocLib.getPageCount()) {
|
|
398
|
+
const [copiedPage] = yield newDoc.copyPages(pdfDocLib, [newIdx]);
|
|
399
|
+
newDoc.addPage(copiedPage);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
// Apply annotations to the reordered doc
|
|
403
|
+
yield applyAnnotations(newDoc, helveticaFont, pages);
|
|
404
|
+
const editedBytes = yield newDoc.save();
|
|
405
|
+
return new File([editedBytes], "edited.pdf", {
|
|
406
|
+
type: "application/pdf",
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
// Apply annotations to the current doc
|
|
410
|
+
const remainingPages = pdfDocLib.getPages();
|
|
411
|
+
const scale = 1.5; // Must match render scale
|
|
412
|
+
for (const ann of annotations) {
|
|
413
|
+
const pageOrder = pages.indexOf(ann.pageIndex);
|
|
414
|
+
if (pageOrder < 0 || pageOrder >= remainingPages.length)
|
|
415
|
+
continue;
|
|
416
|
+
const page = remainingPages[pageOrder];
|
|
417
|
+
const { width: pageWidth, height: pageHeight } = page.getSize();
|
|
418
|
+
// Convert canvas coordinates to PDF coordinates
|
|
419
|
+
// Canvas y goes down, PDF y goes up
|
|
420
|
+
const pdfX = ann.x / scale;
|
|
421
|
+
const pdfY = pageHeight - ann.y / scale;
|
|
422
|
+
const [r, g, b] = hexToRgb(ann.color);
|
|
423
|
+
switch (ann.type) {
|
|
424
|
+
case "text":
|
|
425
|
+
if (ann.text) {
|
|
426
|
+
page.drawText(ann.text, {
|
|
427
|
+
x: pdfX,
|
|
428
|
+
y: pdfY,
|
|
429
|
+
size: (ann.fontSize || 16) / scale,
|
|
430
|
+
font: helveticaFont,
|
|
431
|
+
color: rgb(r, g, b),
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
break;
|
|
435
|
+
case "freehand":
|
|
436
|
+
if (ann.points && ann.points.length > 1) {
|
|
437
|
+
for (let i = 1; i < ann.points.length; i++) {
|
|
438
|
+
page.drawLine({
|
|
439
|
+
start: {
|
|
440
|
+
x: ann.points[i - 1].x / scale,
|
|
441
|
+
y: pageHeight - ann.points[i - 1].y / scale,
|
|
442
|
+
},
|
|
443
|
+
end: {
|
|
444
|
+
x: ann.points[i].x / scale,
|
|
445
|
+
y: pageHeight - ann.points[i].y / scale,
|
|
446
|
+
},
|
|
447
|
+
thickness: (ann.lineWidth || 2) / scale,
|
|
448
|
+
color: rgb(r, g, b),
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
break;
|
|
453
|
+
case "rectangle":
|
|
454
|
+
page.drawRectangle({
|
|
455
|
+
x: pdfX,
|
|
456
|
+
y: pdfY - Math.abs((ann.height || 0) / scale),
|
|
457
|
+
width: (ann.width || 0) / scale,
|
|
458
|
+
height: Math.abs((ann.height || 0) / scale),
|
|
459
|
+
borderColor: rgb(r, g, b),
|
|
460
|
+
borderWidth: (ann.lineWidth || 2) / scale,
|
|
461
|
+
});
|
|
462
|
+
break;
|
|
463
|
+
case "circle":
|
|
464
|
+
page.drawEllipse({
|
|
465
|
+
x: pdfX + (ann.width || 0) / scale / 2,
|
|
466
|
+
y: pdfY - Math.abs((ann.height || 0) / scale) / 2,
|
|
467
|
+
xScale: Math.abs((ann.width || 0) / scale) / 2,
|
|
468
|
+
yScale: Math.abs((ann.height || 0) / scale) / 2,
|
|
469
|
+
borderColor: rgb(r, g, b),
|
|
470
|
+
borderWidth: (ann.lineWidth || 2) / scale,
|
|
471
|
+
});
|
|
472
|
+
break;
|
|
473
|
+
case "highlight":
|
|
474
|
+
page.drawRectangle({
|
|
475
|
+
x: pdfX,
|
|
476
|
+
y: pdfY - Math.abs((ann.height || 0) / scale),
|
|
477
|
+
width: (ann.width || 0) / scale,
|
|
478
|
+
height: Math.abs((ann.height || 0) / scale),
|
|
479
|
+
color: rgb(r, g, b),
|
|
480
|
+
opacity: ann.opacity || 0.3,
|
|
481
|
+
});
|
|
482
|
+
break;
|
|
483
|
+
case "line":
|
|
484
|
+
page.drawLine({
|
|
485
|
+
start: { x: pdfX, y: pdfY },
|
|
486
|
+
end: {
|
|
487
|
+
x: pdfX + (ann.width || 0) / scale,
|
|
488
|
+
y: pdfY - (ann.height || 0) / scale,
|
|
489
|
+
},
|
|
490
|
+
thickness: (ann.lineWidth || 2) / scale,
|
|
491
|
+
color: rgb(r, g, b),
|
|
492
|
+
});
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
const editedBytes = yield pdfDocLib.save();
|
|
497
|
+
return new File([editedBytes], "edited.pdf", {
|
|
498
|
+
type: "application/pdf",
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
catch (err) {
|
|
502
|
+
console.error("Error generating edited PDF:", err);
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
}), [pdfBytes, annotations, pages, pageRotations]);
|
|
506
|
+
const applyAnnotations = (doc, font, pageOrder) => __awaiter(void 0, void 0, void 0, function* () {
|
|
507
|
+
const docPages = doc.getPages();
|
|
508
|
+
const scale = 1.5;
|
|
509
|
+
for (const ann of annotations) {
|
|
510
|
+
const orderIdx = pageOrder.indexOf(ann.pageIndex);
|
|
511
|
+
if (orderIdx < 0 || orderIdx >= docPages.length)
|
|
512
|
+
continue;
|
|
513
|
+
const page = docPages[orderIdx];
|
|
514
|
+
const { height: pageHeight } = page.getSize();
|
|
515
|
+
const pdfX = ann.x / scale;
|
|
516
|
+
const pdfY = pageHeight - ann.y / scale;
|
|
517
|
+
const [r, g, b] = hexToRgb(ann.color);
|
|
518
|
+
switch (ann.type) {
|
|
519
|
+
case "text":
|
|
520
|
+
if (ann.text) {
|
|
521
|
+
page.drawText(ann.text, {
|
|
522
|
+
x: pdfX,
|
|
523
|
+
y: pdfY,
|
|
524
|
+
size: (ann.fontSize || 16) / scale,
|
|
525
|
+
font,
|
|
526
|
+
color: rgb(r, g, b),
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
break;
|
|
530
|
+
case "freehand":
|
|
531
|
+
if (ann.points && ann.points.length > 1) {
|
|
532
|
+
for (let i = 1; i < ann.points.length; i++) {
|
|
533
|
+
page.drawLine({
|
|
534
|
+
start: {
|
|
535
|
+
x: ann.points[i - 1].x / scale,
|
|
536
|
+
y: pageHeight - ann.points[i - 1].y / scale,
|
|
537
|
+
},
|
|
538
|
+
end: {
|
|
539
|
+
x: ann.points[i].x / scale,
|
|
540
|
+
y: pageHeight - ann.points[i].y / scale,
|
|
541
|
+
},
|
|
542
|
+
thickness: (ann.lineWidth || 2) / scale,
|
|
543
|
+
color: rgb(r, g, b),
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
break;
|
|
548
|
+
case "highlight":
|
|
549
|
+
page.drawRectangle({
|
|
550
|
+
x: pdfX,
|
|
551
|
+
y: pdfY - Math.abs((ann.height || 0) / scale),
|
|
552
|
+
width: (ann.width || 0) / scale,
|
|
553
|
+
height: Math.abs((ann.height || 0) / scale),
|
|
554
|
+
color: rgb(r, g, b),
|
|
555
|
+
opacity: ann.opacity || 0.3,
|
|
556
|
+
});
|
|
557
|
+
break;
|
|
558
|
+
default:
|
|
559
|
+
break;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
useImperativeHandle(ref, () => ({
|
|
564
|
+
getEditedPdfFile,
|
|
565
|
+
getAnnotations: () => annotations,
|
|
566
|
+
deleteSelectedAnnotation,
|
|
567
|
+
}));
|
|
568
|
+
const getCursorStyle = () => {
|
|
569
|
+
switch (currentTool) {
|
|
570
|
+
case "text":
|
|
571
|
+
return "text";
|
|
572
|
+
case "freehand":
|
|
573
|
+
return "crosshair";
|
|
574
|
+
case "select":
|
|
575
|
+
return "default";
|
|
576
|
+
default:
|
|
577
|
+
return "crosshair";
|
|
578
|
+
}
|
|
579
|
+
};
|
|
580
|
+
return (_jsx("div", { ref: containerRef, className: "md-lib-flex md-lib-flex-col md-lib-items-center md-lib-gap-4 md-lib-py-4 md-lib-overflow-auto", style: { height: "calc(100vh - 120px)", background: "#525659" }, children: pages.map((pageIndex) => (_jsxs("div", { className: "md-lib-relative md-lib-shadow-lg", style: { cursor: getCursorStyle() }, children: [_jsx("canvas", { ref: (el) => {
|
|
581
|
+
if (el)
|
|
582
|
+
canvasRefs.current.set(pageIndex, el);
|
|
583
|
+
}, className: "md-lib-block" }), _jsx("canvas", { ref: (el) => {
|
|
584
|
+
if (el)
|
|
585
|
+
overlayRefs.current.set(pageIndex, el);
|
|
586
|
+
}, className: "md-lib-absolute md-lib-top-0 md-lib-left-0", onMouseDown: (e) => handleMouseDown(e, pageIndex), onMouseMove: (e) => handleMouseMove(e, pageIndex), onMouseUp: handleMouseUp, onMouseLeave: handleMouseUp }), annotations
|
|
587
|
+
.filter((a) => a.type === "text" &&
|
|
588
|
+
a.pageIndex === pageIndex &&
|
|
589
|
+
a.id === editingTextId)
|
|
590
|
+
.map((ann) => {
|
|
591
|
+
const overlay = overlayRefs.current.get(pageIndex);
|
|
592
|
+
if (!overlay)
|
|
593
|
+
return null;
|
|
594
|
+
const rect = overlay.getBoundingClientRect();
|
|
595
|
+
const scaleX = rect.width / overlay.width;
|
|
596
|
+
const scaleY = rect.height / overlay.height;
|
|
597
|
+
return (_jsx("input", { type: "text", autoFocus: true, value: ann.text || "", onChange: (e) => handleTextChange(ann.id, e.target.value), onBlur: () => {
|
|
598
|
+
if (!ann.text) {
|
|
599
|
+
setAnnotations((prev) => prev.filter((a) => a.id !== ann.id));
|
|
600
|
+
}
|
|
601
|
+
setEditingTextId(null);
|
|
602
|
+
}, onKeyDown: (e) => {
|
|
603
|
+
if (e.key === "Enter") {
|
|
604
|
+
if (!ann.text) {
|
|
605
|
+
setAnnotations((prev) => prev.filter((a) => a.id !== ann.id));
|
|
606
|
+
}
|
|
607
|
+
setEditingTextId(null);
|
|
608
|
+
}
|
|
609
|
+
}, className: "md-lib-absolute md-lib-border-none md-lib-outline-none md-lib-bg-transparent", style: {
|
|
610
|
+
left: ann.x * scaleX,
|
|
611
|
+
top: (ann.y - (ann.fontSize || 16)) * scaleY,
|
|
612
|
+
fontSize: (ann.fontSize || 16) * scaleY,
|
|
613
|
+
color: ann.color,
|
|
614
|
+
fontFamily: "Helvetica, Arial, sans-serif",
|
|
615
|
+
minWidth: "100px",
|
|
616
|
+
} }, ann.id));
|
|
617
|
+
}), _jsxs("div", { className: "md-lib-text-center md-lib-text-white md-lib-text-xs md-lib-py-1 md-lib-bg-black/30", children: ["Page ", pageIndex + 1] })] }, pageIndex))) }));
|
|
618
|
+
});
|
|
619
|
+
function hexToRgb(hex) {
|
|
620
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
621
|
+
if (result) {
|
|
622
|
+
return [
|
|
623
|
+
parseInt(result[1], 16) / 255,
|
|
624
|
+
parseInt(result[2], 16) / 255,
|
|
625
|
+
parseInt(result[3], 16) / 255,
|
|
626
|
+
];
|
|
627
|
+
}
|
|
628
|
+
return [0, 0, 0];
|
|
629
|
+
}
|
|
630
|
+
PdfEditorCanvas.displayName = "PdfEditorCanvas";
|
|
631
|
+
export default PdfEditorCanvas;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { FileEntity, FolderEntity } from "../../utilities/constants/interface";
|
|
2
|
-
declare const PdfOptions: ({ zoom, setZoom, currentPage, totalPages, file, }: {
|
|
2
|
+
declare const PdfOptions: ({ zoom, setZoom, currentPage, totalPages, file, showFilePreview, }: {
|
|
3
3
|
zoom: number;
|
|
4
4
|
setZoom: (z: number) => void;
|
|
5
5
|
currentPage: number;
|
|
6
6
|
totalPages: number;
|
|
7
7
|
file: FileEntity & FolderEntity;
|
|
8
|
+
showFilePreview?: boolean;
|
|
8
9
|
}) => JSX.Element;
|
|
9
10
|
export default PdfOptions;
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
import { AiOutlineInfoCircle, AiOutlineZoomIn, AiOutlineZoomOut, } from "react-icons/ai";
|
|
3
|
+
import { AiOutlineInfoCircle, AiOutlineZoomIn, AiOutlineZoomOut, AiOutlineEdit, } from "react-icons/ai";
|
|
4
4
|
import { FiChevronDown } from "react-icons/fi";
|
|
5
5
|
import { Dropdown, Popover } from "antd";
|
|
6
6
|
import { FileInfoContent } from "../../common/CustomElements";
|
|
7
7
|
import ManageFile from "./ManageFile";
|
|
8
|
+
import EditPdfModal from "../PdfEditor/EditPdfModal";
|
|
8
9
|
const AiOutlineInfoCircleIcon = AiOutlineInfoCircle;
|
|
9
10
|
const AiOutlineZoomOutIcon = AiOutlineZoomOut;
|
|
10
11
|
const FiChevronDownIcon = FiChevronDown;
|
|
11
12
|
const AiOutlineZoomInIcon = AiOutlineZoomIn;
|
|
13
|
+
const AiOutlineEditIcon = AiOutlineEdit;
|
|
12
14
|
const zoomLevels = [0.1, 0.25, 0.5, 0.75, 1.0];
|
|
13
|
-
const PdfOptions = ({ zoom, setZoom, currentPage, totalPages, file, }) => {
|
|
15
|
+
const PdfOptions = ({ zoom, setZoom, currentPage, totalPages, file, showFilePreview, }) => {
|
|
14
16
|
const [state, setState] = useState({
|
|
15
17
|
showFileAccess: false,
|
|
18
|
+
showEditModal: false,
|
|
16
19
|
});
|
|
17
|
-
const { showFileAccess } = state;
|
|
20
|
+
const { showFileAccess, showEditModal } = state;
|
|
18
21
|
const handleZoomChange = ({ key }) => {
|
|
19
22
|
setZoom(parseFloat(key));
|
|
20
23
|
};
|
|
@@ -25,11 +28,14 @@ const PdfOptions = ({ zoom, setZoom, currentPage, totalPages, file, }) => {
|
|
|
25
28
|
const toggleFileAccess = () => {
|
|
26
29
|
setState((prevState) => (Object.assign(Object.assign({}, prevState), { showFileAccess: !prevState.showFileAccess })));
|
|
27
30
|
};
|
|
31
|
+
const toggleEditModal = () => {
|
|
32
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { showEditModal: !prevState.showEditModal })));
|
|
33
|
+
};
|
|
28
34
|
return (_jsxs("div", { className: "md-lib-fixed md-lib-bottom-10 md-lib-left-1/2 -md-lib-translate-x-1/2 md-lib-bg-white dark:md-lib-bg-darkPrimary md-lib-rounded-xl md-lib-shadow-md md-lib-px-4 md-lib-py-2 md-lib-flex md-lib-items-center md-lib-gap-4 md-lib-border md-lib-border-borderColor dark:md-lib-border-darkBorderColor md-lib-z-50", children: [_jsx(Popover, { content: _jsx(FileInfoContent, { file: file }), title: "File Info", placement: "top", children: _jsx("button", { className: "md-lib-p-2 hover:md-lib-bg-secondaryColor hover:dark:md-lib-bg-darkPrimaryHoverColor md-lib-rounded-lg", onClick: toggleFileAccess, children: _jsx(AiOutlineInfoCircleIcon, { className: "md-lib-text-[20px]" }) }) }), _jsx("p", { className: "md-lib-h-10 md-lib-w-10 md-lib-flex md-lib-items-center md-lib-justify-center md-lib-text-base md-lib-text-secondaryTextColor dark:md-lib-text-darkSecondaryTextColor md-lib-border-borderColor md-lib-border md-lib-rounded-lg", children: currentPage + 1 }), _jsx("p", { className: "md-lib-text-textColor dark:md-lib-text-darkTextColor", children: "/" }), _jsx("p", { className: "md-lib-h-10 md-lib-w-10 md-lib-flex md-lib-items-center md-lib-justify-center md-lib-bg-secondaryColor dark:md-lib-bg-darkPrimaryHoverColor md-lib-rounded-lg", children: totalPages }), _jsx("div", { className: "md-lib-w-[1px] md-lib-h-5 md-lib-bg-borderColor dark:md-lib-bg-darkBorderColor" }), _jsx("button", { className: "md-lib-h-10 md-lib-w-10 md-lib-flex md-lib-items-center md-lib-justify-center hover:md-lib-bg-secondaryColor hover:dark:md-lib-bg-darkPrimaryHoverColor md-lib-rounded-lg", onClick: () => setZoom(Math.max(0.5, zoom - 0.1)), disabled: zoom <= 0.1, children: _jsx(AiOutlineZoomOutIcon, { className: "md-lib-text-[20px]" }) }), _jsx(Dropdown, { menu: {
|
|
29
35
|
items: items,
|
|
30
36
|
onClick: handleZoomChange,
|
|
31
37
|
selectable: true,
|
|
32
38
|
selectedKeys: [`${Math.round(zoom * 100)}%`],
|
|
33
|
-
}, trigger: ["click"], placement: "top", children: _jsxs("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-1 md-lib-px-3 md-lib-py-1 md-lib-bg-secondaryColor dark:md-lib-bg-darkPrimaryHoverColor md-lib-rounded-md md-lib-cursor-pointer md-lib-text-sm md-lib-text-textColor dark:md-lib-text-darkTextColor", children: [`${Math.round(zoom * 100)}%`, _jsx(FiChevronDownIcon, { className: "md-lib-text-[16px]" })] }) }), _jsx("button", { className: "md-lib-h-10 md-lib-w-10 md-lib-flex md-lib-items-center md-lib-justify-center hover:md-lib-bg-secondaryColor hover:dark:md-lib-bg-darkPrimaryHoverColor md-lib-rounded-lg", onClick: () => setZoom(Math.min(1.5, zoom + 0.1)), disabled: zoom >= 1.5, children: _jsx(AiOutlineZoomInIcon, { className: "md-lib-text-[20px]" }) }), showFileAccess && (_jsx(ManageFile, { file: file, onClose: toggleFileAccess, open: showFileAccess }))] }));
|
|
39
|
+
}, trigger: ["click"], placement: "top", children: _jsxs("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-1 md-lib-px-3 md-lib-py-1 md-lib-bg-secondaryColor dark:md-lib-bg-darkPrimaryHoverColor md-lib-rounded-md md-lib-cursor-pointer md-lib-text-sm md-lib-text-textColor dark:md-lib-text-darkTextColor", children: [`${Math.round(zoom * 100)}%`, _jsx(FiChevronDownIcon, { className: "md-lib-text-[16px]" })] }) }), _jsx("button", { className: "md-lib-h-10 md-lib-w-10 md-lib-flex md-lib-items-center md-lib-justify-center hover:md-lib-bg-secondaryColor hover:dark:md-lib-bg-darkPrimaryHoverColor md-lib-rounded-lg", onClick: () => setZoom(Math.min(1.5, zoom + 0.1)), disabled: zoom >= 1.5, children: _jsx(AiOutlineZoomInIcon, { className: "md-lib-text-[20px]" }) }), showFilePreview && (_jsxs(_Fragment, { children: [_jsx("div", { className: "md-lib-w-[1px] md-lib-h-5 md-lib-bg-borderColor dark:md-lib-bg-darkBorderColor" }), _jsx("button", { className: "md-lib-h-10 md-lib-w-10 md-lib-flex md-lib-items-center md-lib-justify-center hover:md-lib-bg-secondaryColor hover:dark:md-lib-bg-darkPrimaryHoverColor md-lib-rounded-lg", onClick: toggleEditModal, title: "Edit PDF", children: _jsx(AiOutlineEditIcon, { className: "md-lib-text-[20px]" }) })] })), showFileAccess && (_jsx(ManageFile, { file: file, onClose: toggleFileAccess, open: showFileAccess })), showEditModal && (_jsx(EditPdfModal, { open: showEditModal, handleClose: toggleEditModal, file: file }))] }));
|
|
34
40
|
};
|
|
35
41
|
export default PdfOptions;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import "@react-pdf-viewer/core/lib/styles/index.css";
|
|
2
2
|
import "@react-pdf-viewer/zoom/lib/styles/index.css";
|
|
3
3
|
import { FileEntity } from "../../utilities/constants/interface";
|
|
4
|
-
declare const PDFViewer: ({ fileUrl, file, }: {
|
|
4
|
+
declare const PDFViewer: ({ fileUrl, file, showFilePreview, }: {
|
|
5
5
|
fileUrl: string;
|
|
6
6
|
file: FileEntity;
|
|
7
|
+
showFilePreview?: boolean;
|
|
7
8
|
}) => JSX.Element;
|
|
8
9
|
export default PDFViewer;
|
|
@@ -5,7 +5,7 @@ import { zoomPlugin } from "@react-pdf-viewer/zoom";
|
|
|
5
5
|
import "@react-pdf-viewer/core/lib/styles/index.css";
|
|
6
6
|
import "@react-pdf-viewer/zoom/lib/styles/index.css";
|
|
7
7
|
import PdfOptions from "./PdfOptions";
|
|
8
|
-
const PDFViewer = ({ fileUrl, file, }) => {
|
|
8
|
+
const PDFViewer = ({ fileUrl, file, showFilePreview, }) => {
|
|
9
9
|
const [currentPage, setCurrentPage] = useState(0);
|
|
10
10
|
const [totalPages, setTotalPages] = useState(0);
|
|
11
11
|
const [zoom, setZoom] = useState(1.0);
|
|
@@ -13,6 +13,6 @@ const PDFViewer = ({ fileUrl, file, }) => {
|
|
|
13
13
|
useEffect(() => {
|
|
14
14
|
zoomPluginInstance.zoomTo(zoom);
|
|
15
15
|
}, [zoom]);
|
|
16
|
-
return (_jsxs("div", { className: "md-lib-relative md-lib-w-full", children: [_jsx(Worker, { workerUrl: `https://unpkg.com/pdfjs-dist@3.11.174/build/pdf.worker.min.js`, children: _jsx("div", { style: { height: "calc(100vh - 80px)" }, children: _jsx(Viewer, { fileUrl: fileUrl, scrollMode: ScrollMode.Vertical, plugins: [zoomPluginInstance], onPageChange: (e) => setCurrentPage(e.currentPage), onDocumentLoad: (e) => setTotalPages(e.doc.numPages), initialPage: currentPage, defaultScale: zoom }) }) }), _jsx(PdfOptions, { zoom: zoom, setZoom: setZoom, currentPage: currentPage, totalPages: totalPages, file: file })] }));
|
|
16
|
+
return (_jsxs("div", { className: "md-lib-relative md-lib-w-full", children: [_jsx(Worker, { workerUrl: `https://unpkg.com/pdfjs-dist@3.11.174/build/pdf.worker.min.js`, children: _jsx("div", { style: { height: "calc(100vh - 80px)" }, children: _jsx(Viewer, { fileUrl: fileUrl, scrollMode: ScrollMode.Vertical, plugins: [zoomPluginInstance], onPageChange: (e) => setCurrentPage(e.currentPage), onDocumentLoad: (e) => setTotalPages(e.doc.numPages), initialPage: currentPage, defaultScale: zoom }) }) }), _jsx(PdfOptions, { zoom: zoom, setZoom: setZoom, currentPage: currentPage, totalPages: totalPages, file: file, showFilePreview: showFilePreview })] }));
|
|
17
17
|
};
|
|
18
18
|
export default PDFViewer;
|
|
@@ -3,9 +3,9 @@ import { Button } from "antd";
|
|
|
3
3
|
import { GoArrowLeft, GoArrowRight } from "react-icons/go";
|
|
4
4
|
import { get, startsWith } from "lodash";
|
|
5
5
|
import ImageViewer from "./ImageViewer";
|
|
6
|
-
import { useMemo } from "react";
|
|
6
|
+
import { lazy, Suspense, useMemo } from "react";
|
|
7
7
|
import VideoPlayer from "./VideoPlayer";
|
|
8
|
-
|
|
8
|
+
const PDFViewer = lazy(() => import("./PdfViewer"));
|
|
9
9
|
const GoArrowLeftIcon = GoArrowLeft;
|
|
10
10
|
const GoArrowRightIcon = GoArrowRight;
|
|
11
11
|
const PreviewDetails = ({ file, hasPrev, hasNext, onPrev, onNext, showFilePreview, }) => {
|
|
@@ -23,27 +23,9 @@ const PreviewDetails = ({ file, hasPrev, hasNext, onPrev, onNext, showFilePrevie
|
|
|
23
23
|
else if (startsWith(mimetype, "video/")) {
|
|
24
24
|
return _jsx(VideoPlayer, { src: get(file, "s3Url") || get(file, "downloadUrl") || get(file, "thumbnailUrl", "") });
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// includes(
|
|
30
|
-
// [
|
|
31
|
-
// "text/csv",
|
|
32
|
-
// "application/vnd.ms-excel",
|
|
33
|
-
// "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
34
|
-
// ],
|
|
35
|
-
// mimetype
|
|
36
|
-
// )
|
|
37
|
-
// ) {
|
|
38
|
-
// return (
|
|
39
|
-
// <div className="p-4 text-center text-lg text-textColor dark:text-darkTextColor">
|
|
40
|
-
// Preview not supported for this file type.{" "}
|
|
41
|
-
// <a href={get(file, "s3Url")} className="underline ml-1">
|
|
42
|
-
// Download File
|
|
43
|
-
// </a>
|
|
44
|
-
// </div>
|
|
45
|
-
// );
|
|
46
|
-
// }
|
|
26
|
+
else if (mimetype === "application/pdf") {
|
|
27
|
+
return (_jsx(Suspense, { fallback: _jsx("div", { className: "md-lib-p-4 md-lib-text-center md-lib-text-textColor dark:md-lib-text-darkTextColor", children: "Loading PDF viewer..." }), children: _jsx(PDFViewer, { fileUrl: get(file, "s3Url") || get(file, "downloadUrl", ""), file: file, showFilePreview: showFilePreview }) }));
|
|
28
|
+
}
|
|
47
29
|
else {
|
|
48
30
|
return (_jsxs("div", { className: "p-4 text-center text-lg text-textColor dark:text-darkTextColor", children: ["Preview not supported for this file type.", " ", _jsx("a", { href: get(file, "s3Url"), download: true, className: "underline ml-1", children: "Download File" })] })
|
|
49
31
|
// <div className="p-4 text-center text-lg text-textColor dark:text-darkTextColor">
|
package/build/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.md-lib-pointer-events-none{pointer-events:none}.md-lib-fixed{position:fixed}.md-lib-absolute{position:absolute}.md-lib-relative{position:relative}.md-lib-inset-0{inset:0}.\!-md-lib-left-full{left:-100%!important}.md-lib--top-3{top:-.75rem}.md-lib-bottom-10{bottom:2.5rem}.md-lib-bottom-6{bottom:1.5rem}.md-lib-left-0{left:0}.md-lib-left-1{left:.25rem}.md-lib-left-1\/2{left:50%}.md-lib-left-6{left:1.5rem}.md-lib-right-1{right:.25rem}.md-lib-right-3{right:.75rem}.md-lib-right-6{right:1.5rem}.md-lib-top-0{top:0}.md-lib-top-1{top:.25rem}.md-lib-top-1\/2{top:50%}.md-lib-top-16{top:4rem}.md-lib-z-30{z-index:30}.md-lib-z-50{z-index:50}.md-lib-z-\[1000\]{z-index:1000}.md-lib-z-\[1001\]{z-index:1001}.md-lib-order-2{order:2}.md-lib-col-span-1{grid-column:span 1/span 1}.md-lib-col-span-2{grid-column:span 2/span 2}.md-lib-col-span-3{grid-column:span 3/span 3}.md-lib-m-2{margin:.5rem}.md-lib-mx-2\.5{margin-left:.625rem;margin-right:.625rem}.md-lib-mx-8{margin-left:2rem;margin-right:2rem}.md-lib-mx-auto{margin-left:auto;margin-right:auto}.md-lib-my-3{margin-bottom:.75rem;margin-top:.75rem}.md-lib-my-4{margin-bottom:1rem;margin-top:1rem}.\!md-lib-mb-4{margin-bottom:1rem!important}.md-lib-mb-0{margin-bottom:0}.md-lib-mb-1{margin-bottom:.25rem}.md-lib-mb-2{margin-bottom:.5rem}.md-lib-mb-3{margin-bottom:.75rem}.md-lib-mb-4{margin-bottom:1rem}.md-lib-mb-5{margin-bottom:1.25rem}.md-lib-mb-6{margin-bottom:1.5rem}.md-lib-mb-8{margin-bottom:2rem}.md-lib-ml-1{margin-left:.25rem}.md-lib-ml-12{margin-left:3rem}.md-lib-ml-2{margin-left:.5rem}.md-lib-ml-4{margin-left:1rem}.md-lib-ml-auto{margin-left:auto}.md-lib-mr-2{margin-right:.5rem}.md-lib-mt-1{margin-top:.25rem}.md-lib-mt-2{margin-top:.5rem}.md-lib-mt-3{margin-top:.75rem}.md-lib-mt-4{margin-top:1rem}.md-lib-mt-6{margin-top:1.5rem}.md-lib-mt-8{margin-top:2rem}.md-lib-mt-\[3px\]{margin-top:3px}.md-lib-block{display:block}.md-lib-inline-block{display:inline-block}.md-lib-flex{display:flex}.md-lib-inline-table{display:inline-table}.md-lib-grid{display:grid}.md-lib-hidden{display:none}.md-lib-aspect-square{aspect-ratio:1/1}.md-lib-aspect-video{aspect-ratio:16/9}.\!md-lib-h-screen{height:100vh!important}.md-lib-h-10{height:2.5rem}.md-lib-h-11{height:2.75rem}.md-lib-h-12{height:3rem}.md-lib-h-16{height:4rem}.md-lib-h-20{height:5rem}.md-lib-h-28{height:7rem}.md-lib-h-4{height:1rem}.md-lib-h-5{height:1.25rem}.md-lib-h-52{height:13rem}.md-lib-h-72{height:18rem}.md-lib-h-8{height:2rem}.md-lib-h-\[300px\]{height:300px}.md-lib-h-\[33px\]{height:33px}.md-lib-h-\[calc\(100vh-281px\)\]{height:calc(100vh - 281px)}.md-lib-h-\[calc\(100vh-65px\)\]{height:calc(100vh - 65px)}.md-lib-h-\[inherit\]{height:inherit}.md-lib-h-auto{height:auto}.md-lib-h-full{height:100%}.md-lib-h-screen{height:100vh}.md-lib-max-h-\[calc\(100\%-76px\)\]{max-height:calc(100% - 76px)}.md-lib-max-h-\[calc\(100vh-100px\)\]{max-height:calc(100vh - 100px)}.md-lib-max-h-\[calc\(100vh-161px\)\]{max-height:calc(100vh - 161px)}.md-lib-max-h-\[calc\(100vh-65px\)\]{max-height:calc(100vh - 65px)}.md-lib-max-h-full{max-height:100%}.md-lib-min-h-0{min-height:0}.md-lib-min-h-14{min-height:3.5rem}.md-lib-min-h-36{min-height:9rem}.md-lib-min-h-\[200px\]{min-height:200px}.md-lib-min-h-\[calc\(100vh-127px\)\]{min-height:calc(100vh - 127px)}.md-lib-min-h-\[calc\(100vh-135px\)\]{min-height:calc(100vh - 135px)}.md-lib-min-h-full{min-height:100%}.\!md-lib-w-12{width:3rem!important}.md-lib-w-10{width:2.5rem}.md-lib-w-11\/12{width:91.666667%}.md-lib-w-12{width:3rem}.md-lib-w-4{width:1rem}.md-lib-w-4\/5{width:80%}.md-lib-w-40{width:10rem}.md-lib-w-5{width:1.25rem}.md-lib-w-56{width:14rem}.md-lib-w-6{width:1.5rem}.md-lib-w-8{width:2rem}.md-lib-w-80{width:20rem}.md-lib-w-96{width:24rem}.md-lib-w-\[100px\]{width:100px}.md-lib-w-\[120px\]{width:120px}.md-lib-w-\[150px\]{width:150px}.md-lib-w-\[1px\]{width:1px}.md-lib-w-\[280px\]{width:280px}.md-lib-w-\[400px\]{width:400px}.md-lib-w-\[80px\]{width:80px}.md-lib-w-\[calc\(100\%-20px\)\]{width:calc(100% - 20px)}.md-lib-w-\[calc\(100\%-24px\)\]{width:calc(100% - 24px)}.md-lib-w-\[calc\(100\%-5px\)\]{width:calc(100% - 5px)}.md-lib-w-full{width:100%}.md-lib-w-screen{width:100vw}.md-lib-min-w-0{min-width:0}.md-lib-min-w-\[120px\]{min-width:120px}.md-lib-min-w-\[200px\]{min-width:200px}.md-lib-min-w-\[280px\]{min-width:280px}.md-lib-min-w-\[320px\]{min-width:320px}.md-lib-min-w-\[3rem\]{min-width:3rem}.md-lib-min-w-fit{min-width:fit-content}.md-lib-max-w-28{max-width:7rem}.md-lib-max-w-2xl{max-width:42rem}.md-lib-max-w-3xl{max-width:48rem}.md-lib-max-w-40{max-width:10rem}.md-lib-max-w-4xl{max-width:56rem}.md-lib-max-w-64{max-width:16rem}.md-lib-max-w-6xl{max-width:72rem}.md-lib-max-w-7xl{max-width:80rem}.md-lib-max-w-\[180px\]{max-width:180px}.md-lib-max-w-\[200px\]{max-width:200px}.md-lib-max-w-\[240px\]{max-width:240px}.md-lib-max-w-\[280px\]{max-width:280px}.md-lib-max-w-\[calc\(100vw-180px\)\]{max-width:calc(100vw - 180px)}.md-lib-max-w-full{max-width:100%}.md-lib-max-w-md{max-width:28rem}.md-lib-flex-1{flex:1 1 0%}.md-lib-flex-shrink-0,.md-lib-shrink-0{flex-shrink:0}.-md-lib-translate-x-1\/2{--tw-translate-x:-50%}.-md-lib-translate-x-1\/2,.-md-lib-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-md-lib-translate-y-1\/2{--tw-translate-y:-50%}.md-lib-translate-y-0{--tw-translate-y:0px}.md-lib-translate-y-0,.md-lib-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md-lib-translate-y-4{--tw-translate-y:1rem}.md-lib-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md-lib-cursor-default{cursor:default}.md-lib-cursor-not-allowed{cursor:not-allowed}.md-lib-cursor-pointer{cursor:pointer}.md-lib-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md-lib-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md-lib-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md-lib-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md-lib-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md-lib-flex-col{flex-direction:column}.md-lib-flex-wrap{flex-wrap:wrap}.md-lib-items-start{align-items:flex-start}.md-lib-items-end{align-items:flex-end}.md-lib-items-center{align-items:center}.md-lib-justify-end{justify-content:flex-end}.md-lib-justify-center{justify-content:center}.md-lib-justify-between{justify-content:space-between}.md-lib-gap-1{gap:.25rem}.md-lib-gap-2{gap:.5rem}.md-lib-gap-3{gap:.75rem}.md-lib-gap-4{gap:1rem}.md-lib-gap-5{gap:1.25rem}.md-lib-gap-8{gap:2rem}.md-lib-gap-x-4{column-gap:1rem}.md-lib-gap-y-10{row-gap:2.5rem}.md-lib-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.md-lib-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.md-lib-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.md-lib-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.md-lib-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.md-lib-self-start{align-self:flex-start}.md-lib-overflow-auto{overflow:auto}.md-lib-overflow-hidden{overflow:hidden}.md-lib-overflow-x-auto{overflow-x:auto}.md-lib-overflow-y-auto{overflow-y:auto}.md-lib-overflow-y-scroll{overflow-y:scroll}.md-lib-truncate{overflow:hidden;text-overflow:ellipsis}.md-lib-truncate,.md-lib-whitespace-nowrap{white-space:nowrap}.\!md-lib-rounded-lg{border-radius:.5rem!important}.md-lib-rounded{border-radius:.25rem}.md-lib-rounded-\[20px\]{border-radius:20px}.md-lib-rounded-full{border-radius:9999px}.md-lib-rounded-lg{border-radius:.5rem}.md-lib-rounded-md{border-radius:.375rem}.md-lib-rounded-none{border-radius:0}.md-lib-rounded-xl{border-radius:.75rem}.md-lib-rounded-s{border-end-start-radius:.25rem;border-start-start-radius:.25rem}.md-lib-border{border-width:1px}.md-lib-border-0{border-width:0}.md-lib-border-2{border-width:2px}.md-lib-border-4{border-width:4px}.md-lib-border-b{border-bottom-width:1px}.md-lib-border-l{border-left-width:1px}.md-lib-border-r{border-right-width:1px}.md-lib-border-t{border-top-width:1px}.md-lib-border-dashed{border-style:dashed}.md-lib-border-none{border-style:none}.md-lib-border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.md-lib-border-borderColor{border-color:var(--color-border,#9aa8bc33)}.md-lib-border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.md-lib-border-primaryColor{border-color:var(--color-primary,#0b6d97)}.md-lib-border-secondaryBorderColor{--tw-border-opacity:1;border-color:rgb(237 242 247/var(--tw-border-opacity,1))}.md-lib-border-secondaryHoverColor{--tw-border-opacity:1;border-color:rgb(203 212 225/var(--tw-border-opacity,1))}.md-lib-border-secondaryTextColor{--tw-border-opacity:1;border-color:rgb(114 129 151/var(--tw-border-opacity,1))}.md-lib-bg-\[\#DEE4ED\]{--tw-bg-opacity:1;background-color:rgb(222 228 237/var(--tw-bg-opacity,1))}.md-lib-bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.md-lib-bg-black\/50{background-color:#00000080}.md-lib-bg-borderColor{background-color:var(--color-border,#9aa8bc33)}.md-lib-bg-darkPrimaryBg{--tw-bg-opacity:1;background-color:rgb(22 28 85/var(--tw-bg-opacity,1))}.md-lib-bg-primaryColor{background-color:var(--color-primary,#0b6d97)}.md-lib-bg-secondaryColor{background-color:var(--color-secondary,#eceff4)}.md-lib-bg-secondaryHoverColor{--tw-bg-opacity:1;background-color:rgb(203 212 225/var(--tw-bg-opacity,1))}.md-lib-bg-secondaryTextColor{--tw-bg-opacity:1;background-color:rgb(114 129 151/var(--tw-bg-opacity,1))}.md-lib-bg-textColorActive{background-color:var(--color-text-active,#f6f8fb)}.md-lib-bg-transparent{background-color:initial}.md-lib-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.md-lib-object-contain{object-fit:contain}.md-lib-object-cover{object-fit:cover}.md-lib-p-1{padding:.25rem}.md-lib-p-2{padding:.5rem}.md-lib-p-3{padding:.75rem}.md-lib-p-4{padding:1rem}.md-lib-p-5{padding:1.25rem}.md-lib-p-6{padding:1.5rem}.md-lib-p-8{padding:2rem}.\!md-lib-px-4{padding-left:1rem!important;padding-right:1rem!important}.md-lib-px-2{padding-left:.5rem;padding-right:.5rem}.md-lib-px-3{padding-left:.75rem;padding-right:.75rem}.md-lib-px-4{padding-left:1rem;padding-right:1rem}.md-lib-px-5{padding-left:1.25rem;padding-right:1.25rem}.md-lib-px-6{padding-left:1.5rem;padding-right:1.5rem}.md-lib-py-1{padding-bottom:.25rem;padding-top:.25rem}.md-lib-py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.md-lib-py-2{padding-bottom:.5rem;padding-top:.5rem}.md-lib-py-3{padding-bottom:.75rem;padding-top:.75rem}.md-lib-py-4{padding-bottom:1rem;padding-top:1rem}.md-lib-py-8{padding-bottom:2rem;padding-top:2rem}.\!md-lib-pt-0{padding-top:0!important}.md-lib-pb-2{padding-bottom:.5rem}.md-lib-pb-20{padding-bottom:5rem}.md-lib-pb-4{padding-bottom:1rem}.md-lib-pb-6{padding-bottom:1.5rem}.md-lib-pb-7{padding-bottom:1.75rem}.md-lib-pl-2{padding-left:.5rem}.md-lib-pl-4{padding-left:1rem}.md-lib-pr-2{padding-right:.5rem}.md-lib-pr-4{padding-right:1rem}.md-lib-pr-\[10px\]{padding-right:10px}.md-lib-pt-1{padding-top:.25rem}.md-lib-pt-2{padding-top:.5rem}.md-lib-pt-2\.5{padding-top:.625rem}.md-lib-pt-3{padding-top:.75rem}.md-lib-pt-4{padding-top:1rem}.md-lib-pt-5{padding-top:1.25rem}.md-lib-text-center{text-align:center}.md-lib-font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.md-lib-text-2xl{font-size:1.5rem;line-height:2rem}.md-lib-text-3xl{font-size:1.875rem;line-height:2.25rem}.md-lib-text-4xl{font-size:2.25rem;line-height:2.5rem}.md-lib-text-\[15px\]{font-size:15px}.md-lib-text-\[16px\]{font-size:16px}.md-lib-text-\[20px\]{font-size:20px}.md-lib-text-\[22px\]{font-size:22px}.md-lib-text-base{font-size:1rem;line-height:1.5rem}.md-lib-text-lg{font-size:1.125rem;line-height:1.75rem}.md-lib-text-sm{font-size:.875rem;line-height:1.25rem}.md-lib-text-xl{font-size:1.25rem;line-height:1.75rem}.md-lib-text-xs{font-size:.75rem;line-height:1rem}.md-lib-font-bold{font-weight:700}.md-lib-font-medium{font-weight:500}.md-lib-font-semibold{font-weight:600}.md-lib-capitalize{text-transform:capitalize}.md-lib-leading-normal{line-height:1.5}.md-lib-leading-relaxed{line-height:1.625}.md-lib-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.md-lib-text-borderColor{color:var(--color-border,#9aa8bc33)}.md-lib-text-dangerColor{color:var(--color-danger,#e42131)}.md-lib-text-darkTextColor{--tw-text-opacity:1;color:rgb(238 238 238/var(--tw-text-opacity,1))}.md-lib-text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.md-lib-text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.md-lib-text-headingText{--tw-text-opacity:1;color:rgb(0 19 37/var(--tw-text-opacity,1))}.md-lib-text-imagesColor{--tw-text-opacity:1;color:rgb(251 137 81/var(--tw-text-opacity,1))}.md-lib-text-musicColor{--tw-text-opacity:1;color:rgb(95 140 230/var(--tw-text-opacity,1))}.md-lib-text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.md-lib-text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.md-lib-text-otherColor{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity,1))}.md-lib-text-primaryColor{color:var(--color-primary,#0b6d97)}.md-lib-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.md-lib-text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.md-lib-text-secondaryTextColor{--tw-text-opacity:1;color:rgb(114 129 151/var(--tw-text-opacity,1))}.md-lib-text-textColor{color:var(--color-text,#1a212b)}.md-lib-text-themeGreen{--tw-text-opacity:1;color:rgb(1 106 28/var(--tw-text-opacity,1))}.md-lib-text-videosColor{--tw-text-opacity:1;color:rgb(81 224 152/var(--tw-text-opacity,1))}.md-lib-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.md-lib-underline{text-decoration-line:underline}.md-lib-opacity-0{opacity:0}.md-lib-opacity-100{opacity:1}.\!md-lib-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.md-lib-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.md-lib-shadow-lg,.md-lib-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md-lib-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.md-lib-shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.md-lib-shadow-none,.md-lib-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md-lib-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.md-lib-transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.md-lib-transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.md-lib-duration-300{transition-duration:.3s}.md-lib-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--foreground-rgb:0,0,0;--background-start-rgb:255,255,255;--background-end-rgb:255,255,255;--icon-color:#000;--table-bgcolor:#f8f9fa;--hover-color:#efeffe;--box-shadow-small:0px 4px 8px #090b1980;--theme-primary:#0b6d97;--text-color:#fff;--text-primary:#001325eb;--theme-primary-hover:#0b6d97cc;--theme-secondary:#eceff4;--arrrow-color:#fff;--border-color:#9aa8bc33;--shadow-color:hsla(0,0%,79%,.667);--theme-danger:#e42131;--theme-danger-hover:#e42131cc;--menu-arrow:#fff;--text-disabled:#00000040;--radio-btn:#c2c2c2;--bar-bg-color:#f5f5f5}.dark{--icon-color:#d5d8df!important;--table-bgcolor:#30324e!important;--hover-color:#3f4259!important;--box-shadow-small:0px 4px 8px #090b1980;--theme-primary:#181b34!important;--text-color:#d5d8df!important;--text-primary:#e5e6ea!important;--theme-secondary:#30324e!important;--theme-primary-hover:#212642!important;--foreground-rgb:255,255,255!important;--background-start-rgb:0,0,0!important;--background-end-rgb:0,0,0!important;--arrrow-color:#30324e!important;--border-color:#4b4e69!important;--shadow-color:rgba(33,33,33,.667);--menu-arrow:#212642!important;--text-disabled:#ffffff40!important;--radio-btn:#4b4e69!important;--bar-bg-color:#30324e!important}.ant-layout-sider-children{display:flex;flex-direction:column}body{background:rgb(var(--background-start-rgb));color:rgb(var(--foreground-rgb));font-family:Inter}.ant-form-item-label label{color:#728197!important;font-size:12px!important;font-style:normal;line-height:18px}.search-input{border-radius:100px;width:320px}.page-height{height:calc(100vh - 65px)!important}.ant-btn-dangerous{background-color:var(--theme-danger)!important}.description{--tw-text-opacity:1;color:rgb(0 19 37/var(--tw-text-opacity,1));font-size:.75rem;font-style:normal;font-weight:500;line-height:1rem;line-height:18px}.grid-radio-btns label{align-items:center;display:inline-flex;justify-content:center;width:6rem}.grid-radio-btns label:first-child{border-bottom-left-radius:9999px!important;border-top-left-radius:9999px!important}.grid-radio-btns label:last-child{border-bottom-right-radius:9999px!important;border-top-right-radius:9999px!important}*{box-sizing:border-box;margin:0;padding:0}.asset-management-page{max-height:calc(100vh - 115px);overflow-y:scroll;padding:10px 20px}.asset-management-page .asset-management-table .header{align-items:center;display:flex;margin-bottom:20px;margin-top:10px}.asset-management-page .asset-management-table .header .page-title{width:300px}.asset-management-page .asset-management-table .header .right-section{display:contents;margin-left:auto}.asset-management-page .asset-management-table .header .right-section .search-bar{margin-right:20px}.asset-management-page .asset-management-table .mobile-search-bar{display:none}.page-title.ant-typography{margin:0!important}.asset-management-table{margin-top:30px}.create-asset-page .form .metadata-field-container{align-items:center;display:flex;margin-bottom:10px;width:100%}.create-asset-page .form .metadata-field{background-color:#f5f5f5;border-radius:4px;padding:20px}.create-asset-page .form .metadata-field .ant-row{margin:0!important}.assetType-table .ant-table-content{min-height:calc(100vh - 210px)}.assetType-table .ant-table-footer .assetType-pagination{display:flex;justify-content:flex-end}.row-dragging{background:var(--color,#18bfcd);border:1px solid #f0f0f0;color:#fff}.asset-management-table .ant-table-container .ant-table-cell{width:50%}.is-dragging-over .row-dragging{background:var(--color,#18bfcd)}.asset-management-table .ant-table-container .ant-typography-ellipsis-single-line{max-width:400px}@media (max-width:767px){.asset-management-page .asset-management-table .header .right-section .search-bar{display:none}.asset-management-page .asset-management-table .mobile-search-bar{display:block;margin-bottom:10px}.asset-management-page .asset-management-table .header{margin-bottom:5px}.assetType-table .ant-table-content{min-height:calc(100vh - 235px)}.asset-management-table .ant-table-container .ant-typography-ellipsis-single-line{max-width:160px}}.create-asset-page .dam-loading{align-items:center;display:flex;height:calc(100vh - 200px);justify-content:center}.ant-typography{margin-bottom:0!important}.ant-btn-color-default{box-shadow:none!important}.ant-switch .ant-switch-inner{background-color:#9aa8bc33}.ant-btn-primary{color:#fff!important}.ant-btn-color-primary{box-shadow:none!important}.ant-tree-treenode{height:34px!important}.ant-tree .ant-tree-switcher .ant-tree-switcher-icon{vertical-align:-webkit-baseline-middle}.ant-tree .ant-tree-switcher{margin-inline-end:0!important}.ant-tree .ant-tree-switcher:before{height:33px!important}.ant-tree .ant-tree-node-content-wrapper{padding-left:0!important}.ant-tree .ant-tree-node-selected:hover{color:#eee!important}.tui-image-editor-header-logo{display:none!important}.ant-tree-treenode-draggable .ant-tree-draggable-icon{width:0!important}.ant-tree-list .ant-tree-treenode .ant-tree-title{font-size:14px!important;margin-left:0!important}.share-link-dropdown .ant-select-selection-wrap,.share-link-dropdown .ant-select-selection-wrap .ant-select-selection-item{height:100%}.hover\:md-lib-border-black:hover{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.hover\:md-lib-border-primaryColor:hover{border-color:var(--color-primary,#0b6d97)}.hover\:md-lib-bg-black\/70:hover{background-color:#000000b3}.hover\:md-lib-bg-borderColor:hover{background-color:var(--color-border,#9aa8bc33)}.hover\:md-lib-bg-secondaryColor:hover{background-color:var(--color-secondary,#eceff4)}.hover\:md-lib-bg-secondaryHoverColor:hover{--tw-bg-opacity:1;background-color:rgb(203 212 225/var(--tw-bg-opacity,1))}.hover\:md-lib-opacity-80:hover{opacity:.8}.hover\:md-lib-opacity-90:hover{opacity:.9}.focus\:md-lib-outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:md-lib-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:md-lib-ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.dark\:md-lib-border-darkBorderColor:is(.md-lib-dark *){--tw-border-opacity:1;border-color:rgb(75 78 105/var(--tw-border-opacity,1))}.dark\:md-lib-bg-darkBorderColor:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(75 78 105/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkPrimary:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(24 27 52/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkPrimaryBg:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(22 28 85/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkPrimaryHoverColor:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(33 38 66/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkSecondaryColor:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(48 50 78/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkSecondaryTextColor:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(150 153 166/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-white\/20:is(.md-lib-dark *){background-color:#fff3}.dark\:md-lib-text-darkBorderColor:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(75 78 105/var(--tw-text-opacity,1))}.dark\:md-lib-text-darkSecondaryTextColor:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(150 153 166/var(--tw-text-opacity,1))}.dark\:md-lib-text-darkTextColor:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(238 238 238/var(--tw-text-opacity,1))}.dark\:md-lib-text-gray-400:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:md-lib-text-white:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:hover\:md-lib-bg-darkSecondaryColor:hover:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(48 50 78/var(--tw-bg-opacity,1))}.dark\:hover\:md-lib-bg-white\/30:hover:is(.md-lib-dark *){background-color:#ffffff4d}.hover\:dark\:md-lib-bg-darkPrimaryHoverColor:is(.md-lib-dark *):hover{--tw-bg-opacity:1;background-color:rgb(33 38 66/var(--tw-bg-opacity,1))}@media (min-width:640px){.sm\:md-lib-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\:md-lib-block{display:block}.md\:md-lib-w-\[720px\]{width:720px}.md\:md-lib-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:md-lib-grid-cols-\[auto\2c 1fr\]{grid-template-columns:auto 1fr}}@media (min-width:1024px){.lg\:md-lib-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:md-lib-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1280px){.xl\:md-lib-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:md-lib-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width:1536px){.\32xl\:md-lib-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}
|
|
1
|
+
*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.md-lib-pointer-events-none{pointer-events:none}.md-lib-fixed{position:fixed}.md-lib-absolute{position:absolute}.md-lib-relative{position:relative}.md-lib-inset-0{inset:0}.\!-md-lib-left-full{left:-100%!important}.md-lib--top-3{top:-.75rem}.md-lib-bottom-10{bottom:2.5rem}.md-lib-bottom-6{bottom:1.5rem}.md-lib-left-0{left:0}.md-lib-left-1{left:.25rem}.md-lib-left-1\/2{left:50%}.md-lib-left-6{left:1.5rem}.md-lib-right-1{right:.25rem}.md-lib-right-3{right:.75rem}.md-lib-right-6{right:1.5rem}.md-lib-top-0{top:0}.md-lib-top-1{top:.25rem}.md-lib-top-1\/2{top:50%}.md-lib-top-16{top:4rem}.md-lib-z-30{z-index:30}.md-lib-z-50{z-index:50}.md-lib-z-\[1000\]{z-index:1000}.md-lib-z-\[1001\]{z-index:1001}.md-lib-order-2{order:2}.md-lib-col-span-1{grid-column:span 1/span 1}.md-lib-col-span-2{grid-column:span 2/span 2}.md-lib-col-span-3{grid-column:span 3/span 3}.md-lib-m-2{margin:.5rem}.md-lib-mx-2{margin-left:.5rem;margin-right:.5rem}.md-lib-mx-2\.5{margin-left:.625rem;margin-right:.625rem}.md-lib-mx-8{margin-left:2rem;margin-right:2rem}.md-lib-mx-auto{margin-left:auto;margin-right:auto}.md-lib-my-3{margin-bottom:.75rem;margin-top:.75rem}.md-lib-my-4{margin-bottom:1rem;margin-top:1rem}.\!md-lib-mb-4{margin-bottom:1rem!important}.md-lib-mb-0{margin-bottom:0}.md-lib-mb-1{margin-bottom:.25rem}.md-lib-mb-2{margin-bottom:.5rem}.md-lib-mb-3{margin-bottom:.75rem}.md-lib-mb-4{margin-bottom:1rem}.md-lib-mb-5{margin-bottom:1.25rem}.md-lib-mb-6{margin-bottom:1.5rem}.md-lib-mb-8{margin-bottom:2rem}.md-lib-ml-1{margin-left:.25rem}.md-lib-ml-12{margin-left:3rem}.md-lib-ml-2{margin-left:.5rem}.md-lib-ml-4{margin-left:1rem}.md-lib-ml-auto{margin-left:auto}.md-lib-mr-2{margin-right:.5rem}.md-lib-mt-1{margin-top:.25rem}.md-lib-mt-2{margin-top:.5rem}.md-lib-mt-3{margin-top:.75rem}.md-lib-mt-4{margin-top:1rem}.md-lib-mt-6{margin-top:1.5rem}.md-lib-mt-8{margin-top:2rem}.md-lib-mt-\[3px\]{margin-top:3px}.md-lib-block{display:block}.md-lib-inline-block{display:inline-block}.md-lib-flex{display:flex}.md-lib-inline-table{display:inline-table}.md-lib-grid{display:grid}.md-lib-hidden{display:none}.md-lib-aspect-square{aspect-ratio:1/1}.md-lib-aspect-video{aspect-ratio:16/9}.\!md-lib-h-screen{height:100vh!important}.md-lib-h-10{height:2.5rem}.md-lib-h-11{height:2.75rem}.md-lib-h-12{height:3rem}.md-lib-h-16{height:4rem}.md-lib-h-20{height:5rem}.md-lib-h-28{height:7rem}.md-lib-h-4{height:1rem}.md-lib-h-5{height:1.25rem}.md-lib-h-52{height:13rem}.md-lib-h-6{height:1.5rem}.md-lib-h-7{height:1.75rem}.md-lib-h-72{height:18rem}.md-lib-h-8{height:2rem}.md-lib-h-\[300px\]{height:300px}.md-lib-h-\[33px\]{height:33px}.md-lib-h-\[calc\(100vh-281px\)\]{height:calc(100vh - 281px)}.md-lib-h-\[calc\(100vh-65px\)\]{height:calc(100vh - 65px)}.md-lib-h-\[inherit\]{height:inherit}.md-lib-h-auto{height:auto}.md-lib-h-full{height:100%}.md-lib-h-screen{height:100vh}.md-lib-max-h-\[300px\]{max-height:300px}.md-lib-max-h-\[calc\(100\%-76px\)\]{max-height:calc(100% - 76px)}.md-lib-max-h-\[calc\(100vh-100px\)\]{max-height:calc(100vh - 100px)}.md-lib-max-h-\[calc\(100vh-161px\)\]{max-height:calc(100vh - 161px)}.md-lib-max-h-\[calc\(100vh-65px\)\]{max-height:calc(100vh - 65px)}.md-lib-max-h-full{max-height:100%}.md-lib-min-h-0{min-height:0}.md-lib-min-h-14{min-height:3.5rem}.md-lib-min-h-36{min-height:9rem}.md-lib-min-h-\[200px\]{min-height:200px}.md-lib-min-h-\[calc\(100vh-127px\)\]{min-height:calc(100vh - 127px)}.md-lib-min-h-\[calc\(100vh-135px\)\]{min-height:calc(100vh - 135px)}.md-lib-min-h-full{min-height:100%}.\!md-lib-w-12{width:3rem!important}.md-lib-w-10{width:2.5rem}.md-lib-w-11\/12{width:91.666667%}.md-lib-w-12{width:3rem}.md-lib-w-4{width:1rem}.md-lib-w-4\/5{width:80%}.md-lib-w-40{width:10rem}.md-lib-w-5{width:1.25rem}.md-lib-w-56{width:14rem}.md-lib-w-6{width:1.5rem}.md-lib-w-7{width:1.75rem}.md-lib-w-8{width:2rem}.md-lib-w-80{width:20rem}.md-lib-w-96{width:24rem}.md-lib-w-\[100px\]{width:100px}.md-lib-w-\[120px\]{width:120px}.md-lib-w-\[150px\]{width:150px}.md-lib-w-\[1px\]{width:1px}.md-lib-w-\[280px\]{width:280px}.md-lib-w-\[400px\]{width:400px}.md-lib-w-\[80px\]{width:80px}.md-lib-w-\[calc\(100\%-20px\)\]{width:calc(100% - 20px)}.md-lib-w-\[calc\(100\%-24px\)\]{width:calc(100% - 24px)}.md-lib-w-\[calc\(100\%-5px\)\]{width:calc(100% - 5px)}.md-lib-w-full{width:100%}.md-lib-w-px{width:1px}.md-lib-w-screen{width:100vw}.md-lib-min-w-0{min-width:0}.md-lib-min-w-\[120px\]{min-width:120px}.md-lib-min-w-\[200px\]{min-width:200px}.md-lib-min-w-\[280px\]{min-width:280px}.md-lib-min-w-\[320px\]{min-width:320px}.md-lib-min-w-\[3rem\]{min-width:3rem}.md-lib-min-w-\[60px\]{min-width:60px}.md-lib-min-w-fit{min-width:fit-content}.md-lib-max-w-28{max-width:7rem}.md-lib-max-w-2xl{max-width:42rem}.md-lib-max-w-3xl{max-width:48rem}.md-lib-max-w-40{max-width:10rem}.md-lib-max-w-4xl{max-width:56rem}.md-lib-max-w-64{max-width:16rem}.md-lib-max-w-6xl{max-width:72rem}.md-lib-max-w-7xl{max-width:80rem}.md-lib-max-w-\[160px\]{max-width:160px}.md-lib-max-w-\[180px\]{max-width:180px}.md-lib-max-w-\[200px\]{max-width:200px}.md-lib-max-w-\[240px\]{max-width:240px}.md-lib-max-w-\[280px\]{max-width:280px}.md-lib-max-w-\[calc\(100vw-180px\)\]{max-width:calc(100vw - 180px)}.md-lib-max-w-full{max-width:100%}.md-lib-max-w-md{max-width:28rem}.md-lib-flex-1{flex:1 1 0%}.md-lib-flex-shrink-0,.md-lib-shrink-0{flex-shrink:0}.-md-lib-translate-x-1\/2{--tw-translate-x:-50%}.-md-lib-translate-x-1\/2,.-md-lib-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-md-lib-translate-y-1\/2{--tw-translate-y:-50%}.md-lib-translate-y-0{--tw-translate-y:0px}.md-lib-translate-y-0,.md-lib-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md-lib-translate-y-4{--tw-translate-y:1rem}.md-lib-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md-lib-cursor-default{cursor:default}.md-lib-cursor-not-allowed{cursor:not-allowed}.md-lib-cursor-pointer{cursor:pointer}.md-lib-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md-lib-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md-lib-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md-lib-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md-lib-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md-lib-flex-col{flex-direction:column}.md-lib-flex-wrap{flex-wrap:wrap}.md-lib-items-start{align-items:flex-start}.md-lib-items-end{align-items:flex-end}.md-lib-items-center{align-items:center}.md-lib-justify-end{justify-content:flex-end}.md-lib-justify-center{justify-content:center}.md-lib-justify-between{justify-content:space-between}.md-lib-gap-1{gap:.25rem}.md-lib-gap-2{gap:.5rem}.md-lib-gap-3{gap:.75rem}.md-lib-gap-4{gap:1rem}.md-lib-gap-5{gap:1.25rem}.md-lib-gap-8{gap:2rem}.md-lib-gap-x-4{column-gap:1rem}.md-lib-gap-y-10{row-gap:2.5rem}.md-lib-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.md-lib-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.md-lib-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.md-lib-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.md-lib-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.md-lib-self-start{align-self:flex-start}.md-lib-overflow-auto{overflow:auto}.md-lib-overflow-hidden{overflow:hidden}.md-lib-overflow-x-auto{overflow-x:auto}.md-lib-overflow-y-auto{overflow-y:auto}.md-lib-overflow-y-scroll{overflow-y:scroll}.md-lib-truncate{overflow:hidden;text-overflow:ellipsis}.md-lib-truncate,.md-lib-whitespace-nowrap{white-space:nowrap}.\!md-lib-rounded-lg{border-radius:.5rem!important}.md-lib-rounded{border-radius:.25rem}.md-lib-rounded-\[20px\]{border-radius:20px}.md-lib-rounded-full{border-radius:9999px}.md-lib-rounded-lg{border-radius:.5rem}.md-lib-rounded-md{border-radius:.375rem}.md-lib-rounded-none{border-radius:0}.md-lib-rounded-xl{border-radius:.75rem}.md-lib-rounded-s{border-end-start-radius:.25rem;border-start-start-radius:.25rem}.md-lib-border{border-width:1px}.md-lib-border-0{border-width:0}.md-lib-border-2{border-width:2px}.md-lib-border-4{border-width:4px}.md-lib-border-b{border-bottom-width:1px}.md-lib-border-l{border-left-width:1px}.md-lib-border-r{border-right-width:1px}.md-lib-border-t{border-top-width:1px}.md-lib-border-dashed{border-style:dashed}.md-lib-border-none{border-style:none}.md-lib-border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.md-lib-border-borderColor{border-color:var(--color-border,#9aa8bc33)}.md-lib-border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.md-lib-border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.md-lib-border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.md-lib-border-primaryColor{border-color:var(--color-primary,#0b6d97)}.md-lib-border-secondaryBorderColor{--tw-border-opacity:1;border-color:rgb(237 242 247/var(--tw-border-opacity,1))}.md-lib-border-secondaryHoverColor{--tw-border-opacity:1;border-color:rgb(203 212 225/var(--tw-border-opacity,1))}.md-lib-border-secondaryTextColor{--tw-border-opacity:1;border-color:rgb(114 129 151/var(--tw-border-opacity,1))}.md-lib-border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.md-lib-bg-\[\#3a3a3a\]{--tw-bg-opacity:1;background-color:rgb(58 58 58/var(--tw-bg-opacity,1))}.md-lib-bg-\[\#DEE4ED\]{--tw-bg-opacity:1;background-color:rgb(222 228 237/var(--tw-bg-opacity,1))}.md-lib-bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.md-lib-bg-black\/30{background-color:#0000004d}.md-lib-bg-black\/50{background-color:#00000080}.md-lib-bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.md-lib-bg-borderColor{background-color:var(--color-border,#9aa8bc33)}.md-lib-bg-darkPrimaryBg{--tw-bg-opacity:1;background-color:rgb(22 28 85/var(--tw-bg-opacity,1))}.md-lib-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.md-lib-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.md-lib-bg-primaryColor{background-color:var(--color-primary,#0b6d97)}.md-lib-bg-secondaryColor{background-color:var(--color-secondary,#eceff4)}.md-lib-bg-secondaryHoverColor{--tw-bg-opacity:1;background-color:rgb(203 212 225/var(--tw-bg-opacity,1))}.md-lib-bg-secondaryTextColor{--tw-bg-opacity:1;background-color:rgb(114 129 151/var(--tw-bg-opacity,1))}.md-lib-bg-textColorActive{background-color:var(--color-text-active,#f6f8fb)}.md-lib-bg-transparent{background-color:initial}.md-lib-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.md-lib-object-contain{object-fit:contain}.md-lib-object-cover{object-fit:cover}.md-lib-p-1{padding:.25rem}.md-lib-p-2{padding:.5rem}.md-lib-p-3{padding:.75rem}.md-lib-p-4{padding:1rem}.md-lib-p-5{padding:1.25rem}.md-lib-p-6{padding:1.5rem}.md-lib-p-8{padding:2rem}.\!md-lib-px-4{padding-left:1rem!important;padding-right:1rem!important}.md-lib-px-1{padding-left:.25rem;padding-right:.25rem}.md-lib-px-2{padding-left:.5rem;padding-right:.5rem}.md-lib-px-3{padding-left:.75rem;padding-right:.75rem}.md-lib-px-4{padding-left:1rem;padding-right:1rem}.md-lib-px-5{padding-left:1.25rem;padding-right:1.25rem}.md-lib-px-6{padding-left:1.5rem;padding-right:1.5rem}.md-lib-py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.md-lib-py-1{padding-bottom:.25rem;padding-top:.25rem}.md-lib-py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.md-lib-py-2{padding-bottom:.5rem;padding-top:.5rem}.md-lib-py-3{padding-bottom:.75rem;padding-top:.75rem}.md-lib-py-4{padding-bottom:1rem;padding-top:1rem}.md-lib-py-8{padding-bottom:2rem;padding-top:2rem}.\!md-lib-pt-0{padding-top:0!important}.md-lib-pb-2{padding-bottom:.5rem}.md-lib-pb-20{padding-bottom:5rem}.md-lib-pb-4{padding-bottom:1rem}.md-lib-pb-6{padding-bottom:1.5rem}.md-lib-pb-7{padding-bottom:1.75rem}.md-lib-pl-2{padding-left:.5rem}.md-lib-pl-4{padding-left:1rem}.md-lib-pr-2{padding-right:.5rem}.md-lib-pr-4{padding-right:1rem}.md-lib-pr-\[10px\]{padding-right:10px}.md-lib-pt-1{padding-top:.25rem}.md-lib-pt-2{padding-top:.5rem}.md-lib-pt-2\.5{padding-top:.625rem}.md-lib-pt-3{padding-top:.75rem}.md-lib-pt-4{padding-top:1rem}.md-lib-pt-5{padding-top:1.25rem}.md-lib-text-center{text-align:center}.md-lib-font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.md-lib-text-2xl{font-size:1.5rem;line-height:2rem}.md-lib-text-3xl{font-size:1.875rem;line-height:2.25rem}.md-lib-text-4xl{font-size:2.25rem;line-height:2.5rem}.md-lib-text-\[15px\]{font-size:15px}.md-lib-text-\[16px\]{font-size:16px}.md-lib-text-\[20px\]{font-size:20px}.md-lib-text-\[22px\]{font-size:22px}.md-lib-text-base{font-size:1rem;line-height:1.5rem}.md-lib-text-lg{font-size:1.125rem;line-height:1.75rem}.md-lib-text-sm{font-size:.875rem;line-height:1.25rem}.md-lib-text-xl{font-size:1.25rem;line-height:1.75rem}.md-lib-text-xs{font-size:.75rem;line-height:1rem}.md-lib-font-bold{font-weight:700}.md-lib-font-medium{font-weight:500}.md-lib-font-semibold{font-weight:600}.md-lib-capitalize{text-transform:capitalize}.md-lib-leading-normal{line-height:1.5}.md-lib-leading-relaxed{line-height:1.625}.md-lib-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.md-lib-text-borderColor{color:var(--color-border,#9aa8bc33)}.md-lib-text-dangerColor{color:var(--color-danger,#e42131)}.md-lib-text-darkTextColor{--tw-text-opacity:1;color:rgb(238 238 238/var(--tw-text-opacity,1))}.md-lib-text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.md-lib-text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.md-lib-text-headingText{--tw-text-opacity:1;color:rgb(0 19 37/var(--tw-text-opacity,1))}.md-lib-text-imagesColor{--tw-text-opacity:1;color:rgb(251 137 81/var(--tw-text-opacity,1))}.md-lib-text-musicColor{--tw-text-opacity:1;color:rgb(95 140 230/var(--tw-text-opacity,1))}.md-lib-text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.md-lib-text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.md-lib-text-otherColor{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity,1))}.md-lib-text-primaryColor{color:var(--color-primary,#0b6d97)}.md-lib-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.md-lib-text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.md-lib-text-secondaryTextColor{--tw-text-opacity:1;color:rgb(114 129 151/var(--tw-text-opacity,1))}.md-lib-text-textColor{color:var(--color-text,#1a212b)}.md-lib-text-themeGreen{--tw-text-opacity:1;color:rgb(1 106 28/var(--tw-text-opacity,1))}.md-lib-text-videosColor{--tw-text-opacity:1;color:rgb(81 224 152/var(--tw-text-opacity,1))}.md-lib-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.md-lib-underline{text-decoration-line:underline}.md-lib-opacity-0{opacity:0}.md-lib-opacity-100{opacity:1}.\!md-lib-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.md-lib-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.md-lib-shadow-lg,.md-lib-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md-lib-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.md-lib-shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.md-lib-shadow-none,.md-lib-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md-lib-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.md-lib-outline-none{outline:2px solid #0000;outline-offset:2px}.md-lib-ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md-lib-ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgb(96 165 250/var(--tw-ring-opacity,1))}.md-lib-transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.md-lib-transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.md-lib-duration-300{transition-duration:.3s}.md-lib-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--foreground-rgb:0,0,0;--background-start-rgb:255,255,255;--background-end-rgb:255,255,255;--icon-color:#000;--table-bgcolor:#f8f9fa;--hover-color:#efeffe;--box-shadow-small:0px 4px 8px #090b1980;--theme-primary:#0b6d97;--text-color:#fff;--text-primary:#001325eb;--theme-primary-hover:#0b6d97cc;--theme-secondary:#eceff4;--arrrow-color:#fff;--border-color:#9aa8bc33;--shadow-color:hsla(0,0%,79%,.667);--theme-danger:#e42131;--theme-danger-hover:#e42131cc;--menu-arrow:#fff;--text-disabled:#00000040;--radio-btn:#c2c2c2;--bar-bg-color:#f5f5f5}.dark{--icon-color:#d5d8df!important;--table-bgcolor:#30324e!important;--hover-color:#3f4259!important;--box-shadow-small:0px 4px 8px #090b1980;--theme-primary:#181b34!important;--text-color:#d5d8df!important;--text-primary:#e5e6ea!important;--theme-secondary:#30324e!important;--theme-primary-hover:#212642!important;--foreground-rgb:255,255,255!important;--background-start-rgb:0,0,0!important;--background-end-rgb:0,0,0!important;--arrrow-color:#30324e!important;--border-color:#4b4e69!important;--shadow-color:rgba(33,33,33,.667);--menu-arrow:#212642!important;--text-disabled:#ffffff40!important;--radio-btn:#4b4e69!important;--bar-bg-color:#30324e!important}.ant-layout-sider-children{display:flex;flex-direction:column}body{background:rgb(var(--background-start-rgb));color:rgb(var(--foreground-rgb));font-family:Inter}.ant-form-item-label label{color:#728197!important;font-size:12px!important;font-style:normal;line-height:18px}.search-input{border-radius:100px;width:320px}.page-height{height:calc(100vh - 65px)!important}.ant-btn-dangerous{background-color:var(--theme-danger)!important}.description{--tw-text-opacity:1;color:rgb(0 19 37/var(--tw-text-opacity,1));font-size:.75rem;font-style:normal;font-weight:500;line-height:1rem;line-height:18px}.grid-radio-btns label{align-items:center;display:inline-flex;justify-content:center;width:6rem}.grid-radio-btns label:first-child{border-bottom-left-radius:9999px!important;border-top-left-radius:9999px!important}.grid-radio-btns label:last-child{border-bottom-right-radius:9999px!important;border-top-right-radius:9999px!important}*{box-sizing:border-box;margin:0;padding:0}.asset-management-page{max-height:calc(100vh - 115px);overflow-y:scroll;padding:10px 20px}.asset-management-page .asset-management-table .header{align-items:center;display:flex;margin-bottom:20px;margin-top:10px}.asset-management-page .asset-management-table .header .page-title{width:300px}.asset-management-page .asset-management-table .header .right-section{display:contents;margin-left:auto}.asset-management-page .asset-management-table .header .right-section .search-bar{margin-right:20px}.asset-management-page .asset-management-table .mobile-search-bar{display:none}.page-title.ant-typography{margin:0!important}.asset-management-table{margin-top:30px}.create-asset-page .form .metadata-field-container{align-items:center;display:flex;margin-bottom:10px;width:100%}.create-asset-page .form .metadata-field{background-color:#f5f5f5;border-radius:4px;padding:20px}.create-asset-page .form .metadata-field .ant-row{margin:0!important}.assetType-table .ant-table-content{min-height:calc(100vh - 210px)}.assetType-table .ant-table-footer .assetType-pagination{display:flex;justify-content:flex-end}.row-dragging{background:var(--color,#18bfcd);border:1px solid #f0f0f0;color:#fff}.asset-management-table .ant-table-container .ant-table-cell{width:50%}.is-dragging-over .row-dragging{background:var(--color,#18bfcd)}.asset-management-table .ant-table-container .ant-typography-ellipsis-single-line{max-width:400px}@media (max-width:767px){.asset-management-page .asset-management-table .header .right-section .search-bar{display:none}.asset-management-page .asset-management-table .mobile-search-bar{display:block;margin-bottom:10px}.asset-management-page .asset-management-table .header{margin-bottom:5px}.assetType-table .ant-table-content{min-height:calc(100vh - 235px)}.asset-management-table .ant-table-container .ant-typography-ellipsis-single-line{max-width:160px}}.create-asset-page .dam-loading{align-items:center;display:flex;height:calc(100vh - 200px);justify-content:center}.ant-typography{margin-bottom:0!important}.ant-btn-color-default{box-shadow:none!important}.ant-switch .ant-switch-inner{background-color:#9aa8bc33}.ant-btn-primary{color:#fff!important}.ant-btn-color-primary{box-shadow:none!important}.ant-tree-treenode{height:34px!important}.ant-tree .ant-tree-switcher .ant-tree-switcher-icon{vertical-align:-webkit-baseline-middle}.ant-tree .ant-tree-switcher{margin-inline-end:0!important}.ant-tree .ant-tree-switcher:before{height:33px!important}.ant-tree .ant-tree-node-content-wrapper{padding-left:0!important}.ant-tree .ant-tree-node-selected:hover{color:#eee!important}.tui-image-editor-header-logo{display:none!important}.ant-tree-treenode-draggable .ant-tree-draggable-icon{width:0!important}.ant-tree-list .ant-tree-treenode .ant-tree-title{font-size:14px!important;margin-left:0!important}.share-link-dropdown .ant-select-selection-wrap,.share-link-dropdown .ant-select-selection-wrap .ant-select-selection-item{height:100%}.last\:md-lib-border-0:last-child{border-width:0}.hover\:md-lib-border-black:hover{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.hover\:md-lib-border-primaryColor:hover{border-color:var(--color-primary,#0b6d97)}.hover\:md-lib-bg-black\/70:hover{background-color:#000000b3}.hover\:md-lib-bg-borderColor:hover{background-color:var(--color-border,#9aa8bc33)}.hover\:md-lib-bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:md-lib-bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:md-lib-bg-red-100:hover{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.hover\:md-lib-bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.hover\:md-lib-bg-secondaryColor:hover{background-color:var(--color-secondary,#eceff4)}.hover\:md-lib-bg-secondaryHoverColor:hover{--tw-bg-opacity:1;background-color:rgb(203 212 225/var(--tw-bg-opacity,1))}.hover\:md-lib-opacity-80:hover{opacity:.8}.hover\:md-lib-opacity-90:hover{opacity:.9}.focus\:md-lib-outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:md-lib-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:md-lib-ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.dark\:md-lib-border-darkBorderColor:is(.md-lib-dark *){--tw-border-opacity:1;border-color:rgb(75 78 105/var(--tw-border-opacity,1))}.dark\:md-lib-bg-darkBorderColor:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(75 78 105/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkPrimary:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(24 27 52/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkPrimaryBg:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(22 28 85/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkPrimaryHoverColor:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(33 38 66/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkSecondaryColor:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(48 50 78/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-darkSecondaryTextColor:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(150 153 166/var(--tw-bg-opacity,1))}.dark\:md-lib-bg-white\/20:is(.md-lib-dark *){background-color:#fff3}.dark\:md-lib-text-darkBorderColor:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(75 78 105/var(--tw-text-opacity,1))}.dark\:md-lib-text-darkSecondaryTextColor:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(150 153 166/var(--tw-text-opacity,1))}.dark\:md-lib-text-darkTextColor:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(238 238 238/var(--tw-text-opacity,1))}.dark\:md-lib-text-gray-400:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:md-lib-text-white:is(.md-lib-dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:hover\:md-lib-bg-darkSecondaryColor:hover:is(.md-lib-dark *){--tw-bg-opacity:1;background-color:rgb(48 50 78/var(--tw-bg-opacity,1))}.dark\:hover\:md-lib-bg-white\/30:hover:is(.md-lib-dark *){background-color:#ffffff4d}.hover\:dark\:md-lib-bg-darkPrimaryHoverColor:is(.md-lib-dark *):hover{--tw-bg-opacity:1;background-color:rgb(33 38 66/var(--tw-bg-opacity,1))}@media (min-width:640px){.sm\:md-lib-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\:md-lib-block{display:block}.md\:md-lib-w-\[720px\]{width:720px}.md\:md-lib-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:md-lib-grid-cols-\[auto\2c 1fr\]{grid-template-columns:auto 1fr}}@media (min-width:1024px){.lg\:md-lib-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:md-lib-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1280px){.xl\:md-lib-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:md-lib-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width:1536px){.\32xl\:md-lib-grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bindu-dashing/dam-solution-v2",
|
|
3
|
-
"version": "5.9.
|
|
3
|
+
"version": "5.9.232",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"@ant-design/icons": "^5.0.1",
|
|
6
6
|
"@emoji-mart/data": "^1.2.1",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"emoji-mart": "^5.6.0",
|
|
25
25
|
"lodash": "^4.17.21",
|
|
26
26
|
"moment-timezone": "^0.6.0",
|
|
27
|
+
"pdf-lib": "^1.17.1",
|
|
27
28
|
"pdfjs-dist": "^3.11.174",
|
|
28
29
|
"react-beautiful-dnd": "^13.1.1",
|
|
29
30
|
"react-dom": "^18.2.0",
|