@fragments-sdk/ui 0.9.6 → 0.10.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.
Files changed (78) hide show
  1. package/README.md +32 -24
  2. package/dist/codeblock.cjs +25 -29
  3. package/dist/codeblock.cjs.map +1 -1
  4. package/dist/codeblock.js +25 -29
  5. package/dist/codeblock.js.map +1 -1
  6. package/dist/components/Chip/index.cjs +2 -1
  7. package/dist/components/Chip/index.cjs.map +1 -1
  8. package/dist/components/Chip/index.d.ts.map +1 -1
  9. package/dist/components/Chip/index.js +2 -1
  10. package/dist/components/Chip/index.js.map +1 -1
  11. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  12. package/dist/components/Command/index.cjs +6 -0
  13. package/dist/components/Command/index.cjs.map +1 -1
  14. package/dist/components/Command/index.d.ts.map +1 -1
  15. package/dist/components/Command/index.js +6 -0
  16. package/dist/components/Command/index.js.map +1 -1
  17. package/dist/components/DataTable/index.cjs +26 -26
  18. package/dist/components/DataTable/index.cjs.map +1 -1
  19. package/dist/components/DataTable/index.d.ts.map +1 -1
  20. package/dist/components/DataTable/index.js +26 -26
  21. package/dist/components/DataTable/index.js.map +1 -1
  22. package/dist/components/Listbox/index.cjs +6 -0
  23. package/dist/components/Listbox/index.cjs.map +1 -1
  24. package/dist/components/Listbox/index.d.ts.map +1 -1
  25. package/dist/components/Listbox/index.js +6 -0
  26. package/dist/components/Listbox/index.js.map +1 -1
  27. package/dist/components/Loading/index.cjs +2 -12
  28. package/dist/components/Loading/index.cjs.map +1 -1
  29. package/dist/components/Loading/index.d.ts.map +1 -1
  30. package/dist/components/Loading/index.js +2 -12
  31. package/dist/components/Loading/index.js.map +1 -1
  32. package/dist/components/NavigationMenu/index.cjs +12 -1
  33. package/dist/components/NavigationMenu/index.cjs.map +1 -1
  34. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  35. package/dist/components/NavigationMenu/index.js +12 -1
  36. package/dist/components/NavigationMenu/index.js.map +1 -1
  37. package/dist/components/Skeleton/index.cjs +3 -3
  38. package/dist/components/Skeleton/index.cjs.map +1 -1
  39. package/dist/components/Skeleton/index.js +3 -3
  40. package/dist/components/Skeleton/index.js.map +1 -1
  41. package/dist/components/Stack/index.cjs +4 -3
  42. package/dist/components/Stack/index.cjs.map +1 -1
  43. package/dist/components/Stack/index.d.ts.map +1 -1
  44. package/dist/components/Stack/index.js +4 -3
  45. package/dist/components/Stack/index.js.map +1 -1
  46. package/dist/components/Theme/index.cjs +86 -1
  47. package/dist/components/Theme/index.cjs.map +1 -1
  48. package/dist/components/Theme/index.d.ts +44 -1
  49. package/dist/components/Theme/index.d.ts.map +1 -1
  50. package/dist/components/Theme/index.js +86 -1
  51. package/dist/components/Theme/index.js.map +1 -1
  52. package/dist/index.cjs +2 -0
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +3 -1
  57. package/dist/markdown.cjs +1 -1
  58. package/dist/markdown.cjs.map +1 -1
  59. package/dist/markdown.js +1 -1
  60. package/dist/markdown.js.map +1 -1
  61. package/fragments.json +1 -1
  62. package/package.json +6 -2
  63. package/src/components/Chip/index.tsx +3 -1
  64. package/src/components/CodeBlock/index.tsx +35 -41
  65. package/src/components/ColorPicker/ColorPicker.fragment.tsx +17 -15
  66. package/src/components/Command/index.tsx +1 -0
  67. package/src/components/DataTable/index.tsx +45 -45
  68. package/src/components/Listbox/index.tsx +1 -0
  69. package/src/components/Loading/index.tsx +6 -12
  70. package/src/components/Markdown/index.tsx +2 -2
  71. package/src/components/Menu/Menu.fragment.tsx +17 -15
  72. package/src/components/NavigationMenu/index.tsx +6 -1
  73. package/src/components/Skeleton/index.tsx +3 -3
  74. package/src/components/Slider/Slider.fragment.tsx +19 -17
  75. package/src/components/Stack/index.tsx +4 -3
  76. package/src/components/Theme/index.tsx +168 -1
  77. package/src/index.ts +6 -0
  78. package/src/tokens/_seeds.scss +20 -0
@@ -1 +1 @@
1
- {"version":3,"file":"codeblock.js","sources":["../src/components/CodeBlock/index.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\n// ============================================\n// Lazy-loaded dependency (shiki)\n// ============================================\n\nlet _codeToHtml:\n | ((code: string, options: { lang: string; theme: string }) => Promise<string>)\n | null = null;\nlet _shikiLoaded = false;\nlet _shikiFailed = false;\n\nfunction loadShikiDeps() {\n if (_shikiLoaded) return;\n _shikiLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const shiki = require(\"shiki\");\n _codeToHtml = shiki.codeToHtml;\n } catch {\n _shikiFailed = true;\n }\n}\nimport { TabsRoot, TabsList, Tab, TabsPanel } from \"../Tabs\";\nimport { Button } from \"../Button\";\nimport styles from \"./CodeBlock.module.scss\";\nimport \"../../styles/globals.scss\";\n\nexport type CodeBlockLanguage =\n | \"tsx\"\n | \"typescript\"\n | \"javascript\"\n | \"jsx\"\n | \"bash\"\n | \"shell\"\n | \"css\"\n | \"scss\"\n | \"sass\"\n | \"json\"\n | \"html\"\n | \"xml\"\n | \"markdown\"\n | \"md\"\n | \"yaml\"\n | \"yml\"\n | \"python\"\n | \"py\"\n | \"ruby\"\n | \"go\"\n | \"rust\"\n | \"java\"\n | \"kotlin\"\n | \"swift\"\n | \"c\"\n | \"cpp\"\n | \"csharp\"\n | \"php\"\n | \"sql\"\n | \"graphql\"\n | \"diff\"\n | \"plaintext\";\n\n/** Available syntax highlighting themes */\nexport type CodeBlockTheme =\n | \"synthwave-84\"\n | \"github-dark\"\n | \"github-light\"\n | \"one-dark-pro\"\n | \"dracula\"\n | \"nord\"\n | \"monokai\"\n | \"vitesse-dark\"\n | \"vitesse-light\"\n | \"min-dark\"\n | \"min-light\";\n\nexport type CodeBlockCopyPlacement = \"auto\" | \"header\" | \"overlay\";\n\nexport interface CodeBlockProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Code string to display */\n code: string;\n /** Programming language for syntax highlighting */\n language?: CodeBlockLanguage;\n /** Syntax highlighting theme */\n theme?: CodeBlockTheme;\n /** Show copy button */\n showCopy?: boolean;\n /** Optional title above code block (external label) */\n title?: string;\n /** Optional filename shown in header bar inside code block */\n filename?: string;\n /** Optional caption below code block */\n caption?: string;\n /** Show line numbers */\n showLineNumbers?: boolean;\n /** Starting line number (default: 1) */\n startLineNumber?: number;\n /** Highlight specific lines (e.g., [1, 3, '5-7']) */\n highlightLines?: (number | string)[];\n /** Lines marked as added in diff view */\n addedLines?: (number | string)[];\n /** Lines marked as removed in diff view */\n removedLines?: (number | string)[];\n /** Enable word wrapping for long lines */\n wordWrap?: boolean;\n /** Maximum height in pixels (enables scrolling) */\n maxHeight?: number;\n /** Allow collapsing/expanding the code block */\n collapsible?: boolean;\n /** Initial collapsed state (only applies when collapsible is true) */\n defaultCollapsed?: boolean;\n /** Number of lines to show when collapsed */\n collapsedLines?: number;\n /** Compact mode with reduced padding */\n compact?: boolean;\n /** Show a persistent copy button (always visible, uses Button component) */\n persistentCopy?: boolean;\n /** Placement of copy button when not using persistent copy */\n copyPlacement?: CodeBlockCopyPlacement;\n /** Callback fired when the copy button is clicked and copy succeeds */\n onCopy?: () => void;\n}\n\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n\nfunction ChevronUpIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n );\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\n/**\n * Remove common leading whitespace from all lines (dedent).\n * This handles template literals that have extra indentation from code formatting.\n */\nfunction dedent(str: string): string {\n const lines = str.split(\"\\n\");\n\n // Find the minimum indentation (ignoring empty lines)\n let minIndent = Infinity;\n for (const line of lines) {\n if (line.trim() === \"\") continue;\n const match = line.match(/^(\\s*)/);\n if (match) {\n minIndent = Math.min(minIndent, match[1].length);\n }\n }\n\n // If no indentation found, return as-is\n if (minIndent === Infinity || minIndent === 0) {\n return str;\n }\n\n // Remove the common indentation from all lines\n return lines.map((line) => line.slice(minIndent)).join(\"\\n\");\n}\n\n/**\n * Normalize indentation while handling JSX where first line is already at column 0.\n */\nfunction normalizeIndentation(str: string): string {\n const lines = str.split(\"\\n\");\n if (lines.length <= 1) return str;\n\n let minIndent = Infinity;\n const firstLineIndent = lines[0].match(/^(\\s*)/)?.[1].length ?? 0;\n\n for (let i = 1; i < lines.length; i += 1) {\n const line = lines[i];\n if (line.trim().length === 0) continue;\n const indent = line.match(/^(\\s*)/)?.[1].length ?? 0;\n minIndent = Math.min(minIndent, indent);\n }\n\n if (firstLineIndent > 0) {\n minIndent = Math.min(minIndent, firstLineIndent);\n }\n\n if (minIndent === Infinity || minIndent === 0) return str;\n\n return lines\n .map((line) => line.slice(Math.min(minIndent, line.match(/^(\\s*)/)?.[1].length ?? 0)))\n .join(\"\\n\");\n}\n\nfunction trimTrailingWhitespace(str: string): string {\n return str\n .split(\"\\n\")\n .map((line) => line.replace(/[ \\t]+$/g, \"\"))\n .join(\"\\n\");\n}\n\nfunction findTagEnd(line: string): number {\n let quote: '\"' | \"'\" | \"`\" | null = null;\n let escaped = false;\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n\n for (let i = 1; i < line.length; i += 1) {\n const char = line[i];\n\n if (quote) {\n if (char === \"\\\\\" && !escaped) {\n escaped = true;\n continue;\n }\n if (char === quote && !escaped) {\n quote = null;\n }\n escaped = false;\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n continue;\n }\n\n if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \">\" && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction splitJsxAttributes(attrs: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let quote: '\"' | \"'\" | \"`\" | null = null;\n let escaped = false;\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n\n for (const char of attrs) {\n if (quote) {\n current += char;\n if (char === \"\\\\\" && !escaped) {\n escaped = true;\n continue;\n }\n if (char === quote && !escaped) {\n quote = null;\n }\n escaped = false;\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n current += char;\n continue;\n }\n\n if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n\n if (/\\s/.test(char) && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n if (current.trim().length > 0) {\n parts.push(current.trim());\n current = \"\";\n }\n continue;\n }\n\n current += char;\n }\n\n if (current.trim().length > 0) {\n parts.push(current.trim());\n }\n\n return parts;\n}\n\nfunction formatLongJsxTagLine(line: string): string {\n const maxInlineLength = 110;\n if (line.length <= maxInlineLength) return line;\n\n const indent = line.match(/^(\\s*)/)?.[1] ?? \"\";\n const trimmed = line.trimStart();\n\n if (\n !trimmed.startsWith(\"<\") ||\n trimmed.startsWith(\"</\") ||\n trimmed.startsWith(\"<!\") ||\n trimmed.startsWith(\"<?\")\n ) {\n return line;\n }\n\n const tagEnd = findTagEnd(trimmed);\n if (tagEnd === -1) return line;\n if (trimmed.slice(tagEnd + 1).trim().length > 0) return line;\n\n const rawTagBody = trimmed.slice(1, tagEnd).trim();\n const isSelfClosing = rawTagBody.endsWith(\"/\");\n const tagBody = isSelfClosing ? rawTagBody.slice(0, -1).trimEnd() : rawTagBody;\n const firstSpace = tagBody.search(/\\s/);\n if (firstSpace === -1) return line;\n\n const tagName = tagBody.slice(0, firstSpace);\n if (!/^[A-Za-z][\\w.:-]*$/.test(tagName)) return line;\n\n const attrsSource = tagBody.slice(firstSpace).trim();\n if (!attrsSource.includes(\"=\") && !attrsSource.includes(\"{...\")) return line;\n\n const attrs = splitJsxAttributes(attrsSource);\n if (attrs.length === 0) return line;\n\n const attrIndent = `${indent} `;\n const close = isSelfClosing ? \"/>\" : \">\";\n\n return [\n `${indent}<${tagName}`,\n ...attrs.map((attr) => `${attrIndent}${attr}`),\n `${indent}${close}`,\n ].join(\"\\n\");\n}\n\nfunction formatLongJsxTags(code: string): string {\n return code\n .split(\"\\n\")\n .flatMap((line) => formatLongJsxTagLine(line).split(\"\\n\"))\n .join(\"\\n\");\n}\n\nfunction normalizeCode(code: string): string {\n const trimmed = code.trim();\n if (trimmed.length === 0) return \"\";\n\n const normalized = normalizeIndentation(trimmed);\n const dedented = dedent(normalized);\n const withoutTrailingWhitespace = trimTrailingWhitespace(dedented);\n return formatLongJsxTags(withoutTrailingWhitespace);\n}\n\n/**\n * Parse line specification into a Set of line numbers.\n * Supports: [1, 3, '5-7'] -> Set {1, 3, 5, 6, 7}\n */\nfunction parseLineSpec(spec?: (number | string)[]): Set<number> {\n const lines = new Set<number>();\n if (!spec) return lines;\n\n for (const item of spec) {\n if (typeof item === \"number\") {\n lines.add(item);\n } else if (typeof item === \"string\") {\n const rangeMatch = item.match(/^(\\d+)-(\\d+)$/);\n if (rangeMatch) {\n const start = parseInt(rangeMatch[1], 10);\n const end = parseInt(rangeMatch[2], 10);\n for (let i = start; i <= end; i++) {\n lines.add(i);\n }\n } else {\n const num = parseInt(item, 10);\n if (!isNaN(num)) {\n lines.add(num);\n }\n }\n }\n }\n\n return lines;\n}\n\ninterface ProcessOptions {\n showLineNumbers: boolean;\n startLineNumber: number;\n highlightLines: Set<number>;\n addedLines: Set<number>;\n removedLines: Set<number>;\n}\n\n/**\n * Add line numbers, highlight classes, and diff markers to Shiki HTML output.\n */\nfunction processShikiHtml(html: string, options: ProcessOptions): string {\n const { showLineNumbers, startLineNumber, highlightLines, addedLines, removedLines } = options;\n const hasDiff = addedLines.size > 0 || removedLines.size > 0;\n\n if (!showLineNumbers && highlightLines.size === 0 && !hasDiff) {\n return html;\n }\n\n // Extract the code content from Shiki output\n // Shiki outputs: <pre class=\"shiki ...\"><code>...lines...</code></pre>\n const codeMatch = html.match(/<code[^>]*>([\\s\\S]*?)<\\/code>/);\n if (!codeMatch) return html;\n\n const codeContent = codeMatch[1];\n const lines = codeContent.split(\"\\n\");\n\n // Process each line\n const processedLines = lines.map((line, index) => {\n const lineNum = index + 1;\n const displayLineNum = startLineNumber + index;\n const isHighlighted = highlightLines.has(lineNum);\n const isAdded = addedLines.has(lineNum);\n const isRemoved = removedLines.has(lineNum);\n\n const lineClasses = [\"line\"];\n if (isHighlighted) lineClasses.push(\"highlighted\");\n if (isAdded) lineClasses.push(\"diff-added\");\n if (isRemoved) lineClasses.push(\"diff-removed\");\n\n const lineClass = lineClasses.join(\" \");\n const diffMarker = isAdded ? \"+\" : isRemoved ? \"-\" : \" \";\n\n if (showLineNumbers || hasDiff) {\n const lineNumHtml = showLineNumbers\n ? `<span class=\"line-number\">${displayLineNum}</span>`\n : \"\";\n const diffMarkerHtml = hasDiff ? `<span class=\"diff-marker\">${diffMarker}</span>` : \"\";\n return `<span class=\"${lineClass}\">${lineNumHtml}${diffMarkerHtml}${line}</span>`;\n }\n return `<span class=\"${lineClass}\">${line}</span>`;\n });\n\n // Reconstruct the HTML\n return html.replace(/<code[^>]*>[\\s\\S]*?<\\/code>/, `<code>${processedLines.join(\"\\n\")}</code>`);\n}\n\nconst CodeBlockBase = React.forwardRef<HTMLDivElement, CodeBlockProps>(function CodeBlock(\n {\n code,\n language = \"tsx\",\n theme = \"one-dark-pro\",\n showCopy = true,\n title,\n filename,\n caption,\n showLineNumbers = false,\n startLineNumber = 1,\n highlightLines,\n addedLines,\n removedLines,\n wordWrap = false,\n maxHeight,\n collapsible = false,\n defaultCollapsed = false,\n collapsedLines = 5,\n compact = false,\n persistentCopy = false,\n copyPlacement = \"auto\",\n onCopy,\n className,\n ...htmlProps\n },\n ref\n) {\n const [copied, setCopied] = useState(false);\n const [highlightedHtml, setHighlightedHtml] = useState<string>(\"\");\n const [isLoading, setIsLoading] = useState(true);\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const trimmedCode = useMemo(() => normalizeCode(code), [code]);\n const codeLines = trimmedCode.split(\"\\n\");\n const totalLines = codeLines.length;\n const shouldShowCollapse = collapsible && totalLines > collapsedLines;\n\n // Compute visible code when collapsed\n const visibleCode =\n shouldShowCollapse && isCollapsed ? codeLines.slice(0, collapsedLines).join(\"\\n\") : trimmedCode;\n\n const highlightSet = useMemo(() => parseLineSpec(highlightLines), [highlightLines]);\n const addedSet = useMemo(() => parseLineSpec(addedLines), [addedLines]);\n const removedSet = useMemo(() => parseLineSpec(removedLines), [removedLines]);\n const hasDiff = addedSet.size > 0 || removedSet.size > 0;\n const resolvedCopyPlacement =\n copyPlacement === \"auto\" ? (filename ? \"header\" : \"overlay\") : copyPlacement;\n const shouldShowHeaderCopy = showCopy && !persistentCopy && resolvedCopyPlacement === \"header\";\n const shouldShowOverlayCopy = showCopy && !persistentCopy && resolvedCopyPlacement === \"overlay\";\n const shouldRenderHeader = Boolean(filename) || shouldShowHeaderCopy;\n\n // Apply syntax highlighting\n useEffect(() => {\n let cancelled = false;\n setIsLoading(true);\n\n loadShikiDeps();\n\n if (_shikiFailed || !_codeToHtml) {\n if (_shikiFailed && process.env.NODE_ENV === \"development\") {\n console.warn(\n \"[@fragments-sdk/ui] CodeBlock: shiki is not installed. \" +\n \"Install it with: npm install shiki\"\n );\n }\n // Fallback to plain text without syntax highlighting\n setHighlightedHtml(`<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`);\n setIsLoading(false);\n return;\n }\n\n _codeToHtml(visibleCode, {\n lang: language,\n theme,\n })\n .then((html) => {\n if (!cancelled) {\n const processed = processShikiHtml(html, {\n showLineNumbers,\n startLineNumber,\n highlightLines: highlightSet,\n addedLines: addedSet,\n removedLines: removedSet,\n });\n setHighlightedHtml(processed);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Syntax highlighting failed:\", err);\n }\n if (!cancelled) {\n // Fallback to plain text\n setHighlightedHtml(`<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`);\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n visibleCode,\n language,\n theme,\n showLineNumbers,\n startLineNumber,\n highlightSet,\n addedSet,\n removedSet,\n ]);\n\n const handleCopy = useCallback(async () => {\n try {\n // Always copy the full code, even when collapsed\n await navigator.clipboard.writeText(trimmedCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onCopy?.();\n } catch (err) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Failed to copy:\", err);\n }\n }\n }, [trimmedCode, onCopy]);\n\n const toggleCollapsed = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n const classNames = [\n styles.container,\n showLineNumbers && styles.withLineNumbers,\n hasDiff && styles.withDiff,\n wordWrap && styles.wordWrap,\n compact && styles.compact,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const wrapperClasses = [\n styles.wrapper,\n persistentCopy && styles.persistentCopyWrapper,\n shouldShowOverlayCopy && styles.withCopyOverlay,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const codeContainerStyle: React.CSSProperties = maxHeight ? { maxHeight, overflow: \"auto\" } : {};\n\n return (\n <div ref={ref} {...htmlProps} className={classNames} data-theme=\"dark\">\n {title && <div className={styles.title}>{title}</div>}\n <div className={wrapperClasses}>\n {shouldRenderHeader && (\n <div className={styles.header}>\n <span className={styles.filename}>{filename ?? \"\"}</span>\n {shouldShowHeaderCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`${styles.copyButton} ${copied ? styles.copied : \"\"}`}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? (\n <CheckIcon className={styles.icon} />\n ) : (\n <CopyIcon className={styles.icon} />\n )}\n </button>\n )}\n </div>\n )}\n {shouldShowOverlayCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`${styles.copyButton} ${styles.copyOverlay} ${copied ? styles.copied : \"\"}`}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\n </button>\n )}\n {isLoading ? (\n <div className={styles.loading} style={codeContainerStyle}>\n <pre>\n <code>{visibleCode}</code>\n </pre>\n </div>\n ) : (\n <div\n className={styles.codeContainer}\n style={codeContainerStyle}\n dangerouslySetInnerHTML={{ __html: highlightedHtml }}\n />\n )}\n {persistentCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`${styles.persistentCopy} ${styles.copyButton} ${styles.copyOverlay} ${copied ? styles.copied : \"\"}`}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\n </button>\n )}\n {shouldShowCollapse && (\n <button\n type=\"button\"\n onClick={toggleCollapsed}\n className={styles.collapseButton}\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand code\" : \"Collapse code\"}\n >\n {isCollapsed ? (\n <>\n <ChevronDownIcon className={styles.icon} />\n <span>Show {totalLines - collapsedLines} more lines</span>\n </>\n ) : (\n <>\n <ChevronUpIcon className={styles.icon} />\n <span>Show less</span>\n </>\n )}\n </button>\n )}\n </div>\n {caption && <div className={styles.caption}>{caption}</div>}\n </div>\n );\n});\n\n// ============================================\n// Tabbed Code Block\n// ============================================\n\nexport interface CodeBlockTab {\n /** Label shown in the tab */\n label: string;\n /** Code string to display */\n code: string;\n /** Programming language for syntax highlighting */\n language?: CodeBlockLanguage;\n}\n\nexport interface TabbedCodeBlockProps {\n /** Array of code tabs */\n tabs: CodeBlockTab[];\n /** Default selected tab (by label) */\n defaultTab?: string;\n /** Show copy button */\n showCopy?: boolean;\n /** Placement of copy button when not using persistent copy */\n copyPlacement?: CodeBlockCopyPlacement;\n /** Show line numbers */\n showLineNumbers?: boolean;\n /** Syntax highlighting theme (applies to all tabs) */\n theme?: CodeBlockTheme;\n /** Tab list visual style */\n tabsVariant?: \"underline\" | \"pills\";\n /** Enable word wrapping for long lines */\n wordWrap?: boolean;\n /** Maximum height in pixels (enables scrolling) */\n maxHeight?: number;\n /** Additional class name */\n className?: string;\n /** Callback fired when a tab's copy button is clicked. Receives the tab label. */\n onCopy?: (tabLabel: string) => void;\n}\n\nfunction TabbedCodeBlock({\n tabs,\n defaultTab,\n showCopy = true,\n copyPlacement = \"auto\",\n showLineNumbers = false,\n theme,\n tabsVariant = \"pills\",\n wordWrap,\n maxHeight,\n className,\n onCopy,\n}: TabbedCodeBlockProps) {\n const defaultValue = defaultTab || tabs[0]?.label || \"\";\n\n return (\n <div className={className}>\n <TabsRoot defaultValue={defaultValue}>\n <TabsList variant={tabsVariant}>\n {tabs.map((tab) => (\n <Tab key={tab.label} value={tab.label}>\n {tab.label}\n </Tab>\n ))}\n </TabsList>\n {tabs.map((tab) => (\n <TabsPanel key={tab.label} value={tab.label} flush className={styles.tabbedPanel}>\n <CodeBlockBase\n code={tab.code}\n language={tab.language}\n theme={theme}\n showCopy={showCopy}\n copyPlacement={copyPlacement}\n showLineNumbers={showLineNumbers}\n wordWrap={wordWrap}\n maxHeight={maxHeight}\n onCopy={onCopy ? () => onCopy(tab.label) : undefined}\n />\n </TabsPanel>\n ))}\n </TabsRoot>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const CodeBlock = Object.assign(CodeBlockBase, {\n Tabbed: TabbedCodeBlock,\n});\n\nexport { TabbedCodeBlock };\n"],"names":["_a","CodeBlock"],"mappings":";;;;;;AAQA,IAAI,cAEO;AACX,IAAI,eAAe;AACnB,IAAI,eAAe;AAEnB,SAAS,gBAAgB;AACvB,MAAI,aAAc;AAClB,iBAAe;AACf,MAAI;AAEF,UAAM,QAAQ,QAAQ,OAAO;AAC7B,kBAAc,MAAM;AAAA,EACtB,QAAQ;AACN,mBAAe;AAAA,EACjB;AACF;AAqGA,SAAS,SAAS,EAAE,aAAqC;AACvD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,QACvD,oBAAC,QAAA,EAAK,GAAE,0DAAA,CAA0D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGxE;AAEA,SAAS,UAAU,EAAE,aAAqC;AACxD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,UAAA,oBAAC,YAAA,EAAS,QAAO,iBAAA,CAAiB;AAAA,IAAA;AAAA,EAAA;AAGxC;AAEA,SAAS,gBAAgB,EAAE,aAAqC;AAC9D,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,UAAA,oBAAC,YAAA,EAAS,QAAO,iBAAA,CAAiB;AAAA,IAAA;AAAA,EAAA;AAGxC;AAEA,SAAS,cAAc,EAAE,aAAqC;AAC5D,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ,UAAA,oBAAC,YAAA,EAAS,QAAO,kBAAA,CAAkB;AAAA,IAAA;AAAA,EAAA;AAGzC;AAEA,SAAS,WAAW,KAAqB;AACvC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AAMA,SAAS,OAAO,KAAqB;AACnC,QAAM,QAAQ,IAAI,MAAM,IAAI;AAG5B,MAAI,YAAY;AAChB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,KAAA,MAAW,GAAI;AACxB,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,QAAI,OAAO;AACT,kBAAY,KAAK,IAAI,WAAW,MAAM,CAAC,EAAE,MAAM;AAAA,IACjD;AAAA,EACF;AAGA,MAAI,cAAc,YAAY,cAAc,GAAG;AAC7C,WAAO;AAAA,EACT;AAGA,SAAO,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,SAAS,CAAC,EAAE,KAAK,IAAI;AAC7D;AAKA,SAAS,qBAAqB,KAAqB;;AACjD,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,MAAI,MAAM,UAAU,EAAG,QAAO;AAE9B,MAAI,YAAY;AAChB,QAAM,oBAAkB,WAAM,CAAC,EAAE,MAAM,QAAQ,MAAvB,mBAA2B,GAAG,WAAU;AAEhE,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,OAAO,WAAW,EAAG;AAC9B,UAAM,WAAS,UAAK,MAAM,QAAQ,MAAnB,mBAAuB,GAAG,WAAU;AACnD,gBAAY,KAAK,IAAI,WAAW,MAAM;AAAA,EACxC;AAEA,MAAI,kBAAkB,GAAG;AACvB,gBAAY,KAAK,IAAI,WAAW,eAAe;AAAA,EACjD;AAEA,MAAI,cAAc,YAAY,cAAc,EAAG,QAAO;AAEtD,SAAO,MACJ,IAAI,CAAC,SAAA;;AAAS,gBAAK,MAAM,KAAK,IAAI,aAAWA,MAAA,KAAK,MAAM,QAAQ,MAAnB,gBAAAA,IAAuB,GAAG,WAAU,CAAC,CAAC;AAAA,GAAC,EACpF,KAAK,IAAI;AACd;AAEA,SAAS,uBAAuB,KAAqB;AACnD,SAAO,IACJ,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,QAAQ,YAAY,EAAE,CAAC,EAC1C,KAAK,IAAI;AACd;AAEA,SAAS,WAAW,MAAsB;AACxC,MAAI,QAAgC;AACpC,MAAI,UAAU;AACd,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,aAAa;AAEjB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,OAAO,KAAK,CAAC;AAEnB,QAAI,OAAO;AACT,UAAI,SAAS,QAAQ,CAAC,SAAS;AAC7B,kBAAU;AACV;AAAA,MACF;AACA,UAAI,SAAS,SAAS,CAAC,SAAS;AAC9B,gBAAQ;AAAA,MACV;AACA,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAChD,cAAQ;AACR;AAAA,IACF;AAEA,QAAI,SAAS,IAAK,eAAc;AAAA,aACvB,SAAS,IAAK,cAAa,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,aACrD,SAAS,IAAK,iBAAgB;AAAA,aAC9B,SAAS,IAAK,gBAAe,KAAK,IAAI,GAAG,eAAe,CAAC;AAAA,aACzD,SAAS,IAAK,eAAc;AAAA,aAC5B,SAAS,IAAK,cAAa,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,aACrD,SAAS,OAAO,eAAe,KAAK,iBAAiB,KAAK,eAAe,GAAG;AACnF,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAyB;AACnD,QAAM,QAAkB,CAAA;AACxB,MAAI,UAAU;AACd,MAAI,QAAgC;AACpC,MAAI,UAAU;AACd,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO;AACT,iBAAW;AACX,UAAI,SAAS,QAAQ,CAAC,SAAS;AAC7B,kBAAU;AACV;AAAA,MACF;AACA,UAAI,SAAS,SAAS,CAAC,SAAS;AAC9B,gBAAQ;AAAA,MACV;AACA,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAChD,cAAQ;AACR,iBAAW;AACX;AAAA,IACF;AAEA,QAAI,SAAS,IAAK,eAAc;AAAA,aACvB,SAAS,IAAK,cAAa,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,aACrD,SAAS,IAAK,iBAAgB;AAAA,aAC9B,SAAS,IAAK,gBAAe,KAAK,IAAI,GAAG,eAAe,CAAC;AAAA,aACzD,SAAS,IAAK,eAAc;AAAA,aAC5B,SAAS,IAAK,cAAa,KAAK,IAAI,GAAG,aAAa,CAAC;AAE9D,QAAI,KAAK,KAAK,IAAI,KAAK,eAAe,KAAK,iBAAiB,KAAK,eAAe,GAAG;AACjF,UAAI,QAAQ,OAAO,SAAS,GAAG;AAC7B,cAAM,KAAK,QAAQ,MAAM;AACzB,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AAEA,eAAW;AAAA,EACb;AAEA,MAAI,QAAQ,OAAO,SAAS,GAAG;AAC7B,UAAM,KAAK,QAAQ,MAAM;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAsB;;AAClD,QAAM,kBAAkB;AACxB,MAAI,KAAK,UAAU,gBAAiB,QAAO;AAE3C,QAAM,WAAS,UAAK,MAAM,QAAQ,MAAnB,mBAAuB,OAAM;AAC5C,QAAM,UAAU,KAAK,UAAA;AAErB,MACE,CAAC,QAAQ,WAAW,GAAG,KACvB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,IAAI,GACvB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,WAAW,OAAO;AACjC,MAAI,WAAW,GAAI,QAAO;AAC1B,MAAI,QAAQ,MAAM,SAAS,CAAC,EAAE,OAAO,SAAS,EAAG,QAAO;AAExD,QAAM,aAAa,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAA;AAC5C,QAAM,gBAAgB,WAAW,SAAS,GAAG;AAC7C,QAAM,UAAU,gBAAgB,WAAW,MAAM,GAAG,EAAE,EAAE,YAAY;AACpE,QAAM,aAAa,QAAQ,OAAO,IAAI;AACtC,MAAI,eAAe,GAAI,QAAO;AAE9B,QAAM,UAAU,QAAQ,MAAM,GAAG,UAAU;AAC3C,MAAI,CAAC,qBAAqB,KAAK,OAAO,EAAG,QAAO;AAEhD,QAAM,cAAc,QAAQ,MAAM,UAAU,EAAE,KAAA;AAC9C,MAAI,CAAC,YAAY,SAAS,GAAG,KAAK,CAAC,YAAY,SAAS,MAAM,EAAG,QAAO;AAExE,QAAM,QAAQ,mBAAmB,WAAW;AAC5C,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,aAAa,GAAG,MAAM;AAC5B,QAAM,QAAQ,gBAAgB,OAAO;AAErC,SAAO;AAAA,IACL,GAAG,MAAM,IAAI,OAAO;AAAA,IACpB,GAAG,MAAM,IAAI,CAAC,SAAS,GAAG,UAAU,GAAG,IAAI,EAAE;AAAA,IAC7C,GAAG,MAAM,GAAG,KAAK;AAAA,EAAA,EACjB,KAAK,IAAI;AACb;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,SAAO,KACJ,MAAM,IAAI,EACV,QAAQ,CAAC,SAAS,qBAAqB,IAAI,EAAE,MAAM,IAAI,CAAC,EACxD,KAAK,IAAI;AACd;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,UAAU,KAAK,KAAA;AACrB,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,aAAa,qBAAqB,OAAO;AAC/C,QAAM,WAAW,OAAO,UAAU;AAClC,QAAM,4BAA4B,uBAAuB,QAAQ;AACjE,SAAO,kBAAkB,yBAAyB;AACpD;AAMA,SAAS,cAAc,MAAyC;AAC9D,QAAM,4BAAY,IAAA;AAClB,MAAI,CAAC,KAAM,QAAO;AAElB,aAAW,QAAQ,MAAM;AACvB,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI,IAAI;AAAA,IAChB,WAAW,OAAO,SAAS,UAAU;AACnC,YAAM,aAAa,KAAK,MAAM,eAAe;AAC7C,UAAI,YAAY;AACd,cAAM,QAAQ,SAAS,WAAW,CAAC,GAAG,EAAE;AACxC,cAAM,MAAM,SAAS,WAAW,CAAC,GAAG,EAAE;AACtC,iBAAS,IAAI,OAAO,KAAK,KAAK,KAAK;AACjC,gBAAM,IAAI,CAAC;AAAA,QACb;AAAA,MACF,OAAO;AACL,cAAM,MAAM,SAAS,MAAM,EAAE;AAC7B,YAAI,CAAC,MAAM,GAAG,GAAG;AACf,gBAAM,IAAI,GAAG;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAaA,SAAS,iBAAiB,MAAc,SAAiC;AACvE,QAAM,EAAE,iBAAiB,iBAAiB,gBAAgB,YAAY,iBAAiB;AACvF,QAAM,UAAU,WAAW,OAAO,KAAK,aAAa,OAAO;AAE3D,MAAI,CAAC,mBAAmB,eAAe,SAAS,KAAK,CAAC,SAAS;AAC7D,WAAO;AAAA,EACT;AAIA,QAAM,YAAY,KAAK,MAAM,+BAA+B;AAC5D,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,cAAc,UAAU,CAAC;AAC/B,QAAM,QAAQ,YAAY,MAAM,IAAI;AAGpC,QAAM,iBAAiB,MAAM,IAAI,CAAC,MAAM,UAAU;AAChD,UAAM,UAAU,QAAQ;AACxB,UAAM,iBAAiB,kBAAkB;AACzC,UAAM,gBAAgB,eAAe,IAAI,OAAO;AAChD,UAAM,UAAU,WAAW,IAAI,OAAO;AACtC,UAAM,YAAY,aAAa,IAAI,OAAO;AAE1C,UAAM,cAAc,CAAC,MAAM;AAC3B,QAAI,cAAe,aAAY,KAAK,aAAa;AACjD,QAAI,QAAS,aAAY,KAAK,YAAY;AAC1C,QAAI,UAAW,aAAY,KAAK,cAAc;AAE9C,UAAM,YAAY,YAAY,KAAK,GAAG;AACtC,UAAM,aAAa,UAAU,MAAM,YAAY,MAAM;AAErD,QAAI,mBAAmB,SAAS;AAC9B,YAAM,cAAc,kBAChB,6BAA6B,cAAc,YAC3C;AACJ,YAAM,iBAAiB,UAAU,6BAA6B,UAAU,YAAY;AACpF,aAAO,gBAAgB,SAAS,KAAK,WAAW,GAAG,cAAc,GAAG,IAAI;AAAA,IAC1E;AACA,WAAO,gBAAgB,SAAS,KAAK,IAAI;AAAA,EAC3C,CAAC;AAGD,SAAO,KAAK,QAAQ,+BAA+B,SAAS,eAAe,KAAK,IAAI,CAAC,SAAS;AAChG;AAEA,MAAM,gBAAgB,MAAM,WAA2C,SAASC,WAC9E;AAAA,EACE;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiB,EAAE;AACjE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,gBAAgB;AAE/D,QAAM,cAAc,QAAQ,MAAM,cAAc,IAAI,GAAG,CAAC,IAAI,CAAC;AAC7D,QAAM,YAAY,YAAY,MAAM,IAAI;AACxC,QAAM,aAAa,UAAU;AAC7B,QAAM,qBAAqB,eAAe,aAAa;AAGvD,QAAM,cACJ,sBAAsB,cAAc,UAAU,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI,IAAI;AAEtF,QAAM,eAAe,QAAQ,MAAM,cAAc,cAAc,GAAG,CAAC,cAAc,CAAC;AAClF,QAAM,WAAW,QAAQ,MAAM,cAAc,UAAU,GAAG,CAAC,UAAU,CAAC;AACtE,QAAM,aAAa,QAAQ,MAAM,cAAc,YAAY,GAAG,CAAC,YAAY,CAAC;AAC5E,QAAM,UAAU,SAAS,OAAO,KAAK,WAAW,OAAO;AACvD,QAAM,wBACJ,kBAAkB,SAAU,WAAW,WAAW,YAAa;AACjE,QAAM,uBAAuB,YAAY,CAAC,kBAAkB,0BAA0B;AACtF,QAAM,wBAAwB,YAAY,CAAC,kBAAkB,0BAA0B;AACvF,QAAM,qBAAqB,QAAQ,QAAQ,KAAK;AAGhD,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,iBAAa,IAAI;AAEjB,kBAAA;AAEA,QAAI,gBAAgB,CAAC,aAAa;AAChC,UAAI,gBAAgB,QAAQ,IAAI,aAAa,eAAe;AAC1D,gBAAQ;AAAA,UACN;AAAA,QAAA;AAAA,MAGJ;AAEA,yBAAmB,4BAA4B,WAAW,WAAW,CAAC,eAAe;AACrF,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,gBAAY,aAAa;AAAA,MACvB,MAAM;AAAA,MACN;AAAA,IAAA,CACD,EACE,KAAK,CAAC,SAAS;AACd,UAAI,CAAC,WAAW;AACd,cAAM,YAAY,iBAAiB,MAAM;AAAA,UACvC;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,cAAc;AAAA,QAAA,CACf;AACD,2BAAmB,SAAS;AAC5B,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,UAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,gBAAQ,MAAM,+BAA+B,GAAG;AAAA,MAClD;AACA,UAAI,CAAC,WAAW;AAEd,2BAAmB,4BAA4B,WAAW,WAAW,CAAC,eAAe;AACrF,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAEH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,aAAa,YAAY,YAAY;AACzC,QAAI;AAEF,YAAM,UAAU,UAAU,UAAU,WAAW;AAC/C,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AACvC;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,gBAAQ,MAAM,mBAAmB,GAAG;AAAA,MACtC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,kBAAkB,YAAY,MAAM;AACxC,mBAAe,CAAC,SAAS,CAAC,IAAI;AAAA,EAChC,GAAG,CAAA,CAAE;AAEL,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,IACP,mBAAmB,OAAO;AAAA,IAC1B,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP,kBAAkB,OAAO;AAAA,IACzB,yBAAyB,OAAO;AAAA,EAAA,EAE/B,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,qBAA0C,YAAY,EAAE,WAAW,UAAU,OAAA,IAAW,CAAA;AAE9F,SACE,qBAAC,SAAI,KAAW,GAAG,WAAW,WAAW,YAAY,cAAW,QAC7D,UAAA;AAAA,IAAA,SAAS,oBAAC,OAAA,EAAI,WAAW,OAAO,OAAQ,UAAA,OAAM;AAAA,IAC/C,qBAAC,OAAA,EAAI,WAAW,gBACb,UAAA;AAAA,MAAA,sBACC,qBAAC,OAAA,EAAI,WAAW,OAAO,QACrB,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAW,OAAO,UAAW,sBAAY,IAAG;AAAA,QACjD,wBACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAW,GAAG,OAAO,UAAU,IAAI,SAAS,OAAO,SAAS,EAAE;AAAA,YAC9D,cAAY,SAAS,YAAY;AAAA,YAEhC,UAAA,SACC,oBAAC,WAAA,EAAU,WAAW,OAAO,KAAA,CAAM,IAEnC,oBAAC,UAAA,EAAS,WAAW,OAAO,KAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAEtC,GAEJ;AAAA,MAED,yBACC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW,GAAG,OAAO,UAAU,IAAI,OAAO,WAAW,IAAI,SAAS,OAAO,SAAS,EAAE;AAAA,UACpF,cAAY,SAAS,YAAY;AAAA,UAEhC,UAAA,SAAS,oBAAC,WAAA,EAAU,WAAW,OAAO,KAAA,CAAM,IAAK,oBAAC,UAAA,EAAS,WAAW,OAAO,KAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAGvF,YACC,oBAAC,OAAA,EAAI,WAAW,OAAO,SAAS,OAAO,oBACrC,UAAA,oBAAC,SACC,UAAA,oBAAC,QAAA,EAAM,UAAA,aAAY,EAAA,CACrB,GACF,IAEA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,OAAO;AAAA,UAClB,OAAO;AAAA,UACP,yBAAyB,EAAE,QAAQ,gBAAA;AAAA,QAAgB;AAAA,MAAA;AAAA,MAGtD,kBACC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW,GAAG,OAAO,cAAc,IAAI,OAAO,UAAU,IAAI,OAAO,WAAW,IAAI,SAAS,OAAO,SAAS,EAAE;AAAA,UAC7G,cAAY,SAAS,YAAY;AAAA,UAEhC,UAAA,SAAS,oBAAC,WAAA,EAAU,WAAW,OAAO,KAAA,CAAM,IAAK,oBAAC,UAAA,EAAS,WAAW,OAAO,KAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAGvF,sBACC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW,OAAO;AAAA,UAClB,iBAAe,CAAC;AAAA,UAChB,cAAY,cAAc,gBAAgB;AAAA,UAEzC,wBACC,qBAAA,UAAA,EACE,UAAA;AAAA,YAAA,oBAAC,iBAAA,EAAgB,WAAW,OAAO,KAAA,CAAM;AAAA,iCACxC,QAAA,EAAK,UAAA;AAAA,cAAA;AAAA,cAAM,aAAa;AAAA,cAAe;AAAA,YAAA,EAAA,CAAW;AAAA,UAAA,EAAA,CACrD,IAEA,qBAAA,UAAA,EACE,UAAA;AAAA,YAAA,oBAAC,eAAA,EAAc,WAAW,OAAO,KAAA,CAAM;AAAA,YACvC,oBAAC,UAAK,UAAA,YAAA,CAAS;AAAA,UAAA,EAAA,CACjB;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ,GAEJ;AAAA,IACC,WAAW,oBAAC,OAAA,EAAI,WAAW,OAAO,SAAU,UAAA,QAAA,CAAQ;AAAA,EAAA,GACvD;AAEJ,CAAC;AAwCD,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;;AACvB,QAAM,eAAe,gBAAc,UAAK,CAAC,MAAN,mBAAS,UAAS;AAErD,SACE,oBAAC,OAAA,EAAI,WACH,UAAA,qBAAC,YAAS,cACR,UAAA;AAAA,IAAA,oBAAC,YAAS,SAAS,aAChB,UAAA,KAAK,IAAI,CAAC,QACT,oBAAC,KAAA,EAAoB,OAAO,IAAI,OAC7B,UAAA,IAAI,SADG,IAAI,KAEd,CACD,GACH;AAAA,IACC,KAAK,IAAI,CAAC,QACT,oBAAC,WAAA,EAA0B,OAAO,IAAI,OAAO,OAAK,MAAC,WAAW,OAAO,aACnE,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,IAAI;AAAA,QACV,UAAU,IAAI;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,SAAS,MAAM,OAAO,IAAI,KAAK,IAAI;AAAA,MAAA;AAAA,IAAA,EAC7C,GAXc,IAAI,KAYpB,CACD;AAAA,EAAA,EAAA,CACH,EAAA,CACF;AAEJ;AAMO,MAAM,YAAY,OAAO,OAAO,eAAe;AAAA,EACpD,QAAQ;AACV,CAAC;"}
1
+ {"version":3,"file":"codeblock.js","sources":["../src/components/CodeBlock/index.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\n// ============================================\n// Lazy-loaded dependency (shiki)\n// ============================================\n\nlet _codeToHtml:\n | ((code: string, options: { lang: string; theme: string }) => Promise<string>)\n | null = null;\nlet _shikiLoaded = false;\nlet _shikiFailed = false;\n\nfunction loadShikiDeps() {\n if (_shikiLoaded) return;\n _shikiLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const shiki = require(\"shiki\");\n _codeToHtml = shiki.codeToHtml;\n } catch {\n _shikiFailed = true;\n }\n}\nimport { TabsRoot, TabsList, Tab, TabsPanel } from \"../Tabs\";\nimport { Button } from \"../Button\";\nimport styles from \"./CodeBlock.module.scss\";\nimport \"../../styles/globals.scss\";\n\nexport type CodeBlockLanguage =\n | \"tsx\"\n | \"typescript\"\n | \"javascript\"\n | \"jsx\"\n | \"bash\"\n | \"shell\"\n | \"css\"\n | \"scss\"\n | \"sass\"\n | \"json\"\n | \"html\"\n | \"xml\"\n | \"markdown\"\n | \"md\"\n | \"yaml\"\n | \"yml\"\n | \"python\"\n | \"py\"\n | \"ruby\"\n | \"go\"\n | \"rust\"\n | \"java\"\n | \"kotlin\"\n | \"swift\"\n | \"c\"\n | \"cpp\"\n | \"csharp\"\n | \"php\"\n | \"sql\"\n | \"graphql\"\n | \"diff\"\n | \"plaintext\";\n\n/** Available syntax highlighting themes */\nexport type CodeBlockTheme =\n | \"synthwave-84\"\n | \"github-dark\"\n | \"github-light\"\n | \"one-dark-pro\"\n | \"dracula\"\n | \"nord\"\n | \"monokai\"\n | \"vitesse-dark\"\n | \"vitesse-light\"\n | \"min-dark\"\n | \"min-light\";\n\nexport type CodeBlockCopyPlacement = \"auto\" | \"header\" | \"overlay\";\n\nexport interface CodeBlockProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Code string to display */\n code: string;\n /** Programming language for syntax highlighting */\n language?: CodeBlockLanguage;\n /** Syntax highlighting theme */\n theme?: CodeBlockTheme;\n /** Show copy button */\n showCopy?: boolean;\n /** Optional title above code block (external label) */\n title?: string;\n /** Optional filename shown in header bar inside code block */\n filename?: string;\n /** Optional caption below code block */\n caption?: string;\n /** Show line numbers */\n showLineNumbers?: boolean;\n /** Starting line number (default: 1) */\n startLineNumber?: number;\n /** Highlight specific lines (e.g., [1, 3, '5-7']) */\n highlightLines?: (number | string)[];\n /** Lines marked as added in diff view */\n addedLines?: (number | string)[];\n /** Lines marked as removed in diff view */\n removedLines?: (number | string)[];\n /** Enable word wrapping for long lines */\n wordWrap?: boolean;\n /** Maximum height in pixels (enables scrolling) */\n maxHeight?: number;\n /** Allow collapsing/expanding the code block */\n collapsible?: boolean;\n /** Initial collapsed state (only applies when collapsible is true) */\n defaultCollapsed?: boolean;\n /** Number of lines to show when collapsed */\n collapsedLines?: number;\n /** Compact mode with reduced padding */\n compact?: boolean;\n /** Show a persistent copy button (always visible, uses Button component) */\n persistentCopy?: boolean;\n /** Placement of copy button when not using persistent copy */\n copyPlacement?: CodeBlockCopyPlacement;\n /** Callback fired when the copy button is clicked and copy succeeds */\n onCopy?: () => void;\n}\n\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n\nfunction ChevronUpIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n );\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\n/**\n * Remove common leading whitespace from all lines (dedent).\n * This handles template literals that have extra indentation from code formatting.\n */\nfunction dedent(str: string): string {\n const lines = str.split(\"\\n\");\n\n // Find the minimum indentation (ignoring empty lines)\n let minIndent = Infinity;\n for (const line of lines) {\n if (line.trim() === \"\") continue;\n const match = line.match(/^(\\s*)/);\n if (match) {\n minIndent = Math.min(minIndent, match[1].length);\n }\n }\n\n // If no indentation found, return as-is\n if (minIndent === Infinity || minIndent === 0) {\n return str;\n }\n\n // Remove the common indentation from all lines\n return lines.map((line) => line.slice(minIndent)).join(\"\\n\");\n}\n\n/**\n * Normalize indentation while handling JSX where first line is already at column 0.\n */\nfunction normalizeIndentation(str: string): string {\n const lines = str.split(\"\\n\");\n if (lines.length <= 1) return str;\n\n let minIndent = Infinity;\n const firstLineIndent = lines[0].match(/^(\\s*)/)?.[1].length ?? 0;\n\n for (let i = 1; i < lines.length; i += 1) {\n const line = lines[i];\n if (line.trim().length === 0) continue;\n const indent = line.match(/^(\\s*)/)?.[1].length ?? 0;\n minIndent = Math.min(minIndent, indent);\n }\n\n if (firstLineIndent > 0) {\n minIndent = Math.min(minIndent, firstLineIndent);\n }\n\n if (minIndent === Infinity || minIndent === 0) return str;\n\n return lines\n .map((line) => line.slice(Math.min(minIndent, line.match(/^(\\s*)/)?.[1].length ?? 0)))\n .join(\"\\n\");\n}\n\nfunction trimTrailingWhitespace(str: string): string {\n return str\n .split(\"\\n\")\n .map((line) => line.replace(/[ \\t]+$/g, \"\"))\n .join(\"\\n\");\n}\n\nfunction findTagEnd(line: string): number {\n let quote: '\"' | \"'\" | \"`\" | null = null;\n let escaped = false;\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n\n for (let i = 1; i < line.length; i += 1) {\n const char = line[i];\n\n if (quote) {\n if (char === \"\\\\\" && !escaped) {\n escaped = true;\n continue;\n }\n if (char === quote && !escaped) {\n quote = null;\n }\n escaped = false;\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n continue;\n }\n\n if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \">\" && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction splitJsxAttributes(attrs: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let quote: '\"' | \"'\" | \"`\" | null = null;\n let escaped = false;\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n\n for (const char of attrs) {\n if (quote) {\n current += char;\n if (char === \"\\\\\" && !escaped) {\n escaped = true;\n continue;\n }\n if (char === quote && !escaped) {\n quote = null;\n }\n escaped = false;\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n current += char;\n continue;\n }\n\n if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n\n if (/\\s/.test(char) && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n if (current.trim().length > 0) {\n parts.push(current.trim());\n current = \"\";\n }\n continue;\n }\n\n current += char;\n }\n\n if (current.trim().length > 0) {\n parts.push(current.trim());\n }\n\n return parts;\n}\n\nfunction formatLongJsxTagLine(line: string): string {\n const maxInlineLength = 110;\n if (line.length <= maxInlineLength) return line;\n\n const indent = line.match(/^(\\s*)/)?.[1] ?? \"\";\n const trimmed = line.trimStart();\n\n if (\n !trimmed.startsWith(\"<\") ||\n trimmed.startsWith(\"</\") ||\n trimmed.startsWith(\"<!\") ||\n trimmed.startsWith(\"<?\")\n ) {\n return line;\n }\n\n const tagEnd = findTagEnd(trimmed);\n if (tagEnd === -1) return line;\n if (trimmed.slice(tagEnd + 1).trim().length > 0) return line;\n\n const rawTagBody = trimmed.slice(1, tagEnd).trim();\n const isSelfClosing = rawTagBody.endsWith(\"/\");\n const tagBody = isSelfClosing ? rawTagBody.slice(0, -1).trimEnd() : rawTagBody;\n const firstSpace = tagBody.search(/\\s/);\n if (firstSpace === -1) return line;\n\n const tagName = tagBody.slice(0, firstSpace);\n if (!/^[A-Za-z][\\w.:-]*$/.test(tagName)) return line;\n\n const attrsSource = tagBody.slice(firstSpace).trim();\n if (!attrsSource.includes(\"=\") && !attrsSource.includes(\"{...\")) return line;\n\n const attrs = splitJsxAttributes(attrsSource);\n if (attrs.length === 0) return line;\n\n const attrIndent = `${indent} `;\n const close = isSelfClosing ? \"/>\" : \">\";\n\n return [\n `${indent}<${tagName}`,\n ...attrs.map((attr) => `${attrIndent}${attr}`),\n `${indent}${close}`,\n ].join(\"\\n\");\n}\n\nfunction formatLongJsxTags(code: string): string {\n return code\n .split(\"\\n\")\n .flatMap((line) => formatLongJsxTagLine(line).split(\"\\n\"))\n .join(\"\\n\");\n}\n\nfunction normalizeCode(code: string): string {\n const trimmed = code.trim();\n if (trimmed.length === 0) return \"\";\n\n const normalized = normalizeIndentation(trimmed);\n const dedented = dedent(normalized);\n const withoutTrailingWhitespace = trimTrailingWhitespace(dedented);\n return formatLongJsxTags(withoutTrailingWhitespace);\n}\n\n/**\n * Parse line specification into a Set of line numbers.\n * Supports: [1, 3, '5-7'] -> Set {1, 3, 5, 6, 7}\n */\nfunction parseLineSpec(spec?: (number | string)[]): Set<number> {\n const lines = new Set<number>();\n if (!spec) return lines;\n\n for (const item of spec) {\n if (typeof item === \"number\") {\n lines.add(item);\n } else if (typeof item === \"string\") {\n const rangeMatch = item.match(/^(\\d+)-(\\d+)$/);\n if (rangeMatch) {\n const start = parseInt(rangeMatch[1], 10);\n const end = parseInt(rangeMatch[2], 10);\n for (let i = start; i <= end; i++) {\n lines.add(i);\n }\n } else {\n const num = parseInt(item, 10);\n if (!isNaN(num)) {\n lines.add(num);\n }\n }\n }\n }\n\n return lines;\n}\n\ninterface ProcessOptions {\n showLineNumbers: boolean;\n startLineNumber: number;\n highlightLines: Set<number>;\n addedLines: Set<number>;\n removedLines: Set<number>;\n}\n\n/**\n * Add line numbers, highlight classes, and diff markers to Shiki HTML output.\n */\nfunction processShikiHtml(html: string, options: ProcessOptions): string {\n const { showLineNumbers, startLineNumber, highlightLines, addedLines, removedLines } = options;\n const hasDiff = addedLines.size > 0 || removedLines.size > 0;\n\n if (!showLineNumbers && highlightLines.size === 0 && !hasDiff) {\n return html;\n }\n\n // Extract the code content from Shiki output\n // Shiki outputs: <pre class=\"shiki ...\"><code>...lines...</code></pre>\n const codeMatch = html.match(/<code[^>]*>([\\s\\S]*?)<\\/code>/);\n if (!codeMatch) return html;\n\n const codeContent = codeMatch[1];\n const lines = codeContent.split(\"\\n\");\n\n // Process each line\n const processedLines = lines.map((line, index) => {\n const lineNum = index + 1;\n const displayLineNum = startLineNumber + index;\n const isHighlighted = highlightLines.has(lineNum);\n const isAdded = addedLines.has(lineNum);\n const isRemoved = removedLines.has(lineNum);\n\n const lineClasses = [\"line\"];\n if (isHighlighted) lineClasses.push(\"highlighted\");\n if (isAdded) lineClasses.push(\"diff-added\");\n if (isRemoved) lineClasses.push(\"diff-removed\");\n\n const lineClass = lineClasses.join(\" \");\n const diffMarker = isAdded ? \"+\" : isRemoved ? \"-\" : \" \";\n\n if (showLineNumbers || hasDiff) {\n const lineNumHtml = showLineNumbers\n ? `<span class=\"line-number\">${displayLineNum}</span>`\n : \"\";\n const diffMarkerHtml = hasDiff ? `<span class=\"diff-marker\">${diffMarker}</span>` : \"\";\n return `<span class=\"${lineClass}\">${lineNumHtml}${diffMarkerHtml}${line}</span>`;\n }\n return `<span class=\"${lineClass}\">${line}</span>`;\n });\n\n // Reconstruct the HTML\n return html.replace(/<code[^>]*>[\\s\\S]*?<\\/code>/, `<code>${processedLines.join(\"\\n\")}</code>`);\n}\n\nconst CodeBlockBase = React.forwardRef<HTMLDivElement, CodeBlockProps>(function CodeBlock(\n {\n code,\n language = \"tsx\",\n theme = \"one-dark-pro\",\n showCopy = true,\n title,\n filename,\n caption,\n showLineNumbers = false,\n startLineNumber = 1,\n highlightLines,\n addedLines,\n removedLines,\n wordWrap = false,\n maxHeight,\n collapsible = false,\n defaultCollapsed = false,\n collapsedLines = 5,\n compact = false,\n persistentCopy = false,\n copyPlacement = \"auto\",\n onCopy,\n className,\n ...htmlProps\n },\n ref\n) {\n const [copied, setCopied] = useState(false);\n const [highlight, setHighlight] = useState<{ html: string; loading: boolean }>({ html: '', loading: true });\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const trimmedCode = useMemo(() => normalizeCode(code), [code]);\n const codeLines = trimmedCode.split(\"\\n\");\n const totalLines = codeLines.length;\n const shouldShowCollapse = collapsible && totalLines > collapsedLines;\n\n // Compute visible code when collapsed\n const visibleCode =\n shouldShowCollapse && isCollapsed ? codeLines.slice(0, collapsedLines).join(\"\\n\") : trimmedCode;\n\n const highlightSet = useMemo(() => parseLineSpec(highlightLines), [highlightLines]);\n const addedSet = useMemo(() => parseLineSpec(addedLines), [addedLines]);\n const removedSet = useMemo(() => parseLineSpec(removedLines), [removedLines]);\n const hasDiff = addedSet.size > 0 || removedSet.size > 0;\n const resolvedCopyPlacement =\n copyPlacement === \"auto\" ? (filename ? \"header\" : \"overlay\") : copyPlacement;\n const shouldShowHeaderCopy = showCopy && !persistentCopy && resolvedCopyPlacement === \"header\";\n const shouldShowOverlayCopy = showCopy && !persistentCopy && resolvedCopyPlacement === \"overlay\";\n const shouldRenderHeader = Boolean(filename) || shouldShowHeaderCopy;\n\n // Apply syntax highlighting\n useEffect(() => {\n let cancelled = false;\n setHighlight((prev) => ({ ...prev, loading: true }));\n\n const run = async () => {\n loadShikiDeps();\n\n const fallbackHtml = `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`;\n\n if (_shikiFailed || !_codeToHtml) {\n if (_shikiFailed && process.env.NODE_ENV === \"development\") {\n console.warn(\n \"[@fragments-sdk/ui] CodeBlock: shiki is not installed. \" +\n \"Install it with: npm install shiki\"\n );\n }\n return fallbackHtml;\n }\n\n try {\n const html = await _codeToHtml(visibleCode, { lang: language, theme });\n return processShikiHtml(html, {\n showLineNumbers,\n startLineNumber,\n highlightLines: highlightSet,\n addedLines: addedSet,\n removedLines: removedSet,\n });\n } catch (err) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Syntax highlighting failed:\", err);\n }\n return fallbackHtml;\n }\n };\n\n run().then((html) => {\n if (!cancelled) {\n setHighlight({ html, loading: false });\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n visibleCode,\n language,\n theme,\n showLineNumbers,\n startLineNumber,\n highlightSet,\n addedSet,\n removedSet,\n ]);\n\n const handleCopy = useCallback(async () => {\n try {\n // Always copy the full code, even when collapsed\n await navigator.clipboard.writeText(trimmedCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onCopy?.();\n } catch (err) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Failed to copy:\", err);\n }\n }\n }, [trimmedCode, onCopy]);\n\n const toggleCollapsed = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n const classNames = [\n styles.container,\n showLineNumbers && styles.withLineNumbers,\n hasDiff && styles.withDiff,\n wordWrap && styles.wordWrap,\n compact && styles.compact,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const wrapperClasses = [\n styles.wrapper,\n persistentCopy && styles.persistentCopyWrapper,\n shouldShowOverlayCopy && styles.withCopyOverlay,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const codeContainerStyle: React.CSSProperties = maxHeight ? { maxHeight, overflow: \"auto\" } : {};\n\n return (\n <div ref={ref} {...htmlProps} className={classNames} data-theme=\"dark\">\n {title && <div className={styles.title}>{title}</div>}\n <div className={wrapperClasses}>\n {shouldRenderHeader && (\n <div className={styles.header}>\n <span className={styles.filename}>{filename ?? \"\"}</span>\n {shouldShowHeaderCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`${styles.copyButton} ${copied ? styles.copied : \"\"}`}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? (\n <CheckIcon className={styles.icon} />\n ) : (\n <CopyIcon className={styles.icon} />\n )}\n </button>\n )}\n </div>\n )}\n {shouldShowOverlayCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`${styles.copyButton} ${styles.copyOverlay} ${copied ? styles.copied : \"\"}`}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\n </button>\n )}\n {highlight.loading ? (\n <div className={styles.loading} style={codeContainerStyle}>\n <pre>\n <code>{visibleCode}</code>\n </pre>\n </div>\n ) : (\n <div\n className={styles.codeContainer}\n style={codeContainerStyle}\n dangerouslySetInnerHTML={{ __html: highlight.html }}\n />\n )}\n {persistentCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`${styles.persistentCopy} ${styles.copyButton} ${styles.copyOverlay} ${copied ? styles.copied : \"\"}`}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\n </button>\n )}\n {shouldShowCollapse && (\n <button\n type=\"button\"\n onClick={toggleCollapsed}\n className={styles.collapseButton}\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand code\" : \"Collapse code\"}\n >\n {isCollapsed ? (\n <>\n <ChevronDownIcon className={styles.icon} />\n <span>Show {totalLines - collapsedLines} more lines</span>\n </>\n ) : (\n <>\n <ChevronUpIcon className={styles.icon} />\n <span>Show less</span>\n </>\n )}\n </button>\n )}\n </div>\n {caption && <div className={styles.caption}>{caption}</div>}\n </div>\n );\n});\n\n// ============================================\n// Tabbed Code Block\n// ============================================\n\nexport interface CodeBlockTab {\n /** Label shown in the tab */\n label: string;\n /** Code string to display */\n code: string;\n /** Programming language for syntax highlighting */\n language?: CodeBlockLanguage;\n}\n\nexport interface TabbedCodeBlockProps {\n /** Array of code tabs */\n tabs: CodeBlockTab[];\n /** Default selected tab (by label) */\n defaultTab?: string;\n /** Show copy button */\n showCopy?: boolean;\n /** Placement of copy button when not using persistent copy */\n copyPlacement?: CodeBlockCopyPlacement;\n /** Show line numbers */\n showLineNumbers?: boolean;\n /** Syntax highlighting theme (applies to all tabs) */\n theme?: CodeBlockTheme;\n /** Tab list visual style */\n tabsVariant?: \"underline\" | \"pills\";\n /** Enable word wrapping for long lines */\n wordWrap?: boolean;\n /** Maximum height in pixels (enables scrolling) */\n maxHeight?: number;\n /** Additional class name */\n className?: string;\n /** Callback fired when a tab's copy button is clicked. Receives the tab label. */\n onCopy?: (tabLabel: string) => void;\n}\n\nfunction TabbedCodeBlock({\n tabs,\n defaultTab,\n showCopy = true,\n copyPlacement = \"auto\",\n showLineNumbers = false,\n theme,\n tabsVariant = \"pills\",\n wordWrap,\n maxHeight,\n className,\n onCopy,\n}: TabbedCodeBlockProps) {\n const defaultValue = defaultTab || tabs[0]?.label || \"\";\n\n return (\n <div className={className}>\n <TabsRoot defaultValue={defaultValue}>\n <TabsList variant={tabsVariant}>\n {tabs.map((tab) => (\n <Tab key={tab.label} value={tab.label}>\n {tab.label}\n </Tab>\n ))}\n </TabsList>\n {tabs.map((tab) => (\n <TabsPanel key={tab.label} value={tab.label} flush className={styles.tabbedPanel}>\n <CodeBlockBase\n code={tab.code}\n language={tab.language}\n theme={theme}\n showCopy={showCopy}\n copyPlacement={copyPlacement}\n showLineNumbers={showLineNumbers}\n wordWrap={wordWrap}\n maxHeight={maxHeight}\n onCopy={onCopy ? () => onCopy(tab.label) : undefined}\n />\n </TabsPanel>\n ))}\n </TabsRoot>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const CodeBlock = Object.assign(CodeBlockBase, {\n Tabbed: TabbedCodeBlock,\n});\n\nexport { TabbedCodeBlock };\n"],"names":["_a","CodeBlock"],"mappings":"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"}
@@ -84,7 +84,8 @@ const ChipBase = React__namespace.forwardRef(
84
84
  ] });
85
85
  }
86
86
  );
87
- function ChipGroupInner({ children, value: controlledValue, defaultValue = [], onChange, className }, ref) {
87
+ const EMPTY_CHIP_GROUP = [];
88
+ function ChipGroupInner({ children, value: controlledValue, defaultValue = EMPTY_CHIP_GROUP, onChange, className }, ref) {
88
89
  const [internalValue, setInternalValue] = React__namespace.useState(defaultValue);
89
90
  const isControlled = controlledValue !== void 0;
90
91
  const currentValue = isControlled ? controlledValue : internalValue;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Chip/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Chip.module.scss';\n\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'filled' | 'outlined' | 'soft';\n /** Size of the chip */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the chip is selected */\n selected?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Avatar element rendered before the label */\n avatar?: React.ReactNode;\n /** Makes chip removable. Called when X is clicked. */\n onRemove?: () => void;\n /** Value identifier used by Chip.Group */\n value?: string;\n}\n\nexport interface ChipGroupProps {\n children: React.ReactNode;\n /** Controlled selected values */\n value?: string[];\n /** Default selected values (uncontrolled) */\n defaultValue?: string[];\n /** Called when selection changes */\n onChange?: (value: string[]) => void;\n className?: string;\n}\n\nconst ChipBase = React.forwardRef<HTMLButtonElement, ChipProps>(\n function Chip(\n {\n children,\n variant = 'filled',\n size = 'md',\n selected = false,\n disabled = false,\n icon,\n avatar,\n onRemove,\n className,\n onClick,\n value: _value,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.chip,\n styles[size],\n styles[variant],\n selected && styles.selected,\n onRemove && styles.withRemove,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleRemoveClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onRemove?.();\n };\n\n const removeAriaLabel = `Remove ${typeof children === 'string' ? children : 'chip'}`;\n\n const chipButton = (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n className={classes}\n onClick={onClick}\n {...htmlProps}\n >\n {avatar && (\n <span className={styles.avatar} aria-hidden=\"true\">\n {avatar}\n </span>\n )}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n\n if (!onRemove) {\n return chipButton;\n }\n\n return (\n <span className={styles.removableChip} data-disabled={disabled || undefined}>\n {chipButton}\n <button\n type=\"button\"\n className={styles.remove}\n onClick={handleRemoveClick}\n aria-label={removeAriaLabel}\n disabled={disabled}\n >\n &times;\n </button>\n </span>\n );\n }\n);\n\nfunction ChipGroupInner(\n { children, value: controlledValue, defaultValue = [], onChange, className }: ChipGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const toggle = React.useCallback(\n (chipValue: string) => {\n const next = currentValue.includes(chipValue)\n ? currentValue.filter((v) => v !== chipValue)\n : [...currentValue, chipValue];\n\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n },\n [currentValue, isControlled, onChange]\n );\n\n const classes = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div ref={ref} className={classes}>\n {React.Children.map(children, (child) => {\n if (!React.isValidElement<ChipProps>(child)) return child;\n const chipValue = child.props.value ?? (typeof child.props.children === 'string' ? child.props.children : '');\n return React.cloneElement(child, {\n selected: currentValue.includes(chipValue),\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n child.props.onClick?.(e);\n if (!e.defaultPrevented) {\n toggle(chipValue);\n }\n },\n } as Partial<ChipProps>);\n })}\n </div>\n );\n}\n\nconst ChipGroup = React.forwardRef<HTMLDivElement, ChipGroupProps>(ChipGroupInner);\n\n// Compose Chip with static Group property\nexport const Chip = Object.assign(ChipBase, { Group: ChipGroup });\n"],"names":["React","Chip","styles","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Chip/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Chip.module.scss';\n\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'filled' | 'outlined' | 'soft';\n /** Size of the chip */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the chip is selected */\n selected?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Avatar element rendered before the label */\n avatar?: React.ReactNode;\n /** Makes chip removable. Called when X is clicked. */\n onRemove?: () => void;\n /** Value identifier used by Chip.Group */\n value?: string;\n}\n\nexport interface ChipGroupProps {\n children: React.ReactNode;\n /** Controlled selected values */\n value?: string[];\n /** Default selected values (uncontrolled) */\n defaultValue?: string[];\n /** Called when selection changes */\n onChange?: (value: string[]) => void;\n className?: string;\n}\n\nconst ChipBase = React.forwardRef<HTMLButtonElement, ChipProps>(\n function Chip(\n {\n children,\n variant = 'filled',\n size = 'md',\n selected = false,\n disabled = false,\n icon,\n avatar,\n onRemove,\n className,\n onClick,\n value: _value,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.chip,\n styles[size],\n styles[variant],\n selected && styles.selected,\n onRemove && styles.withRemove,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleRemoveClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onRemove?.();\n };\n\n const removeAriaLabel = `Remove ${typeof children === 'string' ? children : 'chip'}`;\n\n const chipButton = (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n className={classes}\n onClick={onClick}\n {...htmlProps}\n >\n {avatar && (\n <span className={styles.avatar} aria-hidden=\"true\">\n {avatar}\n </span>\n )}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n\n if (!onRemove) {\n return chipButton;\n }\n\n return (\n <span className={styles.removableChip} data-disabled={disabled || undefined}>\n {chipButton}\n <button\n type=\"button\"\n className={styles.remove}\n onClick={handleRemoveClick}\n aria-label={removeAriaLabel}\n disabled={disabled}\n >\n &times;\n </button>\n </span>\n );\n }\n);\n\nconst EMPTY_CHIP_GROUP: string[] = [];\n\nfunction ChipGroupInner(\n { children, value: controlledValue, defaultValue = EMPTY_CHIP_GROUP, onChange, className }: ChipGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const toggle = React.useCallback(\n (chipValue: string) => {\n const next = currentValue.includes(chipValue)\n ? currentValue.filter((v) => v !== chipValue)\n : [...currentValue, chipValue];\n\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n },\n [currentValue, isControlled, onChange]\n );\n\n const classes = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div ref={ref} className={classes}>\n {React.Children.map(children, (child) => {\n if (!React.isValidElement<ChipProps>(child)) return child;\n const chipValue = child.props.value ?? (typeof child.props.children === 'string' ? child.props.children : '');\n return React.cloneElement(child, {\n selected: currentValue.includes(chipValue),\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n child.props.onClick?.(e);\n if (!e.defaultPrevented) {\n toggle(chipValue);\n }\n },\n } as Partial<ChipProps>);\n })}\n </div>\n );\n}\n\nconst ChipGroup = React.forwardRef<HTMLDivElement, ChipGroupProps>(ChipGroupInner);\n\n// Compose Chip with static Group property\nexport const Chip = Object.assign(ChipBase, { Group: ChipGroup });\n"],"names":["React","Chip","styles","jsxs","jsx"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chip/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAChG,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACzC,uBAAuB;IACvB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiID,eAAO,MAAM,IAAI;;CAAgD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chip/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAChG,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACzC,uBAAuB;IACvB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmID,eAAO,MAAM,IAAI;;CAAgD,CAAC"}
@@ -65,7 +65,8 @@ const ChipBase = React.forwardRef(
65
65
  ] });
66
66
  }
67
67
  );
68
- function ChipGroupInner({ children, value: controlledValue, defaultValue = [], onChange, className }, ref) {
68
+ const EMPTY_CHIP_GROUP = [];
69
+ function ChipGroupInner({ children, value: controlledValue, defaultValue = EMPTY_CHIP_GROUP, onChange, className }, ref) {
69
70
  const [internalValue, setInternalValue] = React.useState(defaultValue);
70
71
  const isControlled = controlledValue !== void 0;
71
72
  const currentValue = isControlled ? controlledValue : internalValue;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Chip/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Chip.module.scss';\n\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'filled' | 'outlined' | 'soft';\n /** Size of the chip */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the chip is selected */\n selected?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Avatar element rendered before the label */\n avatar?: React.ReactNode;\n /** Makes chip removable. Called when X is clicked. */\n onRemove?: () => void;\n /** Value identifier used by Chip.Group */\n value?: string;\n}\n\nexport interface ChipGroupProps {\n children: React.ReactNode;\n /** Controlled selected values */\n value?: string[];\n /** Default selected values (uncontrolled) */\n defaultValue?: string[];\n /** Called when selection changes */\n onChange?: (value: string[]) => void;\n className?: string;\n}\n\nconst ChipBase = React.forwardRef<HTMLButtonElement, ChipProps>(\n function Chip(\n {\n children,\n variant = 'filled',\n size = 'md',\n selected = false,\n disabled = false,\n icon,\n avatar,\n onRemove,\n className,\n onClick,\n value: _value,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.chip,\n styles[size],\n styles[variant],\n selected && styles.selected,\n onRemove && styles.withRemove,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleRemoveClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onRemove?.();\n };\n\n const removeAriaLabel = `Remove ${typeof children === 'string' ? children : 'chip'}`;\n\n const chipButton = (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n className={classes}\n onClick={onClick}\n {...htmlProps}\n >\n {avatar && (\n <span className={styles.avatar} aria-hidden=\"true\">\n {avatar}\n </span>\n )}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n\n if (!onRemove) {\n return chipButton;\n }\n\n return (\n <span className={styles.removableChip} data-disabled={disabled || undefined}>\n {chipButton}\n <button\n type=\"button\"\n className={styles.remove}\n onClick={handleRemoveClick}\n aria-label={removeAriaLabel}\n disabled={disabled}\n >\n &times;\n </button>\n </span>\n );\n }\n);\n\nfunction ChipGroupInner(\n { children, value: controlledValue, defaultValue = [], onChange, className }: ChipGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const toggle = React.useCallback(\n (chipValue: string) => {\n const next = currentValue.includes(chipValue)\n ? currentValue.filter((v) => v !== chipValue)\n : [...currentValue, chipValue];\n\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n },\n [currentValue, isControlled, onChange]\n );\n\n const classes = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div ref={ref} className={classes}>\n {React.Children.map(children, (child) => {\n if (!React.isValidElement<ChipProps>(child)) return child;\n const chipValue = child.props.value ?? (typeof child.props.children === 'string' ? child.props.children : '');\n return React.cloneElement(child, {\n selected: currentValue.includes(chipValue),\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n child.props.onClick?.(e);\n if (!e.defaultPrevented) {\n toggle(chipValue);\n }\n },\n } as Partial<ChipProps>);\n })}\n </div>\n );\n}\n\nconst ChipGroup = React.forwardRef<HTMLDivElement, ChipGroupProps>(ChipGroupInner);\n\n// Compose Chip with static Group property\nexport const Chip = Object.assign(ChipBase, { Group: ChipGroup });\n"],"names":["Chip"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Chip/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Chip.module.scss';\n\nexport interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n children: React.ReactNode;\n /** Visual style variant */\n variant?: 'filled' | 'outlined' | 'soft';\n /** Size of the chip */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the chip is selected */\n selected?: boolean;\n /** Icon element rendered before the label */\n icon?: React.ReactNode;\n /** Avatar element rendered before the label */\n avatar?: React.ReactNode;\n /** Makes chip removable. Called when X is clicked. */\n onRemove?: () => void;\n /** Value identifier used by Chip.Group */\n value?: string;\n}\n\nexport interface ChipGroupProps {\n children: React.ReactNode;\n /** Controlled selected values */\n value?: string[];\n /** Default selected values (uncontrolled) */\n defaultValue?: string[];\n /** Called when selection changes */\n onChange?: (value: string[]) => void;\n className?: string;\n}\n\nconst ChipBase = React.forwardRef<HTMLButtonElement, ChipProps>(\n function Chip(\n {\n children,\n variant = 'filled',\n size = 'md',\n selected = false,\n disabled = false,\n icon,\n avatar,\n onRemove,\n className,\n onClick,\n value: _value,\n ...htmlProps\n },\n ref\n ) {\n const classes = [\n styles.chip,\n styles[size],\n styles[variant],\n selected && styles.selected,\n onRemove && styles.withRemove,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleRemoveClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onRemove?.();\n };\n\n const removeAriaLabel = `Remove ${typeof children === 'string' ? children : 'chip'}`;\n\n const chipButton = (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n className={classes}\n onClick={onClick}\n {...htmlProps}\n >\n {avatar && (\n <span className={styles.avatar} aria-hidden=\"true\">\n {avatar}\n </span>\n )}\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{children}</span>\n </button>\n );\n\n if (!onRemove) {\n return chipButton;\n }\n\n return (\n <span className={styles.removableChip} data-disabled={disabled || undefined}>\n {chipButton}\n <button\n type=\"button\"\n className={styles.remove}\n onClick={handleRemoveClick}\n aria-label={removeAriaLabel}\n disabled={disabled}\n >\n &times;\n </button>\n </span>\n );\n }\n);\n\nconst EMPTY_CHIP_GROUP: string[] = [];\n\nfunction ChipGroupInner(\n { children, value: controlledValue, defaultValue = EMPTY_CHIP_GROUP, onChange, className }: ChipGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const toggle = React.useCallback(\n (chipValue: string) => {\n const next = currentValue.includes(chipValue)\n ? currentValue.filter((v) => v !== chipValue)\n : [...currentValue, chipValue];\n\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n },\n [currentValue, isControlled, onChange]\n );\n\n const classes = [styles.group, className].filter(Boolean).join(' ');\n\n return (\n <div ref={ref} className={classes}>\n {React.Children.map(children, (child) => {\n if (!React.isValidElement<ChipProps>(child)) return child;\n const chipValue = child.props.value ?? (typeof child.props.children === 'string' ? child.props.children : '');\n return React.cloneElement(child, {\n selected: currentValue.includes(chipValue),\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n child.props.onClick?.(e);\n if (!e.defaultPrevented) {\n toggle(chipValue);\n }\n },\n } as Partial<ChipProps>);\n })}\n </div>\n );\n}\n\nconst ChipGroup = React.forwardRef<HTMLDivElement, ChipGroupProps>(ChipGroupInner);\n\n// Compose Chip with static Group property\nexport const Chip = Object.assign(ChipBase, { Group: ChipGroup });\n"],"names":["Chip"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeBlock/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA0B/B,OAAO,2BAA2B,CAAC;AAEnC,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,YAAY,GACZ,YAAY,GACZ,KAAK,GACL,MAAM,GACN,OAAO,GACP,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,KAAK,GACL,UAAU,GACV,IAAI,GACJ,MAAM,GACN,KAAK,GACL,QAAQ,GACR,IAAI,GACJ,MAAM,GACN,IAAI,GACJ,MAAM,GACN,MAAM,GACN,QAAQ,GACR,OAAO,GACP,GAAG,GACH,KAAK,GACL,QAAQ,GACR,KAAK,GACL,KAAK,GACL,SAAS,GACT,MAAM,GACN,WAAW,CAAC;AAEhB,2CAA2C;AAC3C,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,aAAa,GACb,cAAc,GACd,cAAc,GACd,SAAS,GACT,MAAM,GACN,SAAS,GACT,cAAc,GACd,eAAe,GACf,UAAU,GACV,WAAW,CAAC;AAEhB,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC1E,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,gCAAgC;IAChC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,cAAc,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACrC,yCAAyC;IACzC,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACjC,2CAA2C;IAC3C,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AA0nBD,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,wBAAwB;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,4BAA4B;IAC5B,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IACpC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,iBAAS,eAAe,CAAC,EACvB,IAAI,EACJ,UAAU,EACV,QAAe,EACf,aAAsB,EACtB,eAAuB,EACvB,KAAK,EACL,WAAqB,EACrB,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,GACP,EAAE,oBAAoB,2CA+BtB;AAMD,eAAO,MAAM,SAAS;;CAEpB,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeBlock/index.tsx"],"names":[],"mappings":"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"}
@@ -294,6 +294,12 @@ function CommandItem({
294
294
  "data-active": isActive || void 0,
295
295
  "data-disabled": disabled || void 0,
296
296
  onClick: handleClick,
297
+ onKeyDown: (e) => {
298
+ if (e.key === "Enter" || e.key === " ") {
299
+ e.preventDefault();
300
+ handleClick();
301
+ }
302
+ },
297
303
  onMouseEnter: handleMouseEnter,
298
304
  className: [
299
305
  Command_module.default.item,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":["React","jsxs","jsx","styles"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClick(); } }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":["React","jsxs","jsx","styles"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Command/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Command/index.tsx"],"names":[],"mappings":"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"}
@@ -275,6 +275,12 @@ function CommandItem({
275
275
  "data-active": isActive || void 0,
276
276
  "data-disabled": disabled || void 0,
277
277
  onClick: handleClick,
278
+ onKeyDown: (e) => {
279
+ if (e.key === "Enter" || e.key === " ") {
280
+ e.preventDefault();
281
+ handleClick();
282
+ }
283
+ },
278
284
  onMouseEnter: handleMouseEnter,
279
285
  className: [
280
286
  styles.item,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Command/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Command.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Controlled search value */\n search?: string;\n /** Default search value */\n defaultSearch?: string;\n /** Called when search input changes */\n onSearchChange?: (search: string) => void;\n /** Custom filter function. Return 0 to hide, >0 to show (higher = better match).\n Default: case-insensitive substring match on value + keywords */\n filter?: (value: string, search: string, keywords?: string[]) => number;\n /** Whether to loop keyboard navigation. Default: true */\n loop?: boolean;\n}\n\nexport interface CommandInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n}\n\nexport interface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport interface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n children: React.ReactNode;\n /** Value used for filtering (falls back to text content) */\n value?: string;\n /** Extra keywords for filtering */\n keywords?: string[];\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Called when item is selected (Enter or click) */\n onItemSelect?: () => void;\n}\n\nexport interface CommandGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Group heading text */\n heading?: string;\n}\n\nexport interface CommandEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport type CommandSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n// ============================================\n// Default filter\n// ============================================\n\nfunction defaultFilter(value: string, search: string, keywords?: string[]): number {\n if (!search) return 1;\n const searchLower = search.toLowerCase();\n const valueLower = value.toLowerCase();\n\n if (valueLower.includes(searchLower)) return 1;\n\n if (keywords) {\n for (const keyword of keywords) {\n if (keyword.toLowerCase().includes(searchLower)) return 1;\n }\n }\n\n return 0;\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface ItemRegistration {\n value: string;\n keywords?: string[];\n}\n\ninterface CommandContextValue {\n search: string;\n setSearch: (search: string) => void;\n filter: (value: string, search: string, keywords?: string[]) => number;\n scores: Map<string, number>;\n registerItem: (id: string, registration: ItemRegistration) => void;\n unregisterItem: (id: string) => void;\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n loop: boolean;\n listRef: React.RefObject<HTMLDivElement | null>;\n visibleCount: number;\n}\n\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\n\nfunction useCommandContext() {\n const ctx = React.useContext(CommandContext);\n if (!ctx) throw new Error('Command sub-components must be used within <Command>');\n return ctx;\n}\n\n// ============================================\n// Search Icon\n// ============================================\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction CommandRoot({\n children,\n search: controlledSearch,\n defaultSearch = '',\n onSearchChange,\n filter = defaultFilter,\n loop = true,\n className,\n ...htmlProps\n}: CommandProps) {\n const [uncontrolledSearch, setUncontrolledSearch] = React.useState(defaultSearch);\n const isControlled = controlledSearch !== undefined;\n const search = isControlled ? controlledSearch : uncontrolledSearch;\n\n const [items, setItems] = React.useState<Map<string, ItemRegistration>>(new Map());\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (!isControlled) {\n setUncontrolledSearch(value);\n }\n onSearchChange?.(value);\n },\n [isControlled, onSearchChange]\n );\n\n const registerItem = React.useCallback((id: string, registration: ItemRegistration) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.set(id, registration);\n return next;\n });\n }, []);\n\n const unregisterItem = React.useCallback((id: string) => {\n setItems((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n // Compute scores for all items\n const scores = React.useMemo(() => {\n const result = new Map<string, number>();\n for (const [id, registration] of items) {\n const score = filter(registration.value, search, registration.keywords);\n result.set(id, score);\n }\n return result;\n }, [items, search, filter]);\n\n const visibleCount = React.useMemo(() => {\n let count = 0;\n for (const score of scores.values()) {\n if (score > 0) count++;\n }\n return count;\n }, [scores]);\n\n // Reset active when search changes\n React.useEffect(() => {\n setActiveId(null);\n }, [search]);\n\n const contextValue = React.useMemo<CommandContextValue>(\n () => ({\n search,\n setSearch,\n filter,\n scores,\n registerItem,\n unregisterItem,\n activeId,\n setActiveId,\n loop,\n listRef,\n visibleCount,\n }),\n [search, setSearch, filter, scores, registerItem, unregisterItem, activeId, loop, visibleCount]\n );\n\n return (\n <CommandContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={[styles.command, className].filter(Boolean).join(' ')}\n role=\"search\"\n >\n {children}\n </div>\n </CommandContext.Provider>\n );\n}\n\nfunction CommandInput({ className, ...htmlProps }: CommandInputProps) {\n const { search, setSearch, listRef, setActiveId, activeId, loop } = useCommandContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getEnabledItems = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return [];\n return Array.from(\n list.querySelectorAll<HTMLElement>('[data-command-item]:not([data-disabled=\"true\"])')\n ).filter((el) => el.style.display !== 'none');\n }, [listRef]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n htmlProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const items = getEnabledItems();\n if (items.length === 0) return;\n\n const currentIndex = activeId\n ? items.findIndex((item) => item.id === activeId)\n : -1;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[0].id);\n } else if (currentIndex < items.length - 1) {\n setActiveId(items[currentIndex + 1].id);\n } else if (loop) {\n setActiveId(items[0].id);\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (currentIndex < 0) {\n setActiveId(items[items.length - 1].id);\n } else if (currentIndex > 0) {\n setActiveId(items[currentIndex - 1].id);\n } else if (loop) {\n setActiveId(items[items.length - 1].id);\n }\n break;\n }\n case 'Home': {\n event.preventDefault();\n setActiveId(items[0].id);\n break;\n }\n case 'End': {\n event.preventDefault();\n setActiveId(items[items.length - 1].id);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (activeId) {\n const activeItem = items.find((item) => item.id === activeId);\n if (activeItem) {\n activeItem.click();\n }\n }\n break;\n }\n }\n };\n\n return (\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-list\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId ?? undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n className={[styles.input, className].filter(Boolean).join(' ')}\n {...htmlProps}\n />\n </div>\n );\n}\n\nfunction CommandList({ children, className, ...htmlProps }: CommandListProps) {\n const { listRef } = useCommandContext();\n\n return (\n <div\n ref={listRef}\n id=\"command-list\"\n role=\"listbox\"\n className={[styles.list, className].filter(Boolean).join(' ')}\n {...htmlProps}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandItem({\n children,\n value: valueProp,\n keywords,\n disabled = false,\n onItemSelect,\n className,\n ...htmlProps\n}: CommandItemProps) {\n const { scores, registerItem, unregisterItem, activeId, setActiveId } = useCommandContext();\n const generatedId = React.useId();\n const itemId = (htmlProps.id as string | undefined) ?? `command-item-${generatedId}`;\n const itemRef = React.useRef<HTMLDivElement>(null);\n\n // Extract text content for filtering if no value prop\n const textValue = React.useMemo(() => {\n if (valueProp) return valueProp;\n if (typeof children === 'string') return children;\n return '';\n }, [valueProp, children]);\n\n // Register with context\n React.useEffect(() => {\n registerItem(itemId, { value: textValue, keywords });\n return () => unregisterItem(itemId);\n }, [itemId, textValue, keywords, registerItem, unregisterItem]);\n\n const score = scores.get(itemId) ?? 1;\n const isVisible = score > 0;\n const isActive = activeId === itemId;\n\n // Scroll active item into view\n React.useEffect(() => {\n if (isActive && itemRef.current) {\n itemRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleClick = () => {\n if (disabled) return;\n onItemSelect?.();\n };\n\n const handleMouseEnter = () => {\n if (!disabled) {\n setActiveId(itemId);\n }\n };\n\n return (\n <div\n ref={itemRef}\n {...htmlProps}\n id={itemId}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={disabled}\n data-command-item=\"\"\n data-active={isActive || undefined}\n data-disabled={disabled || undefined}\n onClick={handleClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleClick(); } }}\n onMouseEnter={handleMouseEnter}\n className={[\n styles.item,\n isActive && styles.itemActive,\n disabled && styles.itemDisabled,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ display: isVisible ? undefined : 'none' }}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandGroup({ children, heading, className, ...htmlProps }: CommandGroupProps) {\n const labelId = React.useId();\n const groupRef = React.useRef<HTMLDivElement>(null);\n const { scores } = useCommandContext();\n const [hasVisibleChildren, setHasVisibleChildren] = React.useState(true);\n\n // Check if any children are visible after each score update\n React.useEffect(() => {\n if (!groupRef.current) return;\n const items = groupRef.current.querySelectorAll<HTMLElement>('[data-command-item]');\n const anyVisible = Array.from(items).some((item) => item.style.display !== 'none');\n setHasVisibleChildren(anyVisible);\n }, [scores]);\n\n return (\n <div\n ref={groupRef}\n {...htmlProps}\n role=\"group\"\n aria-labelledby={heading ? labelId : undefined}\n className={[styles.group, className].filter(Boolean).join(' ')}\n style={{ display: hasVisibleChildren ? undefined : 'none' }}\n >\n {heading && (\n <div id={labelId} className={styles.groupHeading}>\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CommandEmpty({ children, className, ...htmlProps }: CommandEmptyProps) {\n const { visibleCount } = useCommandContext();\n\n if (visibleCount > 0) return null;\n\n return (\n <div\n {...htmlProps}\n role=\"option\"\n aria-disabled=\"true\"\n aria-selected=\"false\"\n className={[styles.empty, className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n\nfunction CommandSeparator({ className, ...htmlProps }: CommandSeparatorProps) {\n return (\n <div\n {...htmlProps}\n role=\"separator\"\n className={[styles.separator, className].filter(Boolean).join(' ')}\n />\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n Separator: CommandSeparator,\n});\n\nexport {\n CommandRoot,\n CommandInput,\n CommandList,\n CommandItem,\n CommandGroup,\n CommandEmpty,\n CommandSeparator,\n};\n"],"names":[],"mappings":"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"}