From 4117de5fa58d62d88644b275ecb037cfa53a7ebd Mon Sep 17 00:00:00 2001 From: IZUMIRU Date: Sat, 4 Jan 2025 20:45:17 +0900 Subject: [PATCH] feat: Add copy to clipboard function --- src/components/ClassTable.js | 57 ++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/src/components/ClassTable.js b/src/components/ClassTable.js index 5efcfeca7..20f7a3ebb 100644 --- a/src/components/ClassTable.js +++ b/src/components/ClassTable.js @@ -3,6 +3,7 @@ import { isObject } from '@/utils/isObject' import { castArray } from '@/utils/castArray' import clsx from 'clsx' import { Heading } from '@/components/Heading' +import { Transition } from '@headlessui/react' function renderProperties( properties, @@ -69,6 +70,26 @@ export const ClassTable = memo( } }, [isCollapsed]) + const [transition, setTransition] = useState({ visible: false, top: 0 }); + + useEffect(() => { + if (transition.visible) { + const handle = window.setTimeout(() => { + setTransition({ visible: false }) + }, 1500) + return () => { + window.clearTimeout(handle) + } + } + }, [transition]) + + const handleCopyClick = (value, offsetTop) => { + navigator.clipboard.writeText(value).then(() => { + const adjustTop = 18 + setTransition({ visible: true, top: offsetTop + adjustTop }) + }); + }; + return (
{showHeading && ( @@ -89,7 +110,7 @@ export const ClassTable = memo( {custom ? ( custom() ) : ( - +
- + {sort(classes).map((utility, i) => { let selector = utility let properties = { ...utilities[selector] } @@ -136,11 +157,12 @@ export const ClassTable = memo( @@ -169,6 +191,35 @@ export const ClassTable = memo( ) })} + +
+
+ Copied + +
+
+
@@ -123,7 +144,7 @@ export const ClassTable = memo( )}
handleCopyClick(transformSelector(selector), offsetTop)} > {transformSelector(selector)}
)}