From 6ec259a0e71174651bae95d4628138bf6fd68742 Mon Sep 17 00:00:00 2001 From: kj_sh604 Date: Sun, 15 Mar 2026 16:19:35 -0400 Subject: refactor: packages/ --- packages/excalidraw/components/LibraryUnit.tsx | 108 +++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 packages/excalidraw/components/LibraryUnit.tsx (limited to 'packages/excalidraw/components/LibraryUnit.tsx') diff --git a/packages/excalidraw/components/LibraryUnit.tsx b/packages/excalidraw/components/LibraryUnit.tsx new file mode 100644 index 0000000..71e1a00 --- /dev/null +++ b/packages/excalidraw/components/LibraryUnit.tsx @@ -0,0 +1,108 @@ +import clsx from "clsx"; +import { memo, useEffect, useRef, useState } from "react"; +import { useDevice } from "./App"; +import type { LibraryItem } from "../types"; +import "./LibraryUnit.scss"; +import { CheckboxItem } from "./CheckboxItem"; +import { PlusIcon } from "./icons"; +import type { SvgCache } from "../hooks/useLibraryItemSvg"; +import { useLibraryItemSvg } from "../hooks/useLibraryItemSvg"; + +export const LibraryUnit = memo( + ({ + id, + elements, + isPending, + onClick, + selected, + onToggle, + onDrag, + svgCache, + }: { + id: LibraryItem["id"] | /** for pending item */ null; + elements?: LibraryItem["elements"]; + isPending?: boolean; + onClick: (id: LibraryItem["id"] | null) => void; + selected: boolean; + onToggle: (id: string, event: React.MouseEvent) => void; + onDrag: (id: string, event: React.DragEvent) => void; + svgCache: SvgCache; + }) => { + const ref = useRef(null); + const svg = useLibraryItemSvg(id, elements, svgCache); + + useEffect(() => { + const node = ref.current; + + if (!node) { + return; + } + + if (svg) { + node.innerHTML = svg.outerHTML; + } + + return () => { + node.innerHTML = ""; + }; + }, [svg]); + + const [isHovered, setIsHovered] = useState(false); + const isMobile = useDevice().editor.isMobile; + const adder = isPending && ( +
{PlusIcon}
+ ); + + return ( +
setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > +
{ + if (id && event.shiftKey) { + onToggle(id, event); + } else { + onClick(id); + } + } + : undefined + } + onDragStart={(event) => { + if (!id) { + event.preventDefault(); + return; + } + setIsHovered(false); + onDrag(id, event); + }} + /> + {adder} + {id && elements && (isHovered || isMobile || selected) && ( + onToggle(id, event)} + className="library-unit__checkbox" + /> + )} +
+ ); + }, +); + +export const EmptyLibraryUnit = () => ( +
+); -- cgit v1.2.3