@@ -77,6 +77,8 @@ export function HighlightBlock({
77
77
setShowCopyButton ( true ) ;
78
78
} , [ ] ) ;
79
79
80
+ const [ copied , setCopied ] = useState ( false ) ;
81
+
80
82
async function copyCodeOnClick ( ) {
81
83
if ( codeRef . current === null ) {
82
84
return ;
@@ -85,7 +87,10 @@ export function HighlightBlock({
85
87
const code = cleanCodeSnippet ( codeRef . current . innerText , { language} ) ;
86
88
87
89
try {
90
+ setCopied ( false ) ;
88
91
await navigator . clipboard . writeText ( code ) ;
92
+ setCopied ( true ) ;
93
+ setTimeout ( ( ) => setCopied ( false ) , 1200 ) ;
89
94
} catch ( error ) {
90
95
// eslint-disable-next-line no-console
91
96
console . error ( 'Failed to copy:' , error ) ;
@@ -95,8 +100,14 @@ export function HighlightBlock({
95
100
return (
96
101
< HighlightBlockContainer key = { `highlight-block-${ groupId } ` } >
97
102
< CodeLinesContainer ref = { codeRef } > { children } </ CodeLinesContainer >
98
- < ClipBoardContainer onClick = { copyCodeOnClick } >
99
- { showCopyButton && < Clipboard size = { 14 } opacity = { 70 } /> }
103
+ < ClipBoardContainer onClick = { copyCodeOnClick } className = ".clipboard" >
104
+ { showCopyButton && (
105
+ < Clipboard
106
+ size = { 16 }
107
+ opacity = { copied ? 1 : 0.15 }
108
+ stroke = { copied ? 'green' : 'white' }
109
+ />
110
+ ) }
100
111
</ ClipBoardContainer >
101
112
</ HighlightBlockContainer >
102
113
) ;
@@ -111,6 +122,14 @@ const HighlightBlockContainer = styled('div')`
111
122
min-width: 100%;
112
123
box-sizing: border-box;
113
124
background-color: rgba(239, 239, 239, 0.06);
125
+ position: relative;
126
+
127
+ :hover svg {
128
+ opacity: 1;
129
+ }
130
+ svg {
131
+ transition: all 150ms linear;
132
+ }
114
133
` ;
115
134
116
135
const CodeLinesContainer = styled ( 'div' ) `
@@ -119,16 +138,13 @@ const CodeLinesContainer = styled('div')`
119
138
` ;
120
139
121
140
const ClipBoardContainer = styled ( 'div' ) `
141
+ position: absolute;
142
+ right: 0;
143
+ top: 0;
144
+ bottom: 0;
122
145
width: 48px;
123
146
display: flex;
124
147
justify-content: center;
125
148
align-items: center;
126
149
cursor: pointer;
127
- :hover {
128
- background-color: rgba(239, 239, 239, 0.1);
129
- }
130
- :active {
131
- background-color: rgba(239, 239, 239, 0.15);
132
- }
133
- transition: background-color 150ms linear;
134
150
` ;
0 commit comments