{"version":3,"file":"19.DULsvJN2.mjs","sources":["../../../../../../src/routes/pypi/+page.ts","../../../../../../src/routes/pypi/+page.svelte"],"sourcesContent":["import type { PageLoad } from \"./$types\";\nimport type { search } from \"./search\";\n\nexport const load = (async (event) => {\n  const query = event.url.searchParams.get(\"q\");\n  if (!query) {\n    return { query, total: null, page: 0, npages: 0, results: [] };\n  }\n  return await event.fetch(event.url).then(res => res.json()) as ReturnType<typeof search>;\n}) satisfies PageLoad;\n","<script lang=\"ts\">\n  import type { PageData } from \"./$types\";\n\n  import { query } from \"./store\";\n  import { browser } from \"$app/environment\";\n  import { afterNavigate, goto } from \"$app/navigation\";\n  import { page } from \"$app/stores\";\n  import { Button } from \"bits-ui\";\n  import { onMount } from \"svelte\";\n\n  export let data: PageData;\n\n  let loadingMore = false;\n\n  $: enough = data.total !== null && data.total <= data.results.length;\n\n  let ref: HTMLDivElement;\n  let index = 1;\n\n  let intersecting = !enough;\n\n  afterNavigate(() => {\n    index = 1;\n    intersecting && startLoadingMore();\n  });\n\n  async function startLoadingMore() {\n    if (loadingMore || !data.query)\n      return;\n    loadingMore = true;\n    const q = $query;\n    // eslint-disable-next-line no-unmodified-loop-condition\n    while (intersecting && !enough) {\n      const url = new URL(location.href);\n      url.searchParams.set(\"page\", String(index + 1));\n      const json = await fetch(url, { headers: { accept: \"application/json\" } }).then(res => res.json());\n      if (q === $query) {\n        data.results = [...data.results, ...json.results];\n        index++;\n        await new Promise(resolve => setTimeout(resolve, 10));\n      }\n      else {\n        return;\n      }\n    }\n    loadingMore = false;\n  }\n\n  $: if (browser && intersecting) {\n    startLoadingMore();\n  }\n\n  onMount(() => {\n    new IntersectionObserver(([{ isIntersecting }]) => {\n      intersecting = isIntersecting;\n    }).observe(ref);\n  });\n</script>\n\n{#if $page.url.searchParams.get(\"q\")}\n  <h1 class=\"text-xl\">\n    <span class=\"text-neutral-5\">搜索</span>\n    <span class=\"text-neutral-1\">{data.query}</span>\n    <span class=\"text-neutral-5\">得到</span>\n    <span class=\"text-neutral-1\">{data.total ?? \"10000+\"}</span>\n    <span class=\"text-neutral-5\">个结果</span>\n  </h1>\n{:else}\n  <div class=\"grid aspect-3/2 min-h-xs w-full place-items-center rounded bg-gradient-(from-neutral-8/50 via-neutral-8/25 to-neutral-8/0 to-b)\">\n    <div class=\"m-4 flex flex-col gap-2\">\n      <h1 class=\"text-lg text-neutral-3 font-275 lg:text-xl\">在 PyPI 上搜索</h1>\n      <!-- svelte-ignore a11y-autofocus -->\n      <input autofocus on:keydown={({ key }) => key === \"Enter\" && goto(`/pypi?q=${$query}`)} placeholder=\"包名 / 作者\" class=\"w-full b-b-(1 neutral-6) bg-transparent py-1 text-neutral-3 outline-none focus:b-b-neutral-5 lg:text-lg placeholder-neutral-6\" bind:value={$query} type=\"text\">\n    </div>\n  </div>\n{/if}\n\n<div class=\"relative my-4 flex flex-col gap-3 transition-opacity\">\n  {#each data.results as { name, version, description = \"\", updated }}\n    <Button.Root class=\"flex flex-col gap-1 px-3 py-2 ring-(1.2 neutral-8) hover:ring-neutral-5\" href=\"/pypi/{name}\">\n      <div class=\"flex flex-row items-center gap-1.5 ws-nowrap\">\n        <h2 class=\"text-lg text-neutral-1\">{name}</h2>\n        {#if version}\n          <code class=\"rounded-sm bg-neutral-4/10 px-1 text-sm text-neutral-4\">{version}</code>\n        {/if}\n        <div class=\"w-full text-right text-neutral-4 text-neutral-7 <sm:text-sm\">{updated}</div>\n      </div>\n      <h3 class=\"text-xs text-neutral-5 sm:text-sm\">{description}</h3>\n    </Button.Root>\n  {/each}\n  <div bind:this={ref} class=\"pointer-events-none invisible absolute bottom-0 h-250vh w-full\"></div>\n</div>\n"],"names":["load","event","query","res","insert_hydration","target","div1","anchor","append_hydration","div0","h1","input","ctx","t2_value","span0","span1","span2","span3","span4","dirty","set_data","t2","t6","t6_value","code","t","t_value","create_if_block","h2","h3","t0","t0_value","t3","t3_value","t5","t5_value","show_if","each_value","ensure_array_like","i","each_blocks","data","$$props","loadingMore","ref","index","intersecting","enough","afterNavigate","startLoadingMore","q","$query","url","json","$$invalidate","resolve","onMount","isIntersecting","keydown_handler","key","goto","$$value"],"mappings":"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"}