@seoengine.ai/next-llm-ready 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +858 -0
- package/dist/api/index.cjs +624 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +295 -0
- package/dist/api/index.d.ts +295 -0
- package/dist/api/index.js +613 -0
- package/dist/api/index.js.map +1 -0
- package/dist/hooks/index.cjs +619 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +257 -0
- package/dist/hooks/index.d.ts +257 -0
- package/dist/hooks/index.js +611 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +1609 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +850 -0
- package/dist/index.d.ts +850 -0
- package/dist/index.js +1576 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.cjs +398 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +134 -0
- package/dist/server/index.d.ts +134 -0
- package/dist/server/index.js +390 -0
- package/dist/server/index.js.map +1 -0
- package/dist/styles.css +855 -0
- package/package.json +118 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/clipboard.ts","../../src/utils/download.ts","../../src/utils/html-to-markdown.ts","../../src/hooks/use-llm-copy.ts","../../src/hooks/use-toc.ts","../../src/hooks/use-analytics.ts"],"names":["defaultOptions","error","useState","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Clipboard Utilities\n * Cross-browser clipboard operations\n */\n\n/**\n * Copy text to clipboard\n * Uses modern Clipboard API with fallback for older browsers\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n // Try modern Clipboard API first\n if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch (err) {\n // Fall through to fallback\n console.warn('Clipboard API failed, using fallback:', err);\n }\n }\n\n // Fallback for older browsers or when Clipboard API fails\n return fallbackCopyToClipboard(text);\n}\n\n/**\n * Fallback copy method using execCommand\n */\nfunction fallbackCopyToClipboard(text: string): boolean {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n\n // Make the textarea invisible\n textarea.style.position = 'fixed';\n textarea.style.top = '-9999px';\n textarea.style.left = '-9999px';\n textarea.style.opacity = '0';\n textarea.style.pointerEvents = 'none';\n\n // Prevent zooming on iOS\n textarea.style.fontSize = '16px';\n\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n try {\n const successful = document.execCommand('copy');\n document.body.removeChild(textarea);\n return successful;\n } catch (err) {\n console.error('Fallback copy failed:', err);\n document.body.removeChild(textarea);\n return false;\n }\n}\n\n/**\n * Check if clipboard is supported\n */\nexport function isClipboardSupported(): boolean {\n return !!(\n (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') ||\n document.queryCommandSupported?.('copy')\n );\n}\n\n/**\n * Read text from clipboard\n */\nexport async function readFromClipboard(): Promise<string | null> {\n if (navigator.clipboard && typeof navigator.clipboard.readText === 'function') {\n try {\n return await navigator.clipboard.readText();\n } catch (err) {\n console.warn('Failed to read from clipboard:', err);\n return null;\n }\n }\n return null;\n}\n","/**\n * Download Utilities\n * File download functionality\n */\n\nimport type { DownloadOptions } from '../types';\n\nconst defaultOptions: DownloadOptions = {\n filename: 'content',\n extension: 'md',\n includeMetadata: false,\n};\n\n/**\n * Download content as a file\n */\nexport function downloadAsFile(\n content: string,\n options: DownloadOptions = {}\n): void {\n const opts = { ...defaultOptions, ...options };\n const filename = sanitizeFilename(opts.filename || 'content');\n const fullFilename = `${filename}.${opts.extension}`;\n\n // Determine MIME type\n const mimeType = opts.extension === 'md' ? 'text/markdown' : 'text/plain';\n\n // Create blob and download\n const blob = new Blob([content], { type: `${mimeType};charset=utf-8` });\n const url = URL.createObjectURL(blob);\n\n const link = document.createElement('a');\n link.href = url;\n link.download = fullFilename;\n\n // Required for Firefox\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up\n URL.revokeObjectURL(url);\n}\n\n/**\n * Sanitize filename by removing/replacing invalid characters\n */\nexport function sanitizeFilename(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '') // Remove special characters\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/-+/g, '-') // Replace multiple hyphens with single\n .replace(/^-+|-+$/g, '') // Trim hyphens from start/end\n .substring(0, 100); // Limit length\n}\n\n/**\n * Generate filename from title\n */\nexport function generateFilename(title: string): string {\n const base = sanitizeFilename(title);\n const date = new Date().toISOString().split('T')[0];\n return `${base}-${date}`;\n}\n","/**\n * HTML to Markdown Converter\n * Converts HTML content to clean markdown format\n */\n\nimport type { HTMLToMarkdownOptions } from '../types';\n\nconst defaultOptions: HTMLToMarkdownOptions = {\n preserveLineBreaks: true,\n convertImages: true,\n convertLinks: true,\n stripScripts: true,\n customHandlers: {},\n};\n\n/**\n * Convert HTML string to Markdown\n */\nexport function htmlToMarkdown(\n html: string,\n options: HTMLToMarkdownOptions = {}\n): string {\n const opts = { ...defaultOptions, ...options };\n\n // Create a temporary DOM element to parse HTML\n if (typeof window === 'undefined') {\n // Server-side: use basic regex conversion\n return serverSideConvert(html, opts);\n }\n\n // Client-side: use DOM parsing\n const doc = new DOMParser().parseFromString(html, 'text/html');\n return convertNode(doc.body, opts);\n}\n\n/**\n * Server-side HTML to Markdown conversion (regex-based)\n */\nfunction serverSideConvert(html: string, opts: HTMLToMarkdownOptions): string {\n let markdown = html;\n\n // Strip scripts and styles\n if (opts.stripScripts) {\n markdown = markdown.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\n markdown = markdown.replace(/<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>/gi, '');\n }\n\n // Headings\n markdown = markdown.replace(/<h1[^>]*>(.*?)<\\/h1>/gi, '\\n# $1\\n');\n markdown = markdown.replace(/<h2[^>]*>(.*?)<\\/h2>/gi, '\\n## $1\\n');\n markdown = markdown.replace(/<h3[^>]*>(.*?)<\\/h3>/gi, '\\n### $1\\n');\n markdown = markdown.replace(/<h4[^>]*>(.*?)<\\/h4>/gi, '\\n#### $1\\n');\n markdown = markdown.replace(/<h5[^>]*>(.*?)<\\/h5>/gi, '\\n##### $1\\n');\n markdown = markdown.replace(/<h6[^>]*>(.*?)<\\/h6>/gi, '\\n###### $1\\n');\n\n // Bold and italic\n markdown = markdown.replace(/<(strong|b)[^>]*>(.*?)<\\/\\1>/gi, '**$2**');\n markdown = markdown.replace(/<(em|i)[^>]*>(.*?)<\\/\\1>/gi, '*$2*');\n\n // Links\n if (opts.convertLinks) {\n markdown = markdown.replace(/<a[^>]*href=[\"']([^\"']*)[\"'][^>]*>(.*?)<\\/a>/gi, '[$2]($1)');\n }\n\n // Images\n if (opts.convertImages) {\n markdown = markdown.replace(\n /<img[^>]*src=[\"']([^\"']*)[\"'][^>]*alt=[\"']([^\"']*)[\"'][^>]*\\/?>/gi,\n ''\n );\n markdown = markdown.replace(\n /<img[^>]*alt=[\"']([^\"']*)[\"'][^>]*src=[\"']([^\"']*)[\"'][^>]*\\/?>/gi,\n ''\n );\n markdown = markdown.replace(/<img[^>]*src=[\"']([^\"']*)[\"'][^>]*\\/?>/gi, '');\n }\n\n // Lists\n markdown = markdown.replace(/<ul[^>]*>/gi, '\\n');\n markdown = markdown.replace(/<\\/ul>/gi, '\\n');\n markdown = markdown.replace(/<ol[^>]*>/gi, '\\n');\n markdown = markdown.replace(/<\\/ol>/gi, '\\n');\n markdown = markdown.replace(/<li[^>]*>(.*?)<\\/li>/gi, '- $1\\n');\n\n // Blockquotes\n markdown = markdown.replace(/<blockquote[^>]*>(.*?)<\\/blockquote>/gis, (_, content) => {\n return '\\n> ' + content.trim().replace(/\\n/g, '\\n> ') + '\\n';\n });\n\n // Code blocks\n markdown = markdown.replace(/<pre[^>]*><code[^>]*>(.*?)<\\/code><\\/pre>/gis, '\\n```\\n$1\\n```\\n');\n markdown = markdown.replace(/<code[^>]*>(.*?)<\\/code>/gi, '`$1`');\n\n // Paragraphs and line breaks\n markdown = markdown.replace(/<p[^>]*>(.*?)<\\/p>/gis, '\\n$1\\n');\n markdown = markdown.replace(/<br\\s*\\/?>/gi, '\\n');\n\n // Horizontal rules\n markdown = markdown.replace(/<hr[^>]*\\/?>/gi, '\\n---\\n');\n\n // Strip remaining HTML tags\n markdown = markdown.replace(/<[^>]+>/g, '');\n\n // Decode HTML entities\n markdown = decodeHTMLEntities(markdown);\n\n // Clean up whitespace\n markdown = markdown.replace(/\\n{3,}/g, '\\n\\n');\n markdown = markdown.trim();\n\n return markdown;\n}\n\n/**\n * Client-side DOM-based conversion\n */\nfunction convertNode(node: Node, opts: HTMLToMarkdownOptions): string {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || '';\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n\n // Check for custom handler\n if (opts.customHandlers?.[tagName]) {\n return opts.customHandlers[tagName](element);\n }\n\n // Skip scripts and styles\n if (opts.stripScripts && (tagName === 'script' || tagName === 'style')) {\n return '';\n }\n\n const childContent = Array.from(element.childNodes)\n .map((child) => convertNode(child, opts))\n .join('');\n\n switch (tagName) {\n case 'h1':\n return `\\n# ${childContent.trim()}\\n`;\n case 'h2':\n return `\\n## ${childContent.trim()}\\n`;\n case 'h3':\n return `\\n### ${childContent.trim()}\\n`;\n case 'h4':\n return `\\n#### ${childContent.trim()}\\n`;\n case 'h5':\n return `\\n##### ${childContent.trim()}\\n`;\n case 'h6':\n return `\\n###### ${childContent.trim()}\\n`;\n case 'p':\n return `\\n${childContent.trim()}\\n`;\n case 'br':\n return opts.preserveLineBreaks ? '\\n' : ' ';\n case 'strong':\n case 'b':\n return `**${childContent}**`;\n case 'em':\n case 'i':\n return `*${childContent}*`;\n case 'u':\n return `_${childContent}_`;\n case 's':\n case 'strike':\n case 'del':\n return `~~${childContent}~~`;\n case 'a':\n if (opts.convertLinks) {\n const href = element.getAttribute('href') || '';\n return `[${childContent}](${href})`;\n }\n return childContent;\n case 'img':\n if (opts.convertImages) {\n const src = element.getAttribute('src') || '';\n const alt = element.getAttribute('alt') || '';\n return ``;\n }\n return '';\n case 'ul':\n return `\\n${childContent}\\n`;\n case 'ol':\n return `\\n${childContent}\\n`;\n case 'li':\n return `- ${childContent.trim()}\\n`;\n case 'blockquote':\n return `\\n> ${childContent.trim().replace(/\\n/g, '\\n> ')}\\n`;\n case 'pre':\n const codeElement = element.querySelector('code');\n const lang = codeElement?.className.match(/language-(\\w+)/)?.[1] || '';\n const code = codeElement?.textContent || childContent;\n return `\\n\\`\\`\\`${lang}\\n${code.trim()}\\n\\`\\`\\`\\n`;\n case 'code':\n // Check if inside pre\n if (element.parentElement?.tagName.toLowerCase() === 'pre') {\n return childContent;\n }\n return `\\`${childContent}\\``;\n case 'hr':\n return '\\n---\\n';\n case 'table':\n return convertTable(element);\n case 'div':\n case 'section':\n case 'article':\n case 'main':\n case 'aside':\n case 'header':\n case 'footer':\n case 'nav':\n return childContent;\n default:\n return childContent;\n }\n}\n\n/**\n * Convert HTML table to Markdown table\n */\nfunction convertTable(table: Element): string {\n const rows = table.querySelectorAll('tr');\n if (rows.length === 0) return '';\n\n let markdown = '\\n';\n let headerProcessed = false;\n\n rows.forEach((row, index) => {\n const cells = row.querySelectorAll('th, td');\n const rowContent = Array.from(cells)\n .map((cell) => cell.textContent?.trim() || '')\n .join(' | ');\n\n markdown += `| ${rowContent} |\\n`;\n\n // Add separator after header row\n if (!headerProcessed && (row.querySelector('th') || index === 0)) {\n const separator = Array.from(cells)\n .map(() => '---')\n .join(' | ');\n markdown += `| ${separator} |\\n`;\n headerProcessed = true;\n }\n });\n\n return markdown + '\\n';\n}\n\n/**\n * Decode HTML entities\n */\nfunction decodeHTMLEntities(text: string): string {\n const entities: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n ' ': ' ',\n '—': '—',\n '–': '–',\n '…': '…',\n '©': '©',\n '®': '®',\n '™': '™',\n };\n\n let result = text;\n for (const [entity, char] of Object.entries(entities)) {\n result = result.replace(new RegExp(entity, 'g'), char);\n }\n\n // Decode numeric entities\n result = result.replace(/&#(\\d+);/g, (_, num) => String.fromCharCode(parseInt(num, 10)));\n result = result.replace(/&#x([0-9a-f]+);/gi, (_, hex) =>\n String.fromCharCode(parseInt(hex, 16))\n );\n\n return result;\n}\n\n/**\n * Calculate word count from text\n */\nexport function countWords(text: string): number {\n return text\n .replace(/[^\\w\\s]/g, '')\n .split(/\\s+/)\n .filter((word) => word.length > 0).length;\n}\n\n/**\n * Calculate reading time in minutes\n */\nexport function calculateReadingTime(text: string, wordsPerMinute = 200): number {\n const words = countWords(text);\n return Math.ceil(words / wordsPerMinute);\n}\n\n/**\n * Extract headings from HTML for TOC\n */\nexport function extractHeadings(\n html: string,\n levels: string[] = ['h2', 'h3', 'h4']\n): Array<{ id: string; text: string; level: number }> {\n const headings: Array<{ id: string; text: string; level: number }> = [];\n const levelPattern = levels.join('|');\n const regex = new RegExp(\n `<(${levelPattern})[^>]*(?:id=[\"']([^\"']*)[\"'])?[^>]*>(.*?)<\\\\/\\\\1>`,\n 'gi'\n );\n\n let match;\n let index = 0;\n while ((match = regex.exec(html)) !== null) {\n const level = parseInt(match[1].charAt(1), 10);\n const id = match[2] || `heading-${index}`;\n const text = match[3].replace(/<[^>]+>/g, '').trim();\n\n headings.push({ id, text, level });\n index++;\n }\n\n return headings;\n}\n","'use client';\n\n/**\n * useLLMCopy Hook\n * Headless hook for copy/view/download functionality\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { LLMContent, UseLLMCopyOptions, UseLLMCopyReturn, CopyAction } from '../types';\nimport { copyToClipboard } from '../utils/clipboard';\nimport { downloadAsFile, generateFilename } from '../utils/download';\nimport { htmlToMarkdown, countWords, calculateReadingTime } from '../utils/html-to-markdown';\n\n/**\n * Generate markdown from LLMContent or string\n */\nfunction generateMarkdownFromContent(content: LLMContent | string): string {\n if (typeof content === 'string') {\n return content;\n }\n\n const parts: string[] = [];\n\n // Prompt prefix\n if (content.promptPrefix?.trim()) {\n parts.push(content.promptPrefix.trim());\n parts.push('');\n }\n\n // Title\n parts.push(`# ${content.title}`);\n parts.push('');\n\n // Excerpt\n if (content.excerpt) {\n parts.push(`> ${content.excerpt}`);\n parts.push('');\n }\n\n // Metadata\n parts.push('---');\n parts.push(`- **Source**: ${content.url}`);\n\n if (content.date) {\n parts.push(`- **Date**: ${content.date}`);\n }\n\n if (content.author) {\n parts.push(`- **Author**: ${content.author}`);\n }\n\n if (content.categories?.length) {\n parts.push(`- **Categories**: ${content.categories.join(', ')}`);\n }\n\n if (content.tags?.length) {\n parts.push(`- **Tags**: ${content.tags.join(', ')}`);\n }\n\n parts.push('---');\n parts.push('');\n\n // Content\n if (content.content) {\n const contentMarkdown =\n content.content.includes('<') && content.content.includes('>')\n ? htmlToMarkdown(content.content)\n : content.content;\n parts.push(contentMarkdown);\n }\n\n return parts.join('\\n').trim();\n}\n\n/**\n * Hook for LLM copy/view/download operations\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { copy, view, download, markdown, isCopying, isSuccess } = useLLMCopy({\n * content: {\n * title: 'My Article',\n * content: '<p>Article content...</p>',\n * url: 'https://example.com/article',\n * },\n * onSuccess: () => console.log('Copied!'),\n * });\n *\n * return (\n * <div>\n * <button onClick={copy} disabled={isCopying}>\n * {isSuccess ? 'Copied!' : 'Copy'}\n * </button>\n * <button onClick={download}>Download</button>\n * <pre>{view()}</pre>\n * </div>\n * );\n * }\n * ```\n */\nexport function useLLMCopy(options: UseLLMCopyOptions): UseLLMCopyReturn {\n const [isCopying, setIsCopying] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Generate markdown once\n const markdown = useMemo(() => {\n return generateMarkdownFromContent(options.content);\n }, [options.content]);\n\n // Track analytics event\n const trackEvent = useCallback(\n (action: CopyAction) => {\n if (options.onAnalytics) {\n const contentId =\n typeof options.content === 'string' ? undefined : options.content.url;\n\n options.onAnalytics({\n action,\n contentId,\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n timestamp: new Date().toISOString(),\n });\n }\n },\n [options]\n );\n\n // Copy to clipboard\n const copy = useCallback(async (): Promise<boolean> => {\n setIsCopying(true);\n setError(null);\n\n try {\n const success = await copyToClipboard(markdown);\n\n if (success) {\n setIsSuccess(true);\n trackEvent('copy');\n options.onSuccess?.('copy');\n\n // Reset success state after 2 seconds\n setTimeout(() => setIsSuccess(false), 2000);\n return true;\n } else {\n throw new Error('Failed to copy to clipboard');\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Copy failed');\n setError(error);\n options.onError?.(error);\n return false;\n } finally {\n setIsCopying(false);\n }\n }, [markdown, options, trackEvent]);\n\n // View markdown (returns the string)\n const view = useCallback((): string => {\n trackEvent('view');\n options.onSuccess?.('view');\n return markdown;\n }, [markdown, options, trackEvent]);\n\n // Download as file\n const download = useCallback(\n (filename?: string): void => {\n const title =\n typeof options.content === 'string' ? 'content' : options.content.title;\n\n downloadAsFile(markdown, {\n filename: filename || generateFilename(title),\n extension: 'md',\n });\n\n trackEvent('download');\n options.onSuccess?.('download');\n },\n [markdown, options, trackEvent]\n );\n\n return {\n copy,\n view,\n download,\n markdown,\n isCopying,\n isSuccess,\n error,\n };\n}\n\n/**\n * Get word count and reading time from content\n */\nexport function useContentStats(content: LLMContent | string) {\n return useMemo(() => {\n const markdown = generateMarkdownFromContent(content);\n const wordCount = countWords(markdown);\n const readingTime = calculateReadingTime(markdown);\n\n return { wordCount, readingTime };\n }, [content]);\n}\n","'use client';\n\n/**\n * useTOC Hook\n * Headless hook for Table of Contents functionality\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { TOCHeading, HeadingLevel, UseTOCOptions, UseTOCReturn } from '../types';\n\n/**\n * Hook for Table of Contents functionality\n *\n * @example\n * ```tsx\n * function ArticlePage() {\n * const contentRef = useRef<HTMLDivElement>(null);\n * const { headings, activeId, scrollTo } = useTOC({\n * contentRef,\n * levels: ['h2', 'h3'],\n * });\n *\n * return (\n * <div>\n * <nav>\n * {headings.map(h => (\n * <a\n * key={h.id}\n * href={`#${h.id}`}\n * onClick={(e) => { e.preventDefault(); scrollTo(h.id); }}\n * className={activeId === h.id ? 'active' : ''}\n * >\n * {h.text}\n * </a>\n * ))}\n * </nav>\n * <div ref={contentRef}>\n * <h2 id=\"intro\">Introduction</h2>\n * <p>Content...</p>\n * </div>\n * </div>\n * );\n * }\n * ```\n */\nexport function useTOC(options: UseTOCOptions): UseTOCReturn {\n const {\n contentRef,\n levels = ['h2', 'h3', 'h4'],\n rootMargin = '-100px 0px -80% 0px',\n threshold = 0,\n } = options;\n\n const [headings, setHeadings] = useState<TOCHeading[]>([]);\n const [activeId, setActiveId] = useState<string | null>(null);\n\n // Extract headings from content\n useEffect(() => {\n if (!contentRef?.current) return;\n\n const container = contentRef.current;\n const selector = levels.join(', ');\n const elements = container.querySelectorAll(selector);\n\n const extracted: TOCHeading[] = [];\n let index = 0;\n\n elements.forEach((el) => {\n const tagName = el.tagName.toLowerCase() as HeadingLevel;\n const level = parseInt(tagName.charAt(1), 10);\n const text = el.textContent?.trim() || '';\n\n // Generate or use existing ID\n let id = el.id;\n if (!id) {\n id = generateHeadingId(text, index);\n el.id = id;\n }\n\n extracted.push({ id, text, level });\n index++;\n });\n\n setHeadings(extracted);\n }, [contentRef, levels]);\n\n // Track active heading with Intersection Observer\n useEffect(() => {\n if (!contentRef?.current || headings.length === 0) return;\n\n const container = contentRef.current;\n const observerOptions = {\n root: null,\n rootMargin,\n threshold,\n };\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id);\n }\n });\n }, observerOptions);\n\n // Observe all headings\n headings.forEach((heading) => {\n const element = container.querySelector(`#${CSS.escape(heading.id)}`);\n if (element) {\n observer.observe(element);\n }\n });\n\n return () => observer.disconnect();\n }, [contentRef, headings, rootMargin, threshold]);\n\n // Scroll to heading\n const scrollTo = useCallback((id: string) => {\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n setActiveId(id);\n\n // Update URL hash without scrolling\n if (typeof window !== 'undefined') {\n window.history.pushState(null, '', `#${id}`);\n }\n }\n }, []);\n\n return { headings, activeId, scrollTo };\n}\n\n/**\n * Generate URL-friendly heading ID\n */\nfunction generateHeadingId(text: string, index: number): string {\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n .substring(0, 50);\n\n return slug || `heading-${index}`;\n}\n\n/**\n * Build nested TOC structure from flat headings\n */\nexport function buildNestedTOC(headings: TOCHeading[]): TOCHeading[] {\n if (headings.length === 0) return [];\n\n const result: TOCHeading[] = [];\n const stack: { heading: TOCHeading; level: number }[] = [];\n\n for (const heading of headings) {\n const item: TOCHeading = { ...heading, children: [] };\n\n // Pop items from stack until we find parent\n while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n result.push(item);\n } else {\n const parent = stack[stack.length - 1].heading;\n if (!parent.children) parent.children = [];\n parent.children.push(item);\n }\n\n stack.push({ heading: item, level: heading.level });\n }\n\n return result;\n}\n\n/**\n * Hook for keyboard navigation in TOC\n */\nexport function useTOCKeyboard(\n headings: TOCHeading[],\n activeId: string | null,\n scrollTo: (id: string) => void\n) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (headings.length === 0) return;\n\n const currentIndex = headings.findIndex((h) => h.id === activeId);\n\n if (e.key === 'ArrowDown' && e.altKey) {\n e.preventDefault();\n const nextIndex = Math.min(currentIndex + 1, headings.length - 1);\n scrollTo(headings[nextIndex].id);\n } else if (e.key === 'ArrowUp' && e.altKey) {\n e.preventDefault();\n const prevIndex = Math.max(currentIndex - 1, 0);\n scrollTo(headings[prevIndex].id);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [headings, activeId, scrollTo]);\n}\n","'use client';\n\n/**\n * useAnalytics Hook\n * Track LLM copy/view/download events\n */\n\nimport { useCallback, useRef } from 'react';\nimport type { AnalyticsEvent, CopyAction, UseAnalyticsOptions, UseAnalyticsReturn } from '../types';\n\n/**\n * Hook for analytics tracking\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { track, trackCopy, trackView, trackDownload } = useAnalytics({\n * endpoint: '/api/analytics',\n * metadata: { contentId: 'article-123' },\n * });\n *\n * return (\n * <button onClick={trackCopy}>Copy</button>\n * );\n * }\n * ```\n */\nexport function useAnalytics(options: UseAnalyticsOptions = {}): UseAnalyticsReturn {\n const {\n endpoint = '/api/llm-analytics',\n includeUrl = true,\n includeTimestamp = true,\n metadata = {},\n } = options;\n\n // Track pending requests to avoid duplicates\n const pendingRef = useRef<Set<string>>(new Set());\n\n // Generic track function\n const track = useCallback(\n async (event: AnalyticsEvent): Promise<void> => {\n // Create unique key for deduplication\n const key = `${event.action}-${event.contentId || ''}-${Date.now()}`;\n\n if (pendingRef.current.has(key)) {\n return;\n }\n\n pendingRef.current.add(key);\n\n try {\n const payload: AnalyticsEvent = {\n ...event,\n ...(includeUrl && { url: event.url || window.location.href }),\n ...(includeTimestamp && { timestamp: event.timestamp || new Date().toISOString() }),\n metadata: { ...metadata, ...event.metadata },\n };\n\n // Use sendBeacon for reliability (won't be cancelled on page unload)\n if (navigator.sendBeacon) {\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\n navigator.sendBeacon(endpoint, blob);\n } else {\n // Fallback to fetch\n await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n }\n } catch (error) {\n console.error('Analytics tracking failed:', error);\n } finally {\n pendingRef.current.delete(key);\n }\n },\n [endpoint, includeUrl, includeTimestamp, metadata]\n );\n\n // Convenience methods for each action type\n const trackCopy = useCallback(() => {\n return track({ action: 'copy' });\n }, [track]);\n\n const trackView = useCallback(() => {\n return track({ action: 'view' });\n }, [track]);\n\n const trackDownload = useCallback(() => {\n return track({ action: 'download' });\n }, [track]);\n\n return { track, trackCopy, trackView, trackDownload };\n}\n\n/**\n * Create a simple analytics tracker function (non-hook version)\n */\nexport function createAnalyticsTracker(endpoint: string) {\n return async function trackEvent(\n action: CopyAction,\n contentId?: string,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n const payload: AnalyticsEvent = {\n action,\n contentId,\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n timestamp: new Date().toISOString(),\n metadata,\n };\n\n try {\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\n navigator.sendBeacon(endpoint, blob);\n } else if (typeof fetch !== 'undefined') {\n await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n }\n } catch (error) {\n console.error('Analytics tracking failed:', error);\n }\n };\n}\n"]}
|