@@ -4,7 +4,7 @@ import { transformNpmCommand } from "~/lib/transformNpmCommand";
4
4
import type { PackageManager } from "~/lib/transformNpmCommand" ;
5
5
import { DetailsMenu , DetailsPopup } from "./details-menu" ;
6
6
7
- import { Form , Link , useSearchParams , useSubmit } from "@remix-run/react" ;
7
+ import { Link , useSearchParams , useSubmit } from "@remix-run/react" ;
8
8
import cx from "clsx" ;
9
9
import iconsHref from "~/icons.svg" ;
10
10
@@ -70,12 +70,18 @@ export function InitCodeblock({
70
70
// Probably a more elegant solution, but this is what I've got
71
71
let [ npxOrNpmMaybe , ...otherCode ] = initCommand . trim ( ) . split ( " " ) ;
72
72
let [ copied , setCopied ] = useState ( false ) ;
73
+ const submit = useSubmit ( ) ;
73
74
74
- function handleCopied ( copied : boolean , packageManager : PackageManager ) {
75
- setCopied ( copied ) ;
75
+ function handleCopy ( packageManager : PackageManager ) {
76
+ setCopied ( true ) ;
76
77
navigator . clipboard . writeText (
77
78
transformNpmCommand ( npxOrNpmMaybe , otherCode . join ( " " ) , packageManager ) ,
78
79
) ;
80
+ // This is a hack to close the details menu after clicking
81
+ submit ( null , {
82
+ preventScrollReset : true ,
83
+ replace : true ,
84
+ } ) ;
79
85
}
80
86
81
87
// Reset copied state after 4 seconds
@@ -117,35 +123,24 @@ export function InitCodeblock({
117
123
</ code >
118
124
</ pre >
119
125
120
- < CopyCodeBlock setCopied = { handleCopied } copied = { copied } />
126
+ < CopyCodeBlock copied = { copied } onCopy = { handleCopy } />
121
127
</ div >
122
128
) ;
123
129
}
124
130
125
131
type CopyCodeBlockProps = {
126
132
copied : boolean ;
127
- setCopied : ( copied : boolean , packageManager : PackageManager ) => void ;
133
+ onCopy : ( packageManager : PackageManager ) => void ;
128
134
} ;
129
135
130
- function CopyCodeBlock ( { copied, setCopied } : CopyCodeBlockProps ) {
131
- const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
132
- const [ searchParams ] = useSearchParams ( ) ;
133
-
136
+ function CopyCodeBlock ( { copied, onCopy } : CopyCodeBlockProps ) {
134
137
return (
135
- < DetailsMenu
136
- className = "absolute right-4 top-0 !opacity-100"
137
- data-copied = { copied }
138
- onToggle = { ( ) => setIsMenuOpen ( ( oldValue ) => ! oldValue ) }
139
- >
138
+ < DetailsMenu className = "absolute" data-copied = { copied } data-code-block-copy >
140
139
< summary
141
- className = "_no-triangle absolute top-0 grid "
140
+ className = "_no-triangle block outline-offset-2 "
142
141
data-copied = { copied }
143
142
>
144
- < span
145
- data-code-block-copy
146
- data-copied = { copied }
147
- className = { `absolute right-0 top-0 opacity-0 hover:opacity-100 ${ copied || isMenuOpen ? "!opacity-100" : "" } ` }
148
- >
143
+ < span data-copied = { copied } >
149
144
< svg
150
145
aria-hidden
151
146
className = "h-5 w-5 text-gray-500 hover:text-black dark:text-gray-400 dark:hover:text-gray-100"
@@ -160,61 +155,26 @@ function CopyCodeBlock({ copied, setCopied }: CopyCodeBlockProps) {
160
155
< span className = "sr-only" > Copy code to clipboard</ span >
161
156
</ span >
162
157
</ summary >
163
- < DetailsPopup
164
- className = "!left-auto !right-0 top-10"
165
- childrenClassName = "!w-[110px]"
166
- >
167
- < Form preventScrollReset replace className = "flex flex-col" >
168
- < input
169
- type = "hidden"
170
- name = "category"
171
- value = { searchParams . get ( "category" ) || "" }
172
- />
173
-
174
- < PackageManagerButton
175
- packageManager = "npm"
176
- setCopied = { ( copied ) => setCopied ( copied , "npm" ) }
177
- />
178
- < PackageManagerButton
179
- packageManager = "yarn"
180
- setCopied = { ( copied ) => setCopied ( copied , "yarn" ) }
181
- />
182
- < PackageManagerButton
183
- packageManager = "pnpm"
184
- setCopied = { ( copied ) => setCopied ( copied , "pnpm" ) }
185
- />
186
- < PackageManagerButton
187
- packageManager = "bun"
188
- setCopied = { ( copied ) => setCopied ( copied , "bun" ) }
189
- />
190
- </ Form >
191
- </ DetailsPopup >
158
+ < div className = "absolute left-auto right-0 top-10 w-[110px]" >
159
+ < DetailsPopup
160
+ // TODO: remove when we get the DetailsPopup figured out
161
+ className = "w-full" // ehhh, we'll see
162
+ >
163
+ < div className = "flex flex-col" >
164
+ { ( [ "npm" , "yarn" , "pnpm" , "bun" ] as const ) . map ( ( packageManager ) => (
165
+ < button
166
+ key = { packageManager }
167
+ className = "rounded-md p-1.5 text-left text-sm text-gray-700 hover:bg-blue-200/50 hover:text-black dark:text-gray-400 dark:hover:bg-blue-800/50 dark:hover:text-gray-100"
168
+ onClick = { ( ) => {
169
+ onCopy ( packageManager ) ;
170
+ } }
171
+ >
172
+ { packageManager }
173
+ </ button >
174
+ ) ) }
175
+ </ div >
176
+ </ DetailsPopup >
177
+ </ div >
192
178
</ DetailsMenu >
193
179
) ;
194
180
}
195
-
196
- type PackageManagerButtonProps = {
197
- packageManager : PackageManager ;
198
- setCopied : ( copied : boolean ) => void ;
199
- } ;
200
-
201
- function PackageManagerButton ( {
202
- packageManager,
203
- setCopied,
204
- } : PackageManagerButtonProps ) {
205
- const submit = useSubmit ( ) ;
206
- return (
207
- < button
208
- className = "rounded-md p-1.5 text-left text-sm hover:cursor-pointer hover:bg-gray-50"
209
- type = "submit"
210
- onClick = { ( ) => {
211
- submit ( {
212
- preventScrollReset : false ,
213
- } ) ;
214
- setCopied ( true ) ;
215
- } }
216
- >
217
- { packageManager }
218
- </ button >
219
- ) ;
220
- }
0 commit comments