|
10 | 10 | import IconMCP from "./IconMCP.svelte"; |
11 | 11 | import IconHuggingChat from "./IconHuggingChat.svelte"; |
12 | 12 |
|
13 | | - export let label = "Copy page"; |
14 | | - export let markdownDescription = "Copy page as Markdown for LLMs"; |
15 | | - export let containerClass = ""; |
16 | | - export let containerStyle = ""; |
| 13 | + interface Props { |
| 14 | + label?: string; |
| 15 | + markdownDescription?: string; |
| 16 | + containerClass?: string; |
| 17 | + containerStyle?: string; |
| 18 | + } |
| 19 | +
|
| 20 | + let { |
| 21 | + label = "Copy page", |
| 22 | + markdownDescription = "Copy page as Markdown for LLMs", |
| 23 | + containerClass = "", |
| 24 | + containerStyle = "", |
| 25 | + }: Props = $props(); |
17 | 26 |
|
18 | 27 | const isClient = typeof window !== "undefined"; |
19 | 28 | const hasDocument = typeof document !== "undefined"; |
|
28 | 37 | const SOURCE_URL_MD = SOURCE_URL.endsWith(".md") ? SOURCE_URL : SOURCE_URL + ".md"; |
29 | 38 | let encodedPrompt: string | null = null; |
30 | 39 |
|
31 | | - let open = false; |
32 | | - let copied = false; |
33 | | - let triggerEl: HTMLDivElement | null = null; |
34 | | - let menuEl: HTMLDivElement | null = null; |
35 | | - let menuStyle = ""; |
| 40 | + let open = $state(false); |
| 41 | + let copied = $state(false); |
| 42 | + let triggerEl: HTMLDivElement | null = $state(null); |
| 43 | + let menuEl: HTMLDivElement | null = $state(null); |
| 44 | + let menuStyle = $state(""); |
36 | 45 | let closeTimeout: ReturnType<typeof setTimeout> | null = null; |
37 | 46 | let sourceMarkdown: string | null = null; |
38 | 47 | let sourceFetchPromise: Promise<string> | null = null; |
|
204 | 213 | </script> |
205 | 214 |
|
206 | 215 | <svelte:window |
207 | | - on:mousedown={handleWindowPointer} |
208 | | - on:keydown={handleWindowKeydown} |
209 | | - on:resize={handleWindowResize} |
210 | | - on:scroll={handleWindowScroll} |
| 216 | + onmousedown={handleWindowPointer} |
| 217 | + onkeydown={handleWindowKeydown} |
| 218 | + onresize={handleWindowResize} |
| 219 | + onscroll={handleWindowScroll} |
211 | 220 | /> |
212 | 221 |
|
213 | 222 | <div |
|
218 | 227 | > |
219 | 228 | <div bind:this={triggerEl} class="inline-flex rounded-md max-sm:rounded-sm"> |
220 | 229 | <button |
221 | | - on:click={copyMarkdown} |
| 230 | + onclick={copyMarkdown} |
222 | 231 | class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" |
223 | 232 | aria-live="polite" |
224 | 233 | > |
|
230 | 239 | <span>{copied ? "Copied" : label}</span> |
231 | 240 | </button> |
232 | 241 | <button |
233 | | - on:click={toggleMenu} |
| 242 | + onclick={toggleMenu} |
234 | 243 | class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" |
235 | 244 | aria-haspopup="menu" |
236 | 245 | aria-expanded={open} |
|
249 | 258 | class="fixed inset-0 z-40" |
250 | 259 | aria-hidden="true" |
251 | 260 | style="background: transparent;" |
252 | | - on:click={closeMenu} |
| 261 | + onclick={closeMenu} |
253 | 262 | ></div> |
254 | 263 | <div |
255 | 264 | bind:this={menuEl} |
|
260 | 269 | > |
261 | 270 | <button |
262 | 271 | role="menuitem" |
263 | | - on:click={() => { |
| 272 | + onclick={() => { |
264 | 273 | copyMarkdown(); |
265 | 274 | closeMenu(); |
266 | 275 | }} |
|
284 | 293 | href={SOURCE_URL_MD} |
285 | 294 | target="_blank" |
286 | 295 | rel="noopener noreferrer" |
287 | | - on:click={closeMenu} |
| 296 | + onclick={closeMenu} |
288 | 297 | class="{baseMenuItemClass} no-underline!" |
289 | 298 | > |
290 | 299 | <div class="border border-gray-200 dark:border-gray-850 rounded-lg p-1.5"> |
|
305 | 314 | href={option.buildUrl()} |
306 | 315 | target="_blank" |
307 | 316 | rel="noopener noreferrer" |
308 | | - on:click={closeMenu} |
| 317 | + onclick={closeMenu} |
309 | 318 | class="{baseMenuItemClass} no-underline!" |
310 | 319 | > |
311 | 320 | <div class="border border-gray-200 dark:border-gray-850 rounded-lg p-1.5"> |
|
0 commit comments