@@ -37,7 +37,7 @@ if (active && !isInView(active)) {
3737 ( active . parentElement . previousElementSibling || active . parentElement . parentElement || active ) . scrollIntoView ( )
3838}
3939
40- /* used in :::copy and :::sh CopyContainerRenderer */
40+ /* used in :::copy */
4141globalThis . copy = function ( e ) {
4242 e . classList . add ( 'copying' )
4343 let $el = document . createElement ( "textarea" )
@@ -48,4 +48,69 @@ globalThis.copy = function(e) {
4848 document . execCommand ( "copy" )
4949 document . body . removeChild ( $el )
5050 setTimeout ( ( ) => e . classList . remove ( 'copying' ) , 3000 )
51- }
51+ }
52+
53+ /* used in :::sh CopyContainerRenderer */
54+ globalThis . shellCopy = async function ( e ) {
55+ // Get the text content from the code element
56+ const codeEl = e . querySelector ( 'code' )
57+ const textToCopy = codeEl ?. textContent ?. trim ( ) || ""
58+
59+ // Find the button element and icons
60+ const btn = e . querySelector ( '.shell-copy-btn' )
61+ if ( ! btn ) return
62+
63+ const copiedIcon = btn . querySelector ( '.copied' )
64+ const nocopyIcon = btn . querySelector ( '.nocopy' )
65+
66+ try {
67+ // Use modern Clipboard API
68+ await navigator . clipboard . writeText ( textToCopy )
69+
70+ // Show checkmark, hide copy icon
71+ if ( copiedIcon ) copiedIcon . style . display = 'block'
72+ if ( nocopyIcon ) nocopyIcon . style . display = 'none'
73+
74+ // Add copied state to button
75+ btn . classList . remove ( 'bg-white' , 'dark:bg-slate-800' , 'text-slate-700' , 'dark:text-slate-300' , 'border-slate-300' , 'dark:border-slate-600' , 'hover:bg-slate-50' , 'dark:hover:bg-slate-700' , 'hover:border-slate-400' , 'dark:hover:border-slate-500' )
76+ btn . classList . add ( 'bg-green-100' , 'dark:bg-green-900/30' , 'text-green-700' , 'dark:text-green-400' , 'border-green-300' , 'dark:border-green-700' )
77+
78+ // Reset after 2 seconds
79+ setTimeout ( ( ) => {
80+ // Hide checkmark, show copy icon
81+ if ( copiedIcon ) copiedIcon . style . display = 'none'
82+ if ( nocopyIcon ) nocopyIcon . style . display = 'block'
83+
84+ btn . classList . remove ( 'bg-green-100' , 'dark:bg-green-900/30' , 'text-green-700' , 'dark:text-green-400' , 'border-green-300' , 'dark:border-green-700' )
85+ btn . classList . add ( 'bg-white' , 'dark:bg-slate-800' , 'text-slate-700' , 'dark:text-slate-300' , 'border-slate-300' , 'dark:border-slate-600' , 'hover:bg-slate-50' , 'dark:hover:bg-slate-700' , 'hover:border-slate-400' , 'dark:hover:border-slate-500' )
86+ } , 2000 )
87+ } catch ( err ) {
88+ // Fallback for older browsers
89+ const $el = document . createElement ( "textarea" )
90+ $el . value = textToCopy
91+ $el . style . position = "fixed"
92+ $el . style . opacity = "0"
93+ document . body . appendChild ( $el )
94+ $el . select ( )
95+ document . execCommand ( "copy" )
96+ document . body . removeChild ( $el )
97+
98+ // Show checkmark, hide copy icon
99+ if ( copiedIcon ) copiedIcon . style . display = 'block'
100+ if ( nocopyIcon ) nocopyIcon . style . display = 'none'
101+
102+ // Add copied state to button
103+ btn . classList . remove ( 'bg-white' , 'dark:bg-slate-800' , 'text-slate-700' , 'dark:text-slate-300' , 'border-slate-300' , 'dark:border-slate-600' , 'hover:bg-slate-50' , 'dark:hover:bg-slate-700' , 'hover:border-slate-400' , 'dark:hover:border-slate-500' )
104+ btn . classList . add ( 'bg-green-100' , 'dark:bg-green-900/30' , 'text-green-700' , 'dark:text-green-400' , 'border-green-300' , 'dark:border-green-700' )
105+
106+ // Reset after 2 seconds
107+ setTimeout ( ( ) => {
108+ // Hide checkmark, show copy icon
109+ if ( copiedIcon ) copiedIcon . style . display = 'none'
110+ if ( nocopyIcon ) nocopyIcon . style . display = 'block'
111+
112+ btn . classList . remove ( 'bg-green-100' , 'dark:bg-green-900/30' , 'text-green-700' , 'dark:text-green-400' , 'border-green-300' , 'dark:border-green-700' )
113+ btn . classList . add ( 'bg-white' , 'dark:bg-slate-800' , 'text-slate-700' , 'dark:text-slate-300' , 'border-slate-300' , 'dark:border-slate-600' , 'hover:bg-slate-50' , 'dark:hover:bg-slate-700' , 'hover:border-slate-400' , 'dark:hover:border-slate-500' )
114+ } , 2000 )
115+ }
116+ }
0 commit comments