{"version":3,"file":"Browser-BO6khSKR.cjs","sources":["../lib/domains-config.ts","../app/components/browser/Browser.tsx"],"sourcesContent":["/**\n * Domain Configuration for Educational Resources\n * Following best practices for online exam environments\n */\n\nexport type DomainCategory =\n  | \"encyclopedia\"\n  | \"academic\"\n  | \"mathematics\"\n  | \"science\"\n  | \"programming\"\n  | \"reference\"\n  | \"educational\"\n  | \"government\";\n\nexport interface DomainConfig {\n  domain: string;\n  category: DomainCategory;\n  canEmbed: boolean;\n  searchWeight: number; // 0-1, higher = more relevant for academic use\n  description: string;\n  searchPriority: number; // 1-10, higher = shown first in results\n}\n\n/**\n * Comprehensive list of educational domains suitable for exams\n * All domains have been tested for embedding and reader mode compatibility\n */\nexport const EDUCATIONAL_DOMAINS: DomainConfig[] = [\n  // Encyclopedias & General Reference\n  {\n    domain: \"wikipedia.org\",\n    category: \"encyclopedia\",\n    canEmbed: true,\n    searchWeight: 0.95,\n    description: \"Free encyclopedia with academic content\",\n    searchPriority: 10,\n  },\n  {\n    domain: \"britannica.com\",\n    category: \"encyclopedia\",\n    canEmbed: true,\n    searchWeight: 0.95,\n    description: \"Professional encyclopedia with verified content\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"wikimedia.org\",\n    category: \"encyclopedia\",\n    canEmbed: true,\n    searchWeight: 0.85,\n    description: \"Wikimedia foundation resources\",\n    searchPriority: 8,\n  },\n\n  // Mathematics\n  {\n    domain: \"khanacademy.org\",\n    category: \"mathematics\",\n    canEmbed: false,\n    searchWeight: 1.0,\n    description: \"Free educational platform with math courses\",\n    searchPriority: 10,\n  },\n  {\n    domain: \"wolframalpha.com\",\n    category: \"mathematics\",\n    canEmbed: false,\n    searchWeight: 1.0,\n    description: \"Computational knowledge engine\",\n    searchPriority: 10,\n  },\n  {\n    domain: \"mathworld.wolfram.com\",\n    category: \"mathematics\",\n    canEmbed: true,\n    searchWeight: 0.95,\n    description: \"Comprehensive mathematics resource\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"desmos.com\",\n    category: \"mathematics\",\n    canEmbed: true,\n    searchWeight: 0.9,\n    description: \"Graphing calculator and math tools\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"geogebra.org\",\n    category: \"mathematics\",\n    canEmbed: true,\n    searchWeight: 0.9,\n    description: \"Interactive geometry and algebra\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"mathsisfun.com\",\n    category: \"mathematics\",\n    canEmbed: true,\n    searchWeight: 0.85,\n    description: \"Math explained in simple language\",\n    searchPriority: 7,\n  },\n\n  // Science\n  {\n    domain: \"nature.com\",\n    category: \"science\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Scientific research and journals\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"sciencedirect.com\",\n    category: \"science\",\n    canEmbed: true,\n    searchWeight: 0.95,\n    description: \"Scientific research database\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"ncbi.nlm.nih.gov\",\n    category: \"science\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"National Center for Biotechnology Information\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"pubmed.ncbi.nlm.nih.gov\",\n    category: \"science\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Biomedical literature database\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"chemguide.co.uk\",\n    category: \"science\",\n    canEmbed: true,\n    searchWeight: 0.85,\n    description: \"Chemistry study guide\",\n    searchPriority: 7,\n  },\n  {\n    domain: \"physics.org\",\n    category: \"science\",\n    canEmbed: true,\n    searchWeight: 0.85,\n    description: \"Physics resources and education\",\n    searchPriority: 7,\n  },\n\n  // Programming & Technology\n  {\n    domain: \"developer.mozilla.org\",\n    category: \"programming\",\n    canEmbed: false,\n    searchWeight: 1.0,\n    description: \"MDN Web Docs for web technologies\",\n    searchPriority: 10,\n  },\n  {\n    domain: \"stackoverflow.com\",\n    category: \"programming\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Programming Q&A community\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"github.com\",\n    category: \"programming\",\n    canEmbed: false,\n    searchWeight: 0.9,\n    description: \"Code repository and documentation\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"w3schools.com\",\n    category: \"programming\",\n    canEmbed: false,\n    searchWeight: 0.85,\n    description: \"Web development tutorials\",\n    searchPriority: 7,\n  },\n  {\n    domain: \"docs.python.org\",\n    category: \"programming\",\n    canEmbed: true,\n    searchWeight: 0.95,\n    description: \"Official Python documentation\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"nodejs.org\",\n    category: \"programming\",\n    canEmbed: true,\n    searchWeight: 0.9,\n    description: \"Node.js documentation\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"reactjs.org\",\n    category: \"programming\",\n    canEmbed: true,\n    searchWeight: 0.9,\n    description: \"React documentation\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"react.dev\",\n    category: \"programming\",\n    canEmbed: true,\n    searchWeight: 0.9,\n    description: \"New React documentation\",\n    searchPriority: 8,\n  },\n\n  // Academic & Educational Platforms\n  {\n    domain: \"coursera.org\",\n    category: \"educational\",\n    canEmbed: false,\n    searchWeight: 0.9,\n    description: \"Online courses from universities\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"edx.org\",\n    category: \"educational\",\n    canEmbed: false,\n    searchWeight: 0.9,\n    description: \"University-level online courses\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"mit.edu\",\n    category: \"academic\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"MIT resources and OpenCourseWare\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"stanford.edu\",\n    category: \"academic\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Stanford University resources\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"harvard.edu\",\n    category: \"academic\",\n    canEmbed: true,\n    searchWeight: 0.95,\n    description: \"Harvard University resources\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"cambridge.org\",\n    category: \"academic\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Cambridge University Press\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"oxford.edu\",\n    category: \"academic\",\n    canEmbed: true,\n    searchWeight: 0.95,\n    description: \"Oxford University resources\",\n    searchPriority: 9,\n  },\n\n  // Reference & Dictionaries\n  {\n    domain: \"merriam-webster.com\",\n    category: \"reference\",\n    canEmbed: true,\n    searchWeight: 0.9,\n    description: \"Dictionary and thesaurus\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"dictionary.com\",\n    category: \"reference\",\n    canEmbed: false,\n    searchWeight: 0.85,\n    description: \"Online dictionary\",\n    searchPriority: 7,\n  },\n  {\n    domain: \"thesaurus.com\",\n    category: \"reference\",\n    canEmbed: false,\n    searchWeight: 0.85,\n    description: \"Online thesaurus\",\n    searchPriority: 7,\n  },\n  {\n    domain: \"grammarly.com\",\n    category: \"reference\",\n    canEmbed: false,\n    searchWeight: 0.8,\n    description: \"Grammar and writing guide\",\n    searchPriority: 6,\n  },\n\n  // Government & Official Sources\n  {\n    domain: \"nasa.gov\",\n    category: \"government\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"NASA space and science resources\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"noaa.gov\",\n    category: \"government\",\n    canEmbed: true,\n    searchWeight: 0.9,\n    description: \"Weather and climate data\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"usgs.gov\",\n    category: \"government\",\n    canEmbed: false,\n    searchWeight: 0.9,\n    description: \"Geological survey data\",\n    searchPriority: 8,\n  },\n  {\n    domain: \"nih.gov\",\n    category: \"government\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"National Institutes of Health\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"cdc.gov\",\n    category: \"government\",\n    canEmbed: true,\n    searchWeight: 0.95,\n    description: \"Centers for Disease Control\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"archives.gov\",\n    category: \"government\",\n    canEmbed: false,\n    searchWeight: 0.85,\n    description: \"National Archives\",\n    searchPriority: 7,\n  },\n\n  // Additional Educational Resources\n  {\n    domain: \"quizlet.com\",\n    category: \"educational\",\n    canEmbed: true,\n    searchWeight: 0.8,\n    description: \"Study sets and flashcards\",\n    searchPriority: 7,\n  },\n  {\n    domain: \"sparknotes.com\",\n    category: \"educational\",\n    canEmbed: false,\n    searchWeight: 0.75,\n    description: \"Study guides and summaries\",\n    searchPriority: 6,\n  },\n  {\n    domain: \"cliffsnotes.com\",\n    category: \"educational\",\n    canEmbed: false,\n    searchWeight: 0.75,\n    description: \"Literature study guides\",\n    searchPriority: 6,\n  },\n  {\n    domain: \"purplemath.com\",\n    category: \"mathematics\",\n    canEmbed: false,\n    searchWeight: 0.85,\n    description: \"Algebra lessons and help\",\n    searchPriority: 7,\n  },\n  {\n    domain: \"mathplanet.com\",\n    category: \"mathematics\",\n    canEmbed: false,\n    searchWeight: 0.8,\n    description: \"Math courses for high school\",\n    searchPriority: 6,\n  },\n\n  // Stack Exchange Network\n  {\n    domain: \"math.stackexchange.com\",\n    category: \"mathematics\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Mathematics Q&A\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"physics.stackexchange.com\",\n    category: \"science\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Physics Q&A\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"chemistry.stackexchange.com\",\n    category: \"science\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Chemistry Q&A\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"biology.stackexchange.com\",\n    category: \"science\",\n    canEmbed: false,\n    searchWeight: 0.95,\n    description: \"Biology Q&A\",\n    searchPriority: 9,\n  },\n  {\n    domain: \"english.stackexchange.com\",\n    category: \"reference\",\n    canEmbed: false,\n    searchWeight: 0.9,\n    description: \"English language Q&A\",\n    searchPriority: 8,\n  },\n];\n\n/**\n * Get all allowed domains for quick lookup\n */\nexport function getAllowedDomains(): string[] {\n  return EDUCATIONAL_DOMAINS.map((d) => d.domain);\n}\n\n/**\n * Check if a URL is from an allowed educational domain\n */\nexport function isAllowedDomain(url: string): boolean {\n  try {\n    const urlObj = new URL(url);\n    const hostname = urlObj.hostname.toLowerCase();\n\n    return EDUCATIONAL_DOMAINS.some((config) => {\n      const domain = config.domain.toLowerCase();\n      // Check for exact match or subdomain match\n      return (\n        hostname === domain ||\n        hostname.endsWith(\".\" + domain) ||\n        hostname === \"www.\" + domain\n      );\n    });\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Get domain configuration by URL\n */\nexport function getDomainConfig(url: string): DomainConfig | null {\n  try {\n    const urlObj = new URL(url);\n    const hostname = urlObj.hostname.toLowerCase();\n\n    return (\n      EDUCATIONAL_DOMAINS.find((config) => {\n        const domain = config.domain.toLowerCase();\n        return (\n          hostname === domain ||\n          hostname.endsWith(\".\" + domain) ||\n          hostname === \"www.\" + domain\n        );\n      }) || null\n    );\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Get domains by category\n */\nexport function getDomainsByCategory(category: DomainCategory): DomainConfig[] {\n  return EDUCATIONAL_DOMAINS.filter((d) => d.category === category);\n}\n\n/**\n * Get search-optimized domain list\n */\nexport function getSearchDomains(): string[] {\n  return EDUCATIONAL_DOMAINS.filter((d) => d.searchWeight >= 0.8)\n    .sort((a, b) => b.searchPriority - a.searchPriority)\n    .map((d) => d.domain);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { isAllowedDomain } from \"@/lib/domains-config\";\n\nexport default function Browser() {\n  const [query, setQuery] = useState(\"\");\n  const [url, setUrl] = useState<string>(\"\");\n  const iframeRef = useRef<HTMLIFrameElement | null>(null);\n  const [version, setVersion] = useState(0); // force reload key\n  const [suggestions, setSuggestions] = useState<\n    Array<{\n      title: string;\n      url: string;\n      provider: string;\n      snippet?: string;\n      relevance?: number;\n      isAllowed?: boolean;\n    }>\n  >([]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [showSuggestions, setShowSuggestions] = useState(false);\n  const [activeIndex, setActiveIndex] = useState<number>(-1);\n  const abortRef = useRef<AbortController | null>(null);\n  const [readerHtml, setReaderHtml] = useState<string | null>(null);\n  const [isReaderMode, setIsReaderMode] = useState(false);\n  const [isReaderLoading, setIsReaderLoading] = useState(false);\n  const [readerError, setReaderError] = useState<string | null>(null);\n  const [activeUrl, setActiveUrl] = useState<string | null>(null);\n  const [canEmbed, setCanEmbed] = useState<boolean | null>(null);\n  const [blockedNavigation, setBlockedNavigation] = useState<string | null>(\n    null\n  );\n\n  const canGo = useMemo(() => query.trim().length > 0, [query]);\n\n  const navigate = useCallback((nextUrl: string) => {\n    // Security check: Only allow navigation to approved educational domains\n    if (!isAllowedDomain(nextUrl)) {\n      setBlockedNavigation(nextUrl);\n      // Show warning for 3 seconds\n      setTimeout(() => setBlockedNavigation(null), 3000);\n      return;\n    }\n\n    setUrl(nextUrl);\n    setActiveUrl(nextUrl);\n    // Reset reader mode for new navigation\n    setIsReaderMode(false);\n    setCanEmbed(null);\n    setReaderHtml(null);\n    setReaderError(null);\n    setBlockedNavigation(null);\n  }, []);\n\n  const onSubmit = useCallback(\n    (e: React.FormEvent) => {\n      e.preventDefault();\n      // If we have a highlighted suggestion or any suggestions, open best match\n      const chosen =\n        (activeIndex >= 0 && suggestions[activeIndex]) || suggestions[0];\n      if (chosen?.url) {\n        navigate(chosen.url);\n        setShowSuggestions(false);\n        return;\n      }\n      // If user entered a URL directly\n      const raw = query.trim();\n      if (/^https?:\\/\\//i.test(raw)) {\n        navigate(raw);\n      }\n    },\n    [query, navigate, suggestions, activeIndex]\n  );\n\n  const onReload = useCallback(() => {\n    setVersion((v) => v + 1);\n  }, []);\n\n  const viewerUrl = useMemo(() => {\n    // Prioritize activeUrl if set, otherwise use url\n    return activeUrl || url || \"\";\n  }, [activeUrl, url]);\n\n  // Auto-detect if we can embed and auto-switch to reader mode if needed\n  useEffect(() => {\n    let cancelled = false;\n    async function check() {\n      const target = viewerUrl;\n      if (!/^https?:\\/\\//i.test(target)) return;\n\n      try {\n        const res = await fetch(\n          `/api/can-embed?url=${encodeURIComponent(target)}`,\n          {\n            cache: \"no-store\",\n          }\n        );\n        const data = (await res.json()) as { canEmbed: boolean };\n        if (!cancelled) {\n          setCanEmbed(data.canEmbed);\n          // Auto-switch to reader mode if can't embed\n          if (data.canEmbed === false) {\n            setIsReaderMode(true);\n          }\n        }\n      } catch {\n        // On error, assume we can try to embed\n        if (!cancelled) {\n          setCanEmbed(true);\n        }\n      }\n    }\n    void check();\n    return () => {\n      cancelled = true;\n    };\n  }, [viewerUrl]);\n\n  const loadReader = useCallback(async () => {\n    setReaderError(null);\n    setReaderHtml(null);\n    setIsReaderLoading(true);\n    try {\n      const target = viewerUrl;\n      if (!/^https?:\\/\\//i.test(target)) {\n        setReaderError(\"Enter a full URL or open a result first.\");\n        return;\n      }\n      const res = await fetch(`/api/reader?url=${encodeURIComponent(target)}`, {\n        cache: \"no-store\",\n      });\n\n      if (!res.ok) {\n        const errorData = await res.json().catch(() => ({}));\n        const errorMessage =\n          errorData.message || errorData.details || `HTTP ${res.status}`;\n        throw new Error(errorMessage);\n      }\n\n      const data = (await res.json()) as { html?: string; title?: string };\n      setReaderHtml(data.html || \"\");\n    } catch (error) {\n      const errorMessage =\n        (error as Error).message || \"Unable to load this page in reader mode.\";\n      setReaderError(errorMessage);\n    } finally {\n      setIsReaderLoading(false);\n    }\n  }, [viewerUrl]);\n\n  useEffect(() => {\n    if (isReaderMode) {\n      void loadReader();\n    }\n  }, [isReaderMode, loadReader]);\n\n  // Debounced search with improved accuracy\n  useEffect(() => {\n    const q = query.trim();\n    if (q.length < 2) {\n      setSuggestions([]);\n      setShowSuggestions(false);\n      setActiveIndex(-1);\n      if (abortRef.current) abortRef.current.abort();\n      return;\n    }\n    const handle = setTimeout(async () => {\n      try {\n        if (abortRef.current) abortRef.current.abort();\n        const controller = new AbortController();\n        abortRef.current = controller;\n        setIsLoading(true);\n\n        const res = await fetch(`/api/search?q=${encodeURIComponent(q)}`, {\n          signal: controller.signal,\n          cache: \"no-store\",\n        });\n        if (!res.ok) throw new Error(\"search failed\");\n        const data = (await res.json()) as {\n          results: Array<{\n            title: string;\n            url: string;\n            provider: string;\n            snippet?: string;\n            relevance?: number;\n            isAllowed?: boolean;\n          }>;\n          totalFound?: number;\n          filtered?: number;\n        };\n        setSuggestions(data.results || []);\n        setShowSuggestions(true);\n        setActiveIndex(-1);\n      } catch (err) {\n        if ((err as Error)?.name !== \"AbortError\") {\n          setSuggestions([]);\n          setShowSuggestions(false);\n          setActiveIndex(-1);\n        }\n      } finally {\n        setIsLoading(false);\n      }\n    }, 250);\n    return () => clearTimeout(handle);\n  }, [query]);\n\n  const onKeyDown = useCallback(\n    (e: React.KeyboardEvent<HTMLFormElement>) => {\n      if (!showSuggestions || suggestions.length === 0) return;\n      if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        setActiveIndex((i) => (i + 1) % suggestions.length);\n      } else if (e.key === \"ArrowUp\") {\n        e.preventDefault();\n        setActiveIndex((i) => (i <= 0 ? suggestions.length - 1 : i - 1));\n      } else if (e.key === \"Enter\") {\n        // Handled by form submit\n      } else if (e.key === \"Escape\") {\n        setShowSuggestions(false);\n        setActiveIndex(-1);\n      }\n    },\n    [showSuggestions, suggestions.length]\n  );\n\n  const handleSuggestionClick = useCallback(\n    (idx: number) => {\n      const s = suggestions[idx];\n      if (s) {\n        navigate(s.url);\n      }\n    },\n    [suggestions, navigate]\n  );\n\n  return (\n    <div className=\"flex h-full w-full flex-col\">\n      <form\n        className=\"p-2 border-b border-border flex items-center gap-2\"\n        onSubmit={onSubmit}\n        onKeyDown={onKeyDown}\n      >\n        <div className=\"flex-1 min-w-[260px]\">\n          <input\n            type=\"text\"\n            className=\"w-full rounded-md border border-border bg-surface px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n            placeholder=\"Search educational resources…\"\n            value={query}\n            onChange={(e) => setQuery(e.target.value)}\n            aria-label=\"Search or URL\"\n          />\n        </div>\n        <button\n          type=\"submit\"\n          className=\"h-9 rounded-md bg-accent px-4 text-sm text-accent-foreground hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n          disabled={!canGo}\n          aria-disabled={!canGo}\n        >\n          Go\n        </button>\n        <button\n          type=\"button\"\n          className=\"h-9 rounded-md bg-surface px-3 text-sm text-foreground hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n          onClick={onReload}\n          aria-label=\"Reload\"\n        >\n          Reload\n        </button>\n        {viewerUrl && (\n          <button\n            type=\"button\"\n            className={`h-9 rounded-md px-3 text-sm hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent ${\n              isReaderMode\n                ? \"bg-accent text-accent-foreground\"\n                : \"bg-surface text-foreground\"\n            }`}\n            onClick={() => setIsReaderMode((v) => !v)}\n            aria-pressed={isReaderMode}\n            aria-label=\"Toggle reader mode\"\n          >\n            Reader\n          </button>\n        )}\n      </form>\n      <div className=\"flex-1 grid grid-cols-12 gap-0 min-h-0\">\n        <aside className=\"col-span-4 border-r border-border overflow-auto\">\n          {suggestions.length === 0 && !isLoading ? (\n            <div className=\"p-4 text-muted-foreground text-sm\">\n              No results yet.\n            </div>\n          ) : (\n            <ul className=\"divide-y divide-border\">\n              {suggestions.map((s, idx) => (\n                <li\n                  key={`${s.url}-${idx}`}\n                  className={`p-3 cursor-pointer hover:bg-muted ${\n                    viewerUrl === s.url ? \"bg-muted\" : \"\"\n                  }`}\n                  onClick={() => handleSuggestionClick(idx)}\n                >\n                  <div className=\"flex items-center gap-2\">\n                    <span className=\"rounded bg-surface px-1.5 py-0.5 text-[10px] uppercase tracking-wide text-foreground/70\">\n                      {s.provider}\n                    </span>\n                    <div\n                      className=\"font-medium truncate text-foreground\"\n                      title={s.title}\n                    >\n                      {s.title}\n                    </div>\n                  </div>\n                  {s.snippet && (\n                    <div className=\"text-xs text-muted-foreground line-clamp-2 mt-1\">\n                      {s.snippet}\n                    </div>\n                  )}\n                  <div className=\"text-[11px] text-muted-foreground truncate mt-0.5\">\n                    {s.url}\n                  </div>\n                </li>\n              ))}\n              {isLoading ? (\n                <li className=\"p-3 text-xs text-muted-foreground\">\n                  Searching…\n                </li>\n              ) : null}\n            </ul>\n          )}\n        </aside>\n        <main className=\"col-span-8 overflow-hidden\">\n          <div className=\"no-drag relative m-2 mb-3 h-[calc(100%-2rem)] overflow-hidden rounded-lg border border-border bg-background\">\n            {!viewerUrl ? (\n              <div className=\"flex items-center justify-center h-full\">\n                <div className=\"text-sm text-muted-foreground\">\n                  Select a search result to view\n                </div>\n              </div>\n            ) : isReaderMode ? (\n              <div className=\"h-full w-full overflow-auto bg-background\">\n                {isReaderLoading ? (\n                  <div className=\"flex items-center justify-center h-full\">\n                    <div className=\"text-sm text-muted-foreground animate-pulse\">\n                      Loading reader mode...\n                    </div>\n                  </div>\n                ) : readerError ? (\n                  <div className=\"flex items-center justify-center h-full\">\n                    <div className=\"text-sm text-red-500\">{readerError}</div>\n                  </div>\n                ) : readerHtml ? (\n                  <div dangerouslySetInnerHTML={{ __html: readerHtml }} />\n                ) : (\n                  <div className=\"flex items-center justify-center h-full\">\n                    <div className=\"text-sm text-muted-foreground\">\n                      No content available\n                    </div>\n                  </div>\n                )}\n              </div>\n            ) : (\n              <>\n                <iframe\n                  key={version}\n                  ref={iframeRef}\n                  src={viewerUrl}\n                  className=\"h-full w-full\"\n                  title=\"In-app Browser\"\n                  sandbox=\"allow-scripts allow-forms allow-same-origin\"\n                />\n                <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-6 rounded-b-lg bg-gradient-to-t from-background to-transparent\" />\n              </>\n            )}\n          </div>\n          <div className=\"px-3 pb-2 text-xs text-foreground/60\">\n            {blockedNavigation ? (\n              <span className=\"text-red-600 dark:text-red-400\">\n                ⚠️ Navigation blocked: Only educational sites are allowed.\n              </span>\n            ) : canEmbed === false ? (\n              \"This site blocks embedding. Using reader mode for safe viewing.\"\n            ) : (\n              \"Some sites may automatically switch to reader mode if they block embedding.\"\n            )}\n          </div>\n        </main>\n      </div>\n    </div>\n  );\n}\n"],"names":["EDUCATIONAL_DOMAINS","isAllowedDomain","url","hostname","config","domain","Browser","query","setQuery","useState","setUrl","iframeRef","useRef","version","setVersion","suggestions","setSuggestions","isLoading","setIsLoading","showSuggestions","setShowSuggestions","activeIndex","setActiveIndex","abortRef","readerHtml","setReaderHtml","isReaderMode","setIsReaderMode","isReaderLoading","setIsReaderLoading","readerError","setReaderError","activeUrl","setActiveUrl","canEmbed","setCanEmbed","blockedNavigation","setBlockedNavigation","canGo","useMemo","navigate","useCallback","nextUrl","onSubmit","chosen","raw","onReload","v","viewerUrl","useEffect","cancelled","check","target","data","loadReader","res","errorData","errorMessage","error","q","handle","controller","err","onKeyDown","i","handleSuggestionClick","idx","s","jsxs","jsx","Fragment"],"mappings":"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"}