@@ -3,59 +3,95 @@ import { useState } from "react";
33import { SimpleTooltip } from "~/components/primitives/Tooltip" ;
44import { useCopy } from "~/hooks/useCopy" ;
55import { cn } from "~/utils/cn" ;
6+ import { Button } from "./Buttons" ;
67
78export function CopyableText ( {
89 value,
910 copyValue,
1011 className,
1112 asChild,
13+ variant,
1214} : {
1315 value : string ;
1416 copyValue ?: string ;
1517 className ?: string ;
1618 asChild ?: boolean ;
19+ variant ?: "icon-right" | "text-below" ;
1720} ) {
1821 const [ isHovered , setIsHovered ] = useState ( false ) ;
1922 const { copy, copied } = useCopy ( copyValue ?? value ) ;
2023
21- return (
22- < span
23- className = { cn ( "group relative inline-flex h-6 items-center" , className ) }
24- onMouseLeave = { ( ) => setIsHovered ( false ) }
25- >
26- < span onMouseEnter = { ( ) => setIsHovered ( true ) } > { value } </ span >
24+ const resolvedVariant = variant ?? "icon-right" ;
25+
26+ if ( resolvedVariant === "icon-right" ) {
27+ return (
2728 < span
28- onClick = { copy }
29- onMouseDown = { ( e ) => e . stopPropagation ( ) }
30- className = { cn (
31- "absolute -right-6 top-0 z-10 size-6 font-sans" ,
32- isHovered ? "flex" : "hidden"
33- ) }
29+ className = { cn ( "group relative inline-flex h-6 items-center" , className ) }
30+ onMouseLeave = { ( ) => setIsHovered ( false ) }
3431 >
35- < SimpleTooltip
36- button = {
37- < span
38- className = { cn (
39- "ml-1 flex size-6 items-center justify-center rounded border border-charcoal-650 bg-charcoal-750" ,
40- asChild && "p-1" ,
41- copied
42- ? "text-green-500"
43- : "text-text-dimmed hover:border-charcoal-600 hover:bg-charcoal-700 hover:text-text-bright"
44- ) }
45- >
46- { copied ? (
47- < ClipboardCheckIcon className = "size-3.5" />
48- ) : (
49- < ClipboardIcon className = "size-3.5" />
50- ) }
51- </ span >
52- }
53- content = { copied ? "Copied!" : "Copy" }
54- className = "font-sans"
55- disableHoverableContent
56- asChild = { asChild }
57- />
32+ < span onMouseEnter = { ( ) => setIsHovered ( true ) } > { value } </ span >
33+ < span
34+ onClick = { copy }
35+ onMouseDown = { ( e ) => e . stopPropagation ( ) }
36+ className = { cn (
37+ "absolute -right-6 top-0 z-10 size-6 font-sans" ,
38+ isHovered ? "flex" : "hidden"
39+ ) }
40+ >
41+ < SimpleTooltip
42+ button = {
43+ < span
44+ className = { cn (
45+ "ml-1 flex size-6 items-center justify-center rounded border border-charcoal-650 bg-charcoal-750" ,
46+ asChild && "p-1" ,
47+ copied
48+ ? "text-green-500"
49+ : "text-text-dimmed hover:border-charcoal-600 hover:bg-charcoal-700 hover:text-text-bright"
50+ ) }
51+ >
52+ { copied ? (
53+ < ClipboardCheckIcon className = "size-3.5" />
54+ ) : (
55+ < ClipboardIcon className = "size-3.5" />
56+ ) }
57+ </ span >
58+ }
59+ content = { copied ? "Copied!" : "Copy" }
60+ className = "font-sans"
61+ disableHoverableContent
62+ asChild = { asChild }
63+ />
64+ </ span >
5865 </ span >
59- </ span >
60- ) ;
66+ ) ;
67+ }
68+
69+ if ( resolvedVariant === "text-below" ) {
70+ return (
71+ < SimpleTooltip
72+ button = {
73+ < Button
74+ variant = "minimal/small"
75+ onClick = { ( e ) => {
76+ e . stopPropagation ( ) ;
77+ copy ( ) ;
78+ } }
79+ className = { cn (
80+ "cursor-pointer bg-transparent py-0 px-1 text-left text-text-bright transition-colors hover:text-white hover:bg-transparent" ,
81+ className
82+ ) }
83+ >
84+ < span > { value } </ span >
85+ </ Button >
86+ }
87+ content = { copied ? "Copied" : "Click to copy" }
88+ className = "font-sans px-2 py-1"
89+ disableHoverableContent
90+ open = { isHovered || copied }
91+ onOpenChange = { setIsHovered }
92+ />
93+ ) ;
94+ }
95+
96+ return null ;
6197}
0 commit comments