diff --git a/apps/app/components/command-palette/index.tsx b/apps/app/components/command-palette/index.tsx index c4deb7d5b..9e6dfc860 100644 --- a/apps/app/components/command-palette/index.tsx +++ b/apps/app/components/command-palette/index.tsx @@ -97,32 +97,38 @@ const CommandPalette: React.FC = () => { const handleKeyDown = useCallback( (e: KeyboardEvent) => { - if ((e.ctrlKey || e.metaKey) && e.key === "/") { - e.preventDefault(); - setIsPaletteOpen(true); - } else if ((e.ctrlKey || e.metaKey) && e.key === "i") { - e.preventDefault(); - setIsIssueModalOpen(true); - } else if ((e.ctrlKey || e.metaKey) && e.key === "p") { - e.preventDefault(); - setIsProjectModalOpen(true); - } else if ((e.ctrlKey || e.metaKey) && e.key === "b") { - e.preventDefault(); - toggleCollapsed(); - } else if ((e.ctrlKey || e.metaKey) && e.key === "h") { - e.preventDefault(); - setIsShortcutsModalOpen(true); - } else if ((e.ctrlKey || e.metaKey) && e.key === "q") { - e.preventDefault(); - setIsCreateCycleModalOpen(true); - } else if ((e.ctrlKey || e.metaKey) && e.key === "m") { - e.preventDefault(); - setIsCreateModuleModalOpen(true); - } else if ((e.ctrlKey || e.metaKey) && e.key === "d") { - e.preventDefault(); - setIsBulkDeleteIssuesModalOpen(true); - } else if ((e.ctrlKey || e.metaKey) && e.altKey && e.key === "c") { - e.preventDefault(); + if ( + !(e.target instanceof HTMLTextAreaElement) && + !(e.target instanceof HTMLInputElement) && + !(e.target as Element).classList?.contains("remirror-editor") + ) { + if ((e.ctrlKey || e.metaKey) && e.key === "k") { + e.preventDefault(); + setIsPaletteOpen(true); + } else if (e.key === "c") { + e.preventDefault(); + setIsIssueModalOpen(true); + } else if (e.key === "p") { + e.preventDefault(); + setIsProjectModalOpen(true); + } else if ((e.ctrlKey || e.metaKey) && e.key === "b") { + e.preventDefault(); + toggleCollapsed(); + } else if (e.key === "h") { + e.preventDefault(); + setIsShortcutsModalOpen(true); + } else if (e.key === "q") { + e.preventDefault(); + setIsCreateCycleModalOpen(true); + } else if (e.key === "m") { + e.preventDefault(); + setIsCreateModuleModalOpen(true); + } else if (e.key === "Delete") { + e.preventDefault(); + setIsBulkDeleteIssuesModalOpen(true); + } else if ((e.ctrlKey || e.metaKey) && e.altKey && e.key === "c") { + e.preventDefault(); + } if (!router.query.issueId) return; diff --git a/apps/app/components/command-palette/shortcuts.tsx b/apps/app/components/command-palette/shortcuts.tsx index 39dc7bcff..d073b7076 100644 --- a/apps/app/components/command-palette/shortcuts.tsx +++ b/apps/app/components/command-palette/shortcuts.tsx @@ -15,7 +15,7 @@ const shortcuts = [ { title: "Navigation", shortcuts: [ - { keys: "ctrl,/", description: "To open navigator" }, + { keys: "ctrl,cmd,k", description: "To open navigator" }, { keys: "↑", description: "Move up" }, { keys: "↓", description: "Move down" }, { keys: "←", description: "Move left" }, @@ -27,14 +27,14 @@ const shortcuts = [ { title: "Common", shortcuts: [ - { keys: "ctrl,p", description: "To create project" }, - { keys: "ctrl,i", description: "To create issue" }, - { keys: "ctrl,q", description: "To create cycle" }, - { keys: "ctrl,m", description: "To create module" }, - { keys: "ctrl,d", description: "To bulk delete issues" }, - { keys: "ctrl,h", description: "To open shortcuts guide" }, + { keys: "p", description: "To create project" }, + { keys: "c", description: "To create issue" }, + { keys: "q", description: "To create cycle" }, + { keys: "m", description: "To create module" }, + { keys: "Delete", description: "To bulk delete issues" }, + { keys: "h", description: "To open shortcuts guide" }, { - keys: "ctrl,alt,c", + keys: "ctrl,cmd,alt,c", description: "To copy issue url when on issue detail page.", }, ], diff --git a/apps/app/components/common/bulk-delete-issues-modal.tsx b/apps/app/components/common/bulk-delete-issues-modal.tsx index e46f7eea8..8b8125b48 100644 --- a/apps/app/components/common/bulk-delete-issues-modal.tsx +++ b/apps/app/components/common/bulk-delete-issues-modal.tsx @@ -214,10 +214,7 @@ const BulkDeleteIssuesModal: React.FC = ({ isOpen, setIsOpen }) => {

No issues found. Create a new issue with{" "} -
-                            Ctrl/Command + I
-                          
- . +
C
.

)} diff --git a/apps/app/components/common/existing-issues-list-modal.tsx b/apps/app/components/common/existing-issues-list-modal.tsx index c87508e55..5179facd4 100644 --- a/apps/app/components/common/existing-issues-list-modal.tsx +++ b/apps/app/components/common/existing-issues-list-modal.tsx @@ -189,10 +189,7 @@ const ExistingIssuesListModal: React.FC = ({

No issues found. Create a new issue with{" "} -
-                                  Ctrl/Command + I
-                                
- . +
C
.

)} diff --git a/apps/app/components/issues/description-form.tsx b/apps/app/components/issues/description-form.tsx index 441efedc5..4a484d819 100644 --- a/apps/app/components/issues/description-form.tsx +++ b/apps/app/components/issues/description-form.tsx @@ -1,4 +1,4 @@ -import { FC, useEffect, useState } from "react"; +import { FC, useEffect, useRef, useState } from "react"; import dynamic from "next/dynamic"; // types import { IIssue } from "types"; @@ -33,10 +33,10 @@ export const IssueDescriptionForm: FC = ({ issue, handleSubmi // description: issue?.description, // description_html: issue?.description_html, // }); - const [issueName, setIssueName] = useState(issue?.name); const [issueDescription, setIssueDescription] = useState(issue?.description); const [issueDescriptionHTML, setIssueDescriptionHTML] = useState(issue?.description_html); + const textareaRef = useRef(null); // hooks const formValues = useDebounce( @@ -50,24 +50,34 @@ export const IssueDescriptionForm: FC = ({ issue, handleSubmi // eslint-disable-next-line react-hooks/exhaustive-deps }, [handleSubmit, stringFromValues]); + useEffect(() => { + if (textareaRef && textareaRef.current) { + textareaRef.current.style.height = "0px"; + const scrollHeight = textareaRef.current.scrollHeight; + textareaRef.current.style.height = scrollHeight + "px"; + } + }, [issueName]); + return (
- setIssueName(e.target.value)} - mode="transparent" - className="text-xl font-medium" + ref={textareaRef} + rows={1} + onChange={(e: React.ChangeEvent) => setIssueName(e.target.value)} required={true} + className="no-scrollbar w-full px-3 py-2 outline-none rounded border-none bg-transparent ring-0 transition-all focus:ring-1 focus:ring-theme text-xl font-medium resize-none" /> + setIssueDescription(json)} onHTMLChange={(html) => setIssueDescriptionHTML(html)} + customClassName="min-h-[150px]" />
); diff --git a/apps/app/components/project/cycles/board-view/index.tsx b/apps/app/components/project/cycles/board-view/index.tsx index a87642f30..ee37b9c75 100644 --- a/apps/app/components/project/cycles/board-view/index.tsx +++ b/apps/app/components/project/cycles/board-view/index.tsx @@ -126,7 +126,7 @@ const CyclesBoardView: React.FC = ({ return ( <> {groupedByIssues ? ( -
+
diff --git a/apps/app/components/project/cycles/cycle-detail-sidebar/index.tsx b/apps/app/components/project/cycles/cycle-detail-sidebar/index.tsx index 08ef636dd..3fa73c913 100644 --- a/apps/app/components/project/cycles/cycle-detail-sidebar/index.tsx +++ b/apps/app/components/project/cycles/cycle-detail-sidebar/index.tsx @@ -14,6 +14,9 @@ import cyclesService from "services/cycles.service"; import useToast from "hooks/use-toast"; // ui import { Loader } from "components/ui"; +//progress-bar +import { CircularProgressbar } from "react-circular-progressbar"; +import "react-circular-progressbar/dist/styles.css"; // helpers import { copyTextToClipboard } from "helpers/string.helper"; import { groupBy } from "helpers/array.helper"; @@ -135,7 +138,13 @@ const CycleDetailSidebar: React.FC = ({ cycle, isOpen, cycleIssues }) =>
- + + +
{groupedIssues.completed.length}/{cycleIssues?.length}
diff --git a/apps/app/components/project/cycles/stats-view/index.tsx b/apps/app/components/project/cycles/stats-view/index.tsx index 4c7ea59ba..58f316464 100644 --- a/apps/app/components/project/cycles/stats-view/index.tsx +++ b/apps/app/components/project/cycles/stats-view/index.tsx @@ -64,7 +64,7 @@ const CycleStatsView: React.FC = ({ )}

No {type} {type === "current" ? "cycle" : "cycles"} yet. Create with{" "} -
Ctrl/Command + Q
. +
Q
.

)} diff --git a/apps/app/components/project/issues/BoardView/index.tsx b/apps/app/components/project/issues/BoardView/index.tsx index 71d5b3f3d..a2f9c04d2 100644 --- a/apps/app/components/project/issues/BoardView/index.tsx +++ b/apps/app/components/project/issues/BoardView/index.tsx @@ -200,7 +200,7 @@ const BoardView: React.FC = ({ issues, handleDeleteIssue, userAuth }) => }} /> {groupedByIssues ? ( -
+
diff --git a/apps/app/components/project/issues/issue-detail/issue-detail-sidebar/select-blocked.tsx b/apps/app/components/project/issues/issue-detail/issue-detail-sidebar/select-blocked.tsx index 02a3fa299..1c5822e7e 100644 --- a/apps/app/components/project/issues/issue-detail/issue-detail-sidebar/select-blocked.tsx +++ b/apps/app/components/project/issues/issue-detail/issue-detail-sidebar/select-blocked.tsx @@ -259,10 +259,7 @@ const SelectBlocked: React.FC = ({ submitChanges, issuesList, watch }) =>

No issues found. Create a new issue with{" "} -
-                                Ctrl/Command + I
-                              
- . +
C
.

)} diff --git a/apps/app/components/project/issues/issue-detail/issue-detail-sidebar/select-blocker.tsx b/apps/app/components/project/issues/issue-detail/issue-detail-sidebar/select-blocker.tsx index 9df9e8266..e2cb85e6f 100644 --- a/apps/app/components/project/issues/issue-detail/issue-detail-sidebar/select-blocker.tsx +++ b/apps/app/components/project/issues/issue-detail/issue-detail-sidebar/select-blocker.tsx @@ -258,10 +258,7 @@ const SelectBlocker: React.FC = ({ submitChanges, issuesList, watch }) =>

No issues found. Create a new issue with{" "} -
-                              Ctrl/Command + I
-                            
- . +
C
.

)} diff --git a/apps/app/components/project/issues/issues-list-modal.tsx b/apps/app/components/project/issues/issues-list-modal.tsx index c453b1fea..9c56d6406 100644 --- a/apps/app/components/project/issues/issues-list-modal.tsx +++ b/apps/app/components/project/issues/issues-list-modal.tsx @@ -212,10 +212,7 @@ const IssuesListModal: React.FC = ({

No issues found. Create a new issue with{" "} -
-                              Ctrl/Command + I
-                            
- . +
C
.

)} diff --git a/apps/app/components/project/modules/board-view/index.tsx b/apps/app/components/project/modules/board-view/index.tsx index a8cc1644e..4951f80af 100644 --- a/apps/app/components/project/modules/board-view/index.tsx +++ b/apps/app/components/project/modules/board-view/index.tsx @@ -129,7 +129,7 @@ const ModulesBoardView: React.FC = ({ return ( <> {groupedByIssues ? ( -
+
diff --git a/apps/app/components/project/modules/module-detail-sidebar/index.tsx b/apps/app/components/project/modules/module-detail-sidebar/index.tsx index 0c29f9936..a58816f6a 100644 --- a/apps/app/components/project/modules/module-detail-sidebar/index.tsx +++ b/apps/app/components/project/modules/module-detail-sidebar/index.tsx @@ -22,6 +22,9 @@ import SelectLead from "components/project/modules/module-detail-sidebar/select- import SelectMembers from "components/project/modules/module-detail-sidebar/select-members"; import SelectStatus from "components/project/modules/module-detail-sidebar/select-status"; import ModuleLinkModal from "components/project/modules/module-link-modal"; +//progress-bar +import { CircularProgressbar } from "react-circular-progressbar"; +import "react-circular-progressbar/dist/styles.css"; // ui import { Loader } from "components/ui"; // icons @@ -161,7 +164,13 @@ const ModuleDetailSidebar: React.FC = ({
- + + +
{groupedIssues.completed.length}/{moduleIssues?.length}
diff --git a/apps/app/components/project/modules/single-module-card.tsx b/apps/app/components/project/modules/single-module-card.tsx index ec151f242..7af928b6a 100644 --- a/apps/app/components/project/modules/single-module-card.tsx +++ b/apps/app/components/project/modules/single-module-card.tsx @@ -1,14 +1,15 @@ -import React from "react"; +import React, { useState } from "react"; import Link from "next/link"; import Image from "next/image"; import { useRouter } from "next/router"; +import { CalendarDaysIcon, TrashIcon } from "@heroicons/react/24/outline"; +import ConfirmModuleDeletion from "./confirm-module-deletion"; // icons -import { CalendarDaysIcon } from "@heroicons/react/24/outline"; import User from "public/user.png"; // helpers import { renderShortNumericDateFormat } from "helpers/date-time.helper"; // types -import { IModule } from "types"; +import { IModule, SelectModuleType } from "types"; // common import { MODULE_STATUS } from "constants/"; @@ -19,103 +20,131 @@ type Props = { const SingleModuleCard: React.FC = ({ module }) => { const router = useRouter(); const { workspaceSlug } = router.query; + const [moduleDeleteModal, setModuleDeleteModal] = useState(false); + const [selectedModuleForDelete, setSelectedModuleForDelete] = useState(); + const handleDeleteModule = () => { + if (!module) return; + + setSelectedModuleForDelete({ ...module, actionType: "delete" }); + setModuleDeleteModal(true); + }; return ( - - - {module.name} -
-
-
LEAD
-
- {module.lead ? ( - module.lead_detail?.avatar && module.lead_detail.avatar !== "" ? ( -
+
+
+ +
+ + +
+ {module.name} +
+
+
LEAD
+
+ {module.lead ? ( + module.lead_detail?.avatar && module.lead_detail.avatar !== "" ? ( +
+ {module.lead_detail.first_name} +
+ ) : ( +
+ {module.lead_detail?.first_name && module.lead_detail.first_name !== "" + ? module.lead_detail.first_name.charAt(0) + : module.lead_detail?.email.charAt(0)} +
+ ) + ) : ( + "N/A" + )} +
+
+
+
MEMBERS
+
+ {module.members && module.members.length > 0 ? ( + module?.members_detail?.map((member, index: number) => ( +
+ {member?.avatar && member.avatar !== "" ? ( +
+ {member?.first_name} +
+ ) : ( +
+ {member?.first_name && member.first_name !== "" + ? member.first_name.charAt(0) + : member?.email?.charAt(0)} +
+ )} +
+ )) + ) : ( +
{module.lead_detail.first_name}
- ) : ( -
- {module.lead_detail?.first_name && module.lead_detail.first_name !== "" - ? module.lead_detail.first_name.charAt(0) - : module.lead_detail?.email.charAt(0)} -
- ) - ) : ( - "N/A" - )} + )} +
+
+
+
END DATE
+
+ + {renderShortNumericDateFormat(module.target_date ?? "")} +
+
+
+
STATUS
+
+ s.value === module.status)?.color, + }} + /> + {module.status} +
-
-
MEMBERS
-
- {module.members && module.members.length > 0 ? ( - module?.members_detail?.map((member, index: number) => ( -
- {member?.avatar && member.avatar !== "" ? ( -
- {member?.first_name} -
- ) : ( -
- {member?.first_name && member.first_name !== "" - ? member.first_name.charAt(0) - : member?.email?.charAt(0)} -
- )} -
- )) - ) : ( -
- No user -
- )} -
-
-
-
END DATE
-
- - {renderShortNumericDateFormat(module.target_date ?? "")} -
-
-
-
STATUS
-
- s.value === module.status)?.color, - }} - /> - {module.status} -
-
-
- - + + +
); }; diff --git a/apps/app/components/rich-text-editor/index.tsx b/apps/app/components/rich-text-editor/index.tsx index cb3796c83..2bddfe5f6 100644 --- a/apps/app/components/rich-text-editor/index.tsx +++ b/apps/app/components/rich-text-editor/index.tsx @@ -47,6 +47,7 @@ export interface IRemirrorRichTextEditor { value?: any; showToolbar?: boolean; editable?: boolean; + customClassName?: string; } const RemirrorRichTextEditor: FC = (props) => { @@ -60,6 +61,7 @@ const RemirrorRichTextEditor: FC = (props) => { value = "", showToolbar = true, editable = true, + customClassName, } = props; const [imageLoader, setImageLoader] = useState(false); @@ -173,7 +175,7 @@ const RemirrorRichTextEditor: FC = (props) => { { onBlur(jsonValue, htmlValue); diff --git a/apps/app/components/workspace/help-section.tsx b/apps/app/components/workspace/help-section.tsx index dbb422998..2122b37e7 100644 --- a/apps/app/components/workspace/help-section.tsx +++ b/apps/app/components/workspace/help-section.tsx @@ -132,7 +132,7 @@ export const WorkspaceHelpSection: FC = (props) => { title="Help" > - {!sidebarCollapse && Need help?} + {!sidebarCollapse && Help ?}
diff --git a/apps/app/layouts/navbar/main-sidebar.tsx b/apps/app/layouts/navbar/main-sidebar.tsx index 834c3f58c..4afddbe90 100644 --- a/apps/app/layouts/navbar/main-sidebar.tsx +++ b/apps/app/layouts/navbar/main-sidebar.tsx @@ -173,7 +173,7 @@ const Sidebar: React.FC = ({ toggleSidebar, setToggleSidebar }) => { title="Help" > - {!sidebarCollapse && Need help?} + {!sidebarCollapse && Help ?}
diff --git a/apps/app/package.json b/apps/app/package.json index 5051a01e3..b93c298df 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -21,6 +21,7 @@ "next-pwa": "^5.6.0", "react": "18.2.0", "react-beautiful-dnd": "^13.1.1", + "react-circular-progressbar": "^2.1.0", "react-color": "^2.19.3", "react-dom": "18.2.0", "react-dropzone": "^14.2.3", diff --git a/apps/app/pages/[workspaceSlug]/index.tsx b/apps/app/pages/[workspaceSlug]/index.tsx index 17abe8e77..4ce65369b 100644 --- a/apps/app/pages/[workspaceSlug]/index.tsx +++ b/apps/app/pages/[workspaceSlug]/index.tsx @@ -164,8 +164,7 @@ const WorkspacePage: NextPage = () => {

No issues found. Create a new issue with{" "} -
Ctrl/Command + I
- . +
C
.

) diff --git a/apps/app/pages/[workspaceSlug]/me/my-issues.tsx b/apps/app/pages/[workspaceSlug]/me/my-issues.tsx index a1638ed9b..4c47a47bd 100644 --- a/apps/app/pages/[workspaceSlug]/me/my-issues.tsx +++ b/apps/app/pages/[workspaceSlug]/me/my-issues.tsx @@ -163,9 +163,8 @@ const MyIssuesPage: NextPage = () => { title="Create a new issue" description={ - Use{" "} -
Ctrl/Command + I
{" "} - shortcut to create a new issue + Use
C
shortcut + to create a new issue
} Icon={PlusIcon} diff --git a/apps/app/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx b/apps/app/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx index 269792f1b..029a1d785 100644 --- a/apps/app/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx +++ b/apps/app/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx @@ -178,8 +178,8 @@ const ProjectCycles: NextPage = () => { title="Create a new cycle" description={ - Use
Ctrl/Command + Q
{" "} - shortcut to create a new cycle + Use
Q
shortcut to + create a new cycle
} Icon={PlusIcon} diff --git a/apps/app/pages/[workspaceSlug]/projects/[projectId]/issues/index.tsx b/apps/app/pages/[workspaceSlug]/projects/[projectId]/issues/index.tsx index 4348ebb63..0bfc2e299 100644 --- a/apps/app/pages/[workspaceSlug]/projects/[projectId]/issues/index.tsx +++ b/apps/app/pages/[workspaceSlug]/projects/[projectId]/issues/index.tsx @@ -133,8 +133,8 @@ const ProjectIssues: NextPage = (props) => { title="Create a new issue" description={ - Use
Ctrl/Command + I
{" "} - shortcut to create a new issue + Use
C
shortcut to + create a new issue
} Icon={PlusIcon} diff --git a/apps/app/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx b/apps/app/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx index 8aa1056c6..25b2bdddb 100644 --- a/apps/app/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx +++ b/apps/app/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx @@ -86,8 +86,8 @@ const ProjectModules: NextPage = () => { title="Create a new module" description={ - Use
Ctrl/Command + M
{" "} - shortcut to create a new module + Use
M
shortcut to + create a new module
} Icon={PlusIcon} diff --git a/apps/app/pages/[workspaceSlug]/projects/index.tsx b/apps/app/pages/[workspaceSlug]/projects/index.tsx index 700bffd5a..8164d4155 100644 --- a/apps/app/pages/[workspaceSlug]/projects/index.tsx +++ b/apps/app/pages/[workspaceSlug]/projects/index.tsx @@ -88,9 +88,8 @@ const ProjectsPage: NextPage = () => { title="Create a new project" description={ - Use{" "} -
Ctrl/Command + P
{" "} - shortcut to create a new project + Use
P
shortcut to + create a new project
} Icon={PlusIcon} diff --git a/apps/app/styles/editor.css b/apps/app/styles/editor.css index 45deb0dc6..07fcec355 100644 --- a/apps/app/styles/editor.css +++ b/apps/app/styles/editor.css @@ -354,10 +354,6 @@ img.ProseMirror-separator { margin-bottom: 1em; } -.remirror-editor-wrapper .remirror-editor { - min-height: 150px; -} - .issue-comments-section .remirror-editor-wrapper .remirror-editor { min-height: 50px; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3cee54a85..3095d80ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,6 +40,7 @@ importers: postcss: ^8.4.14 react: 18.2.0 react-beautiful-dnd: ^13.1.1 + react-circular-progressbar: ^2.1.0 react-color: ^2.19.3 react-dom: 18.2.0 react-dropzone: ^14.2.3 @@ -63,6 +64,7 @@ importers: next-pwa: 5.6.0_next@12.3.2 react: 18.2.0 react-beautiful-dnd: 13.1.1_biqbaboplfbrettd7655fr4n2y + react-circular-progressbar: 2.1.0_react@18.2.0 react-color: 2.19.3_react@18.2.0 react-dom: 18.2.0_react@18.2.0 react-dropzone: 14.2.3_react@18.2.0 @@ -8326,6 +8328,14 @@ packages: - react-native dev: false + /react-circular-progressbar/2.1.0_react@18.2.0: + resolution: {integrity: sha512-xp4THTrod4aLpGy68FX/k1Q3nzrfHUjUe5v6FsdwXBl3YVMwgeXYQKDrku7n/D6qsJA9CuunarAboC2xCiKs1g==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /react-color/2.19.3_react@18.2.0: resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==} peerDependencies: