Skip to content

Commit 5cb0a96

Browse files
authored
Added Copy component (#499)
1 parent 0a97910 commit 5cb0a96

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

docs/app/docs/first-steps/installation/page.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Text from "@radui/ui/Text"
44
import Heading from "@radui/ui/Heading"
55
import Link from "@radui/ui/Link"
66
import Code from "@radui/ui/Code"
7+
import Copy from "@/components/Copy"
78

89

910
const PAGE_NAME = 'INSTALLATION'
@@ -23,12 +24,12 @@ const Introduction = () => {
2324
</Text>
2425

2526
<Text className="mt-4 mb-1 font-medium">Using Yarn</Text>
26-
<Code>
27-
yarn add @radui/ui
27+
<Code >
28+
<Copy>yarn add @radui/ui</Copy>
2829
</Code>
2930
<Text className="mt-4 mb-1 font-medium">Using npm</Text>
3031
<Code>
31-
npm install @radui/ui --save
32+
<Copy>npm install @radui/ui --save</Copy>
3233
</Code>
3334
</Documentation.Section>
3435
</Documentation>

docs/components/Copy.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"use client";
2+
import { useState,useEffect } from "react"
3+
4+
5+
function Copy({ children }) {
6+
const [isCopied, setIsCopied] = useState(false)
7+
8+
const handleCopy = () => {
9+
navigator.clipboard.writeText(children)
10+
setIsCopied(true)
11+
12+
}
13+
14+
useEffect(() => {
15+
let timeout;
16+
if (isCopied) {
17+
timeout = setTimeout(() => {
18+
setIsCopied(false);
19+
}, 2000);
20+
}
21+
return () => clearTimeout(timeout);
22+
}, [isCopied]);
23+
24+
const TickIcon = () => {
25+
return <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
26+
};
27+
28+
const CopyIcon = () => {
29+
return <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 9.50006C1 10.3285 1.67157 11.0001 2.5 11.0001H4L4 10.0001H2.5C2.22386 10.0001 2 9.7762 2 9.50006L2 2.50006C2 2.22392 2.22386 2.00006 2.5 2.00006L9.5 2.00006C9.77614 2.00006 10 2.22392 10 2.50006V4.00002H5.5C4.67158 4.00002 4 4.67159 4 5.50002V12.5C4 13.3284 4.67158 14 5.5 14H12.5C13.3284 14 14 13.3284 14 12.5V5.50002C14 4.67159 13.3284 4.00002 12.5 4.00002H11V2.50006C11 1.67163 10.3284 1.00006 9.5 1.00006H2.5C1.67157 1.00006 1 1.67163 1 2.50006V9.50006ZM5 5.50002C5 5.22388 5.22386 5.00002 5.5 5.00002H12.5C12.7761 5.00002 13 5.22388 13 5.50002V12.5C13 12.7762 12.7761 13 12.5 13H5.5C5.22386 13 5 12.7762 5 12.5V5.50002Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
30+
}
31+
32+
return(
33+
<span className = "flex items-center">
34+
{children}
35+
<button
36+
onClick={handleCopy}
37+
className=" m-0.5 mr-0 ml-2 px-1.5 py-1.5 border border-blue-500 text-sm font-bold rounded text-blue ;">
38+
{isCopied ? <TickIcon /> : <CopyIcon />}
39+
</button>
40+
</span>
41+
42+
)
43+
}
44+
45+
export default Copy

0 commit comments

Comments
 (0)