@@ -5,27 +5,55 @@ import {
5
5
ElementRef ,
6
6
inject ,
7
7
input ,
8
+ signal ,
8
9
viewChild ,
9
10
} from '@angular/core' ;
10
11
11
12
import { ISnippet } from '../services/snippet' ;
12
13
import { CodeHighlightService } from '../services/code-highlight.service' ;
14
+ import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap' ;
13
15
14
16
@Component ( {
15
17
selector : 'ngbd-code' ,
16
18
changeDetection : ChangeDetectionStrategy . OnPush ,
19
+ imports : [ NgbTooltip ] ,
17
20
template : `
18
- <pre class="language-{{ snippet().lang }}"><code #code class="language-{{ snippet().lang }}"></code></pre>
21
+ <div class="position-relative">
22
+ <button
23
+ (click)="copyToClipboard()"
24
+ [ngbTooltip]="showAsCopied() ? 'Copied!' : 'Copy to clipboard'"
25
+ class="btn btn-clipboard position-absolute top-0 end-0 mt-2 me-3 z-2"
26
+ aria-label="Copy code to clipboard"
27
+ >
28
+ <i class="bi bi-{{ showAsCopied() ? 'clipboard-check' : 'clipboard' }}"></i>
29
+ </button>
30
+ <pre class="language-{{ snippet().lang }}"><code #code class="language-{{ snippet().lang }}"></code></pre>
31
+ </div>
19
32
` ,
20
33
} )
21
34
export class CodeComponent {
35
+ private _copyBtnTooltip = viewChild . required ( NgbTooltip ) ;
22
36
private _codeEl = viewChild . required ( 'code' , { read : ElementRef } ) ;
23
37
snippet = input . required < ISnippet > ( ) ;
24
38
39
+ showAsCopied = signal ( false ) ;
40
+
25
41
constructor ( ) {
26
42
const highlightService = inject ( CodeHighlightService ) ;
27
43
afterNextRender ( ( ) => {
28
44
this . _codeEl ( ) . nativeElement . innerHTML = highlightService . highlight ( this . snippet ( ) . code , this . snippet ( ) . lang ) ;
29
45
} ) ;
30
46
}
47
+
48
+ copyToClipboard ( ) {
49
+ navigator . clipboard . writeText ( this . snippet ( ) . code ) . then ( ( ) => {
50
+ this . showAsCopied . set ( true ) ;
51
+
52
+ // 'Restart' tooltip to show 'Copied!' message
53
+ this . _copyBtnTooltip ( ) . close ( ) ;
54
+ setTimeout ( ( ) => this . _copyBtnTooltip ( ) . open ( ) , 0 ) ;
55
+
56
+ setTimeout ( ( ) => this . showAsCopied . set ( false ) , 2000 ) ;
57
+ } ) ;
58
+ }
31
59
}
0 commit comments