@fragments-sdk/ui 0.9.4 → 0.9.5

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 (99) hide show
  1. package/dist/assets/ui.css +247 -48
  2. package/dist/blocks/components/index.d.ts +0 -2
  3. package/dist/blocks/components/index.d.ts.map +1 -1
  4. package/dist/codeblock.cjs +7 -3
  5. package/dist/codeblock.cjs.map +1 -1
  6. package/dist/codeblock.js +7 -3
  7. package/dist/codeblock.js.map +1 -1
  8. package/dist/components/Box/Box.module.scss.cjs +73 -0
  9. package/dist/components/Box/Box.module.scss.cjs.map +1 -1
  10. package/dist/components/Box/Box.module.scss.js +73 -0
  11. package/dist/components/Box/Box.module.scss.js.map +1 -1
  12. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +6 -0
  13. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs.map +1 -1
  14. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +6 -0
  15. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js.map +1 -1
  16. package/dist/components/CodeBlock/index.d.ts +5 -1
  17. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  18. package/dist/components/DataTable/DataTable.module.scss.cjs +84 -0
  19. package/dist/components/DataTable/DataTable.module.scss.cjs.map +1 -0
  20. package/dist/components/DataTable/DataTable.module.scss.js +84 -0
  21. package/dist/components/DataTable/DataTable.module.scss.js.map +1 -0
  22. package/dist/components/DataTable/index.cjs +383 -0
  23. package/dist/components/DataTable/index.cjs.map +1 -0
  24. package/dist/components/DataTable/index.d.ts +78 -0
  25. package/dist/components/DataTable/index.d.ts.map +1 -0
  26. package/dist/components/DataTable/index.js +366 -0
  27. package/dist/components/DataTable/index.js.map +1 -0
  28. package/dist/components/Drawer/Drawer.module.scss.cjs +9 -0
  29. package/dist/components/Drawer/Drawer.module.scss.cjs.map +1 -1
  30. package/dist/components/Drawer/Drawer.module.scss.js +9 -0
  31. package/dist/components/Drawer/Drawer.module.scss.js.map +1 -1
  32. package/dist/components/Image/Image.module.scss.cjs +12 -0
  33. package/dist/components/Image/Image.module.scss.cjs.map +1 -1
  34. package/dist/components/Image/Image.module.scss.js +12 -0
  35. package/dist/components/Image/Image.module.scss.js.map +1 -1
  36. package/dist/components/Link/Link.module.scss.cjs +3 -0
  37. package/dist/components/Link/Link.module.scss.cjs.map +1 -1
  38. package/dist/components/Link/Link.module.scss.js +3 -0
  39. package/dist/components/Link/Link.module.scss.js.map +1 -1
  40. package/dist/components/List/List.module.scss.cjs +5 -0
  41. package/dist/components/List/List.module.scss.cjs.map +1 -1
  42. package/dist/components/List/List.module.scss.js +5 -0
  43. package/dist/components/List/List.module.scss.js.map +1 -1
  44. package/dist/components/Loading/Loading.module.scss.cjs +5 -0
  45. package/dist/components/Loading/Loading.module.scss.cjs.map +1 -1
  46. package/dist/components/Loading/Loading.module.scss.js +5 -0
  47. package/dist/components/Loading/Loading.module.scss.js.map +1 -1
  48. package/dist/components/Skeleton/Skeleton.module.scss.cjs +14 -0
  49. package/dist/components/Skeleton/Skeleton.module.scss.cjs.map +1 -1
  50. package/dist/components/Skeleton/Skeleton.module.scss.js +14 -0
  51. package/dist/components/Skeleton/Skeleton.module.scss.js.map +1 -1
  52. package/dist/components/Stack/Stack.module.scss.cjs +14 -0
  53. package/dist/components/Stack/Stack.module.scss.cjs.map +1 -1
  54. package/dist/components/Stack/Stack.module.scss.js +14 -0
  55. package/dist/components/Stack/Stack.module.scss.js.map +1 -1
  56. package/dist/components/Table/Table.module.scss.cjs +21 -36
  57. package/dist/components/Table/Table.module.scss.cjs.map +1 -1
  58. package/dist/components/Table/Table.module.scss.js +21 -36
  59. package/dist/components/Table/Table.module.scss.js.map +1 -1
  60. package/dist/components/Table/index.d.ts +35 -55
  61. package/dist/components/Table/index.d.ts.map +1 -1
  62. package/dist/components/Text/Text.module.scss.cjs +14 -0
  63. package/dist/components/Text/Text.module.scss.cjs.map +1 -1
  64. package/dist/components/Text/Text.module.scss.js +14 -0
  65. package/dist/components/Text/Text.module.scss.js.map +1 -1
  66. package/dist/components/Textarea/Textarea.module.scss.cjs +4 -0
  67. package/dist/components/Textarea/Textarea.module.scss.cjs.map +1 -1
  68. package/dist/components/Textarea/Textarea.module.scss.js +4 -0
  69. package/dist/components/Textarea/Textarea.module.scss.js.map +1 -1
  70. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +5 -0
  71. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs.map +1 -1
  72. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +5 -0
  73. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js.map +1 -1
  74. package/dist/index.cjs +119 -117
  75. package/dist/index.cjs.map +1 -1
  76. package/dist/index.d.ts +2 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +3 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/table.cjs +44 -262
  81. package/dist/table.cjs.map +1 -1
  82. package/dist/table.js +47 -248
  83. package/dist/table.js.map +1 -1
  84. package/fragments.json +1 -1
  85. package/package.json +110 -118
  86. package/src/blocks/components/index.ts +0 -3
  87. package/src/components/CodeBlock/index.tsx +9 -1
  88. package/src/components/DataTable/DataTable.fragment.tsx +754 -0
  89. package/src/components/DataTable/DataTable.module.scss +300 -0
  90. package/src/components/DataTable/DataTable.test.tsx +224 -0
  91. package/src/components/DataTable/index.tsx +533 -0
  92. package/src/components/Table/Table.fragment.tsx +190 -175
  93. package/src/components/Table/Table.module.scss +15 -88
  94. package/src/components/Table/Table.test.tsx +184 -94
  95. package/src/components/Table/index.tsx +105 -374
  96. package/src/index.ts +15 -4
  97. package/dist/blocks/components/DataTable.d.ts +0 -19
  98. package/dist/blocks/components/DataTable.d.ts.map +0 -1
  99. package/src/blocks/components/DataTable.tsx +0 -124
@@ -1 +1 @@
1
- {"version":3,"file":"codeblock.cjs","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: ((code: string, options: { lang: string; theme: string }) => Promise<string>) | 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}\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\n .map(line => line.slice(minIndent))\n .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\n ? `<span class=\"diff-marker\">${diffMarker}</span>`\n : '';\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(\n /<code[^>]*>[\\s\\S]*?<\\/code>/,\n `<code>${processedLines.join('\\n')}</code>`\n );\n}\n\nconst CodeBlockBase = React.forwardRef<HTMLDivElement, CodeBlockProps>(\n 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 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 = shouldShowCollapse && isCollapsed\n ? codeLines.slice(0, collapsedLines).join('\\n')\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 = copyPlacement === 'auto'\n ? (filename ? 'header' : 'overlay')\n : 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(\n `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`\n );\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(\n `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`\n );\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [visibleCode, language, theme, showLineNumbers, startLineNumber, highlightSet, addedSet, removedSet]);\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 } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.error('Failed to copy:', err);\n }\n }\n }, [trimmedCode]);\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 ].filter(Boolean).join(' ');\n\n const codeContainerStyle: React.CSSProperties = maxHeight\n ? { maxHeight, overflow: 'auto' }\n : {};\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 ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\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 <div className={styles.persistentCopy}>\n <Button\n size=\"sm\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied!' : 'Copy code'}\n icon={copied ? true : false}\n >\n {copied ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\n </Button>\n </div>\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// ============================================\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}\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}: 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 />\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":["jsxs","jsx","_a","index","React","CodeBlock","useState","useMemo","useEffect","useCallback","styles","Button","Fragment","TabsRoot","TabsList","Tab","TabsPanel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAI,cAAoG;AACxG,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;AAmGA,SAAS,SAAS,EAAE,aAAqC;AACvD,SACEA,2BAAAA;AAAAA,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,QAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,QACvDA,2BAAAA,IAAC,QAAA,EAAK,GAAE,0DAAA,CAA0D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGxE;AAEA,SAAS,UAAU,EAAE,aAAqC;AACxD,SACEA,2BAAAA;AAAAA,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,UAAAA,2BAAAA,IAAC,YAAA,EAAS,QAAO,iBAAA,CAAiB;AAAA,IAAA;AAAA,EAAA;AAGxC;AAEA,SAAS,gBAAgB,EAAE,aAAqC;AAC9D,SACEA,2BAAAA;AAAAA,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,UAAAA,2BAAAA,IAAC,YAAA,EAAS,QAAO,iBAAA,CAAiB;AAAA,IAAA;AAAA,EAAA;AAGxC;AAEA,SAAS,cAAc,EAAE,aAAqC;AAC5D,SACEA,2BAAAA;AAAAA,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,UAAAA,2BAAAA,IAAC,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,MACJ,IAAI,CAAA,SAAQ,KAAK,MAAM,SAAS,CAAC,EACjC,KAAK,IAAI;AACd;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,aAAWC,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,QAAiC;AACrC,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,OAAQ,SAAS,KAAK;AACjD,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,QAAiC;AACrC,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,OAAQ,SAAS,KAAK;AACjD,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,KACpB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,IAAI,GAC1B;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,MAAMC,WAAU;AAChD,UAAM,UAAUA,SAAQ;AACxB,UAAM,iBAAiB,kBAAkBA;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,UACnB,6BAA6B,UAAU,YACvC;AACJ,aAAO,gBAAgB,SAAS,KAAK,WAAW,GAAG,cAAc,GAAG,IAAI;AAAA,IAC1E;AACA,WAAO,gBAAgB,SAAS,KAAK,IAAI;AAAA,EAC3C,CAAC;AAGD,SAAO,KAAK;AAAA,IACV;AAAA,IACA,SAAS,eAAe,KAAK,IAAI,CAAC;AAAA,EAAA;AAEtC;AAEA,MAAM,gBAAgBC,iBAAM;AAAA,EAC1B,SAASC,WACP;AAAA,IACE;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,KACA;AACA,UAAM,CAAC,QAAQ,SAAS,IAAIC,MAAAA,SAAS,KAAK;AAC1C,UAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA,SAAiB,EAAE;AACjE,UAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,IAAI;AAC/C,UAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,gBAAgB;AAE/D,UAAM,cAAcC,MAAAA,QAAQ,MAAM,cAAc,IAAI,GAAG,CAAC,IAAI,CAAC;AAC7D,UAAM,YAAY,YAAY,MAAM,IAAI;AACxC,UAAM,aAAa,UAAU;AAC7B,UAAM,qBAAqB,eAAe,aAAa;AAGvD,UAAM,cAAc,sBAAsB,cACtC,UAAU,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI,IAC5C;AAEJ,UAAM,eAAeA,MAAAA,QAAQ,MAAM,cAAc,cAAc,GAAG,CAAC,cAAc,CAAC;AAClF,UAAM,WAAWA,MAAAA,QAAQ,MAAM,cAAc,UAAU,GAAG,CAAC,UAAU,CAAC;AACtE,UAAM,aAAaA,MAAAA,QAAQ,MAAM,cAAc,YAAY,GAAG,CAAC,YAAY,CAAC;AAC5E,UAAM,UAAU,SAAS,OAAO,KAAK,WAAW,OAAO;AACvD,UAAM,wBAAwB,kBAAkB,SAC3C,WAAW,WAAW,YACvB;AACJ,UAAM,uBAAuB,YAAY,CAAC,kBAAkB,0BAA0B;AACtF,UAAM,wBAAwB,YAAY,CAAC,kBAAkB,0BAA0B;AACvF,UAAM,qBAAqB,QAAQ,QAAQ,KAAK;AAGhDC,UAAAA,UAAU,MAAM;AACd,UAAI,YAAY;AAChB,mBAAa,IAAI;AAEjB,oBAAA;AAEA,UAAI,gBAAgB,CAAC,aAAa;AAChC,YAAI,gBAAgB,QAAQ,IAAI,aAAa,eAAe;AAC1D,kBAAQ;AAAA,YACN;AAAA,UAAA;AAAA,QAGJ;AAEA;AAAA,UACE,4BAA4B,WAAW,WAAW,CAAC;AAAA,QAAA;AAErD,qBAAa,KAAK;AAClB;AAAA,MACF;AAEA,kBAAY,aAAa;AAAA,QACvB,MAAM;AAAA,QACN;AAAA,MAAA,CACD,EACE,KAAK,CAAC,SAAS;AACd,YAAI,CAAC,WAAW;AACd,gBAAM,YAAY,iBAAiB,MAAM;AAAA,YACvC;AAAA,YACA;AAAA,YACA,gBAAgB;AAAA,YAChB,YAAY;AAAA,YACZ,cAAc;AAAA,UAAA,CACf;AACD,6BAAmB,SAAS;AAC5B,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,YAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,kBAAQ,MAAM,+BAA+B,GAAG;AAAA,QAClD;AACA,YAAI,CAAC,WAAW;AAEd;AAAA,YACE,4BAA4B,WAAW,WAAW,CAAC;AAAA,UAAA;AAErD,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF,CAAC;AAEH,aAAO,MAAM;AACX,oBAAY;AAAA,MACd;AAAA,IACF,GAAG,CAAC,aAAa,UAAU,OAAO,iBAAiB,iBAAiB,cAAc,UAAU,UAAU,CAAC;AAEvG,UAAM,aAAaC,MAAAA,YAAY,YAAY;AACzC,UAAI;AAEF,cAAM,UAAU,UAAU,UAAU,WAAW;AAC/C,kBAAU,IAAI;AACd,mBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,MACzC,SAAS,KAAK;AACZ,YAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,kBAAQ,MAAM,mBAAmB,GAAG;AAAA,QACtC;AAAA,MACF;AAAA,IACF,GAAG,CAAC,WAAW,CAAC;AAEhB,UAAM,kBAAkBA,MAAAA,YAAY,MAAM;AACxC,qBAAe,CAAC,SAAS,CAAC,IAAI;AAAA,IAChC,GAAG,CAAA,CAAE;AAEL,UAAM,aAAa;AAAA,MACjBC,iBAAAA,QAAO;AAAA,MACP,mBAAmBA,iBAAAA,QAAO;AAAA,MAC1B,WAAWA,iBAAAA,QAAO;AAAA,MAClB,YAAYA,iBAAAA,QAAO;AAAA,MACnB,WAAWA,iBAAAA,QAAO;AAAA,MAClB;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,UAAM,iBAAiB;AAAA,MACrBA,iBAAAA,QAAO;AAAA,MACP,kBAAkBA,iBAAAA,QAAO;AAAA,MACzB,yBAAyBA,iBAAAA,QAAO;AAAA,IAAA,EAChC,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,UAAM,qBAA0C,YAC5C,EAAE,WAAW,UAAU,OAAA,IACvB,CAAA;AAEJ,WACEV,gCAAC,SAAI,KAAW,GAAG,WAAW,WAAW,YAAY,cAAW,QAC7D,UAAA;AAAA,MAAA,SAASC,2BAAAA,IAAC,OAAA,EAAI,WAAWS,iBAAAA,QAAO,OAAQ,UAAA,OAAM;AAAA,MAC/CV,2BAAAA,KAAC,OAAA,EAAI,WAAW,gBACb,UAAA;AAAA,QAAA,sBACCA,2BAAAA,KAAC,OAAA,EAAI,WAAWU,iBAAAA,QAAO,QACrB,UAAA;AAAA,UAAAT,+BAAC,QAAA,EAAK,WAAWS,iBAAAA,QAAO,UAAW,sBAAY,IAAG;AAAA,UACjD,wBACCT,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAW,GAAGS,iBAAAA,QAAO,UAAU,IAAI,SAASA,iBAAAA,QAAO,SAAS,EAAE;AAAA,cAC9D,cAAY,SAAS,YAAY;AAAA,cAEhC,UAAA,SAAST,2BAAAA,IAAC,WAAA,EAAU,WAAWS,iBAAAA,QAAO,KAAA,CAAM,IAAKT,2BAAAA,IAAC,UAAA,EAAS,WAAWS,iBAAAA,QAAO,KAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QACtF,GAEJ;AAAA,QAED,yBACCT,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAW,GAAGS,iBAAAA,QAAO,UAAU,IAAIA,iBAAAA,QAAO,WAAW,IAAI,SAASA,iBAAAA,QAAO,SAAS,EAAE;AAAA,YACpF,cAAY,SAAS,YAAY;AAAA,YAEhC,UAAA,SAAST,2BAAAA,IAAC,WAAA,EAAU,WAAWS,iBAAAA,QAAO,KAAA,CAAM,IAAKT,2BAAAA,IAAC,UAAA,EAAS,WAAWS,iBAAAA,QAAO,KAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAGvF,YACCT,2BAAAA,IAAC,OAAA,EAAI,WAAWS,iBAAAA,QAAO,SAAS,OAAO,oBACrC,UAAAT,2BAAAA,IAAC,SACC,UAAAA,2BAAAA,IAAC,QAAA,EAAM,UAAA,aAAY,EAAA,CACrB,GACF,IAEAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWS,iBAAAA,QAAO;AAAA,YAClB,OAAO;AAAA,YACP,yBAAyB,EAAE,QAAQ,gBAAA;AAAA,UAAgB;AAAA,QAAA;AAAA,QAGtD,kBACCT,2BAAAA,IAAC,OAAA,EAAI,WAAWS,yBAAO,gBACrB,UAAAT,2BAAAA;AAAAA,UAACU,MAAAA;AAAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,cAAY,SAAS,YAAY;AAAA,YACjC,MAAM,SAAS,OAAO;AAAA,YAErB,UAAA,SAASV,2BAAAA,IAAC,WAAA,EAAU,WAAWS,iBAAAA,QAAO,KAAA,CAAM,IAAKT,2BAAAA,IAAC,UAAA,EAAS,WAAWS,iBAAAA,QAAO,KAAA,CAAM;AAAA,UAAA;AAAA,QAAA,GAExF;AAAA,QAED,sBACCT,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAWS,iBAAAA,QAAO;AAAA,YAClB,iBAAe,CAAC;AAAA,YAChB,cAAY,cAAc,gBAAgB;AAAA,YAEzC,wBACCV,2BAAAA,KAAAY,WAAAA,UAAA,EACE,UAAA;AAAA,cAAAX,2BAAAA,IAAC,iBAAA,EAAgB,WAAWS,iBAAAA,QAAO,KAAA,CAAM;AAAA,8CACxC,QAAA,EAAK,UAAA;AAAA,gBAAA;AAAA,gBAAM,aAAa;AAAA,gBAAe;AAAA,cAAA,EAAA,CAAW;AAAA,YAAA,EAAA,CACrD,IAEAV,2BAAAA,KAAAY,WAAAA,UAAA,EACE,UAAA;AAAA,cAAAX,2BAAAA,IAAC,eAAA,EAAc,WAAWS,iBAAAA,QAAO,KAAA,CAAM;AAAA,cACvCT,2BAAAA,IAAC,UAAK,UAAA,YAAA,CAAS;AAAA,YAAA,EAAA,CACjB;AAAA,UAAA;AAAA,QAAA;AAAA,MAEJ,GAEJ;AAAA,MACC,WAAWA,2BAAAA,IAAC,OAAA,EAAI,WAAWS,iBAAAA,QAAO,SAAU,UAAA,QAAA,CAAQ;AAAA,IAAA,GACvD;AAAA,EAEJ;AACF;AAsCA,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;AACF,GAAyB;;AACvB,QAAM,eAAe,gBAAc,UAAK,CAAC,MAAN,mBAAS,UAAS;AAErD,SACET,2BAAAA,IAAC,OAAA,EAAI,WACH,UAAAD,2BAAAA,KAACa,QAAAA,YAAS,cACR,UAAA;AAAA,IAAAZ,+BAACa,QAAAA,YAAS,SAAS,aAChB,UAAA,KAAK,IAAI,CAAC,QACTb,+BAACc,QAAAA,KAAA,EAAoB,OAAO,IAAI,OAC7B,UAAA,IAAI,SADG,IAAI,KAEd,CACD,GACH;AAAA,IACC,KAAK,IAAI,CAAC,QACTd,2BAAAA,IAACe,QAAAA,WAAA,EAA0B,OAAO,IAAI,OAAO,OAAK,MAAC,WAAWN,iBAAAA,QAAO,aACnE,UAAAT,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,IAAI;AAAA,QACV,UAAU,IAAI;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA,EACF,GAVc,IAAI,KAWpB,CACD;AAAA,EAAA,EAAA,CACH,EAAA,CACF;AAEJ;AAMO,MAAM,YAAY,OAAO,OAAO,eAAe;AAAA,EACpD,QAAQ;AACV,CAAC;;;"}
1
+ {"version":3,"file":"codeblock.cjs","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: ((code: string, options: { lang: string; theme: string }) => Promise<string>) | 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\n .map(line => line.slice(minIndent))\n .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\n ? `<span class=\"diff-marker\">${diffMarker}</span>`\n : '';\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(\n /<code[^>]*>[\\s\\S]*?<\\/code>/,\n `<code>${processedLines.join('\\n')}</code>`\n );\n}\n\nconst CodeBlockBase = React.forwardRef<HTMLDivElement, CodeBlockProps>(\n 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 = shouldShowCollapse && isCollapsed\n ? codeLines.slice(0, collapsedLines).join('\\n')\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 = copyPlacement === 'auto'\n ? (filename ? 'header' : 'overlay')\n : 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(\n `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`\n );\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(\n `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`\n );\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [visibleCode, language, theme, showLineNumbers, startLineNumber, highlightSet, addedSet, removedSet]);\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 ].filter(Boolean).join(' ');\n\n const codeContainerStyle: React.CSSProperties = maxHeight\n ? { maxHeight, overflow: 'auto' }\n : {};\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 ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\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 <div className={styles.persistentCopy}>\n <Button\n size=\"sm\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied!' : 'Copy code'}\n icon={copied ? true : false}\n >\n {copied ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\n </Button>\n </div>\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// ============================================\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":["jsxs","jsx","_a","index","React","CodeBlock","useState","useMemo","useEffect","useCallback","styles","Button","Fragment","TabsRoot","TabsList","Tab","TabsPanel"],"mappings":"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"}
package/dist/codeblock.js CHANGED
@@ -338,6 +338,7 @@ const CodeBlockBase = React.forwardRef(
338
338
  compact = false,
339
339
  persistentCopy = false,
340
340
  copyPlacement = "auto",
341
+ onCopy,
341
342
  className,
342
343
  ...htmlProps
343
344
  }, ref) {
@@ -409,12 +410,13 @@ const CodeBlockBase = React.forwardRef(
409
410
  await navigator.clipboard.writeText(trimmedCode);
410
411
  setCopied(true);
411
412
  setTimeout(() => setCopied(false), 2e3);
413
+ onCopy == null ? void 0 : onCopy();
412
414
  } catch (err) {
413
415
  if (process.env.NODE_ENV !== "production") {
414
416
  console.error("Failed to copy:", err);
415
417
  }
416
418
  }
417
- }, [trimmedCode]);
419
+ }, [trimmedCode, onCopy]);
418
420
  const toggleCollapsed = useCallback(() => {
419
421
  setIsCollapsed((prev) => !prev);
420
422
  }, []);
@@ -512,7 +514,8 @@ function TabbedCodeBlock({
512
514
  tabsVariant = "pills",
513
515
  wordWrap,
514
516
  maxHeight,
515
- className
517
+ className,
518
+ onCopy
516
519
  }) {
517
520
  var _a;
518
521
  const defaultValue = defaultTab || ((_a = tabs[0]) == null ? void 0 : _a.label) || "";
@@ -528,7 +531,8 @@ function TabbedCodeBlock({
528
531
  copyPlacement,
529
532
  showLineNumbers,
530
533
  wordWrap,
531
- maxHeight
534
+ maxHeight,
535
+ onCopy: onCopy ? () => onCopy(tab.label) : void 0
532
536
  }
533
537
  ) }, tab.label))
534
538
  ] }) });
@@ -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: ((code: string, options: { lang: string; theme: string }) => Promise<string>) | 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}\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\n .map(line => line.slice(minIndent))\n .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\n ? `<span class=\"diff-marker\">${diffMarker}</span>`\n : '';\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(\n /<code[^>]*>[\\s\\S]*?<\\/code>/,\n `<code>${processedLines.join('\\n')}</code>`\n );\n}\n\nconst CodeBlockBase = React.forwardRef<HTMLDivElement, CodeBlockProps>(\n 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 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 = shouldShowCollapse && isCollapsed\n ? codeLines.slice(0, collapsedLines).join('\\n')\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 = copyPlacement === 'auto'\n ? (filename ? 'header' : 'overlay')\n : 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(\n `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`\n );\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(\n `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`\n );\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [visibleCode, language, theme, showLineNumbers, startLineNumber, highlightSet, addedSet, removedSet]);\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 } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.error('Failed to copy:', err);\n }\n }\n }, [trimmedCode]);\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 ].filter(Boolean).join(' ');\n\n const codeContainerStyle: React.CSSProperties = maxHeight\n ? { maxHeight, overflow: 'auto' }\n : {};\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 ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\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 <div className={styles.persistentCopy}>\n <Button\n size=\"sm\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied!' : 'Copy code'}\n icon={copied ? true : false}\n >\n {copied ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\n </Button>\n </div>\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// ============================================\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}\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}: 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 />\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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"}
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: ((code: string, options: { lang: string; theme: string }) => Promise<string>) | 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\n .map(line => line.slice(minIndent))\n .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\n ? `<span class=\"diff-marker\">${diffMarker}</span>`\n : '';\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(\n /<code[^>]*>[\\s\\S]*?<\\/code>/,\n `<code>${processedLines.join('\\n')}</code>`\n );\n}\n\nconst CodeBlockBase = React.forwardRef<HTMLDivElement, CodeBlockProps>(\n 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 = shouldShowCollapse && isCollapsed\n ? codeLines.slice(0, collapsedLines).join('\\n')\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 = copyPlacement === 'auto'\n ? (filename ? 'header' : 'overlay')\n : 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(\n `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`\n );\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(\n `<pre class=\"shiki\"><code>${escapeHtml(visibleCode)}</code></pre>`\n );\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [visibleCode, language, theme, showLineNumbers, startLineNumber, highlightSet, addedSet, removedSet]);\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 ].filter(Boolean).join(' ');\n\n const codeContainerStyle: React.CSSProperties = maxHeight\n ? { maxHeight, overflow: 'auto' }\n : {};\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 ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\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 <div className={styles.persistentCopy}>\n <Button\n size=\"sm\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied!' : 'Copy code'}\n icon={copied ? true : false}\n >\n {copied ? <CheckIcon className={styles.icon} /> : <CopyIcon className={styles.icon} />}\n </Button>\n </div>\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// ============================================\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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"}
@@ -81,83 +81,156 @@ const displayGrid = "_display-grid_18cnf_335";
81
81
  const displayNone = "_display-none_18cnf_339";
82
82
  const styles = {
83
83
  box,
84
+ "p-none": "_p-none_18cnf_5",
84
85
  pNone,
86
+ "p-xs": "_p-xs_18cnf_9",
85
87
  pXs,
88
+ "p-sm": "_p-sm_18cnf_13",
86
89
  pSm,
90
+ "p-md": "_p-md_18cnf_17",
87
91
  pMd,
92
+ "p-lg": "_p-lg_18cnf_21",
88
93
  pLg,
94
+ "p-xl": "_p-xl_18cnf_25",
89
95
  pXl,
96
+ "px-none": "_px-none_18cnf_29",
90
97
  pxNone,
98
+ "px-xs": "_px-xs_18cnf_34",
91
99
  pxXs,
100
+ "px-sm": "_px-sm_18cnf_39",
92
101
  pxSm,
102
+ "px-md": "_px-md_18cnf_44",
93
103
  pxMd,
104
+ "px-lg": "_px-lg_18cnf_49",
94
105
  pxLg,
106
+ "px-xl": "_px-xl_18cnf_54",
95
107
  pxXl,
108
+ "py-none": "_py-none_18cnf_59",
96
109
  pyNone,
110
+ "py-xs": "_py-xs_18cnf_64",
97
111
  pyXs,
112
+ "py-sm": "_py-sm_18cnf_69",
98
113
  pySm,
114
+ "py-md": "_py-md_18cnf_74",
99
115
  pyMd,
116
+ "py-lg": "_py-lg_18cnf_79",
100
117
  pyLg,
118
+ "py-xl": "_py-xl_18cnf_84",
101
119
  pyXl,
120
+ "m-none": "_m-none_18cnf_89",
102
121
  mNone,
122
+ "m-xs": "_m-xs_18cnf_93",
103
123
  mXs,
124
+ "m-sm": "_m-sm_18cnf_97",
104
125
  mSm,
126
+ "m-md": "_m-md_18cnf_101",
105
127
  mMd,
128
+ "m-lg": "_m-lg_18cnf_105",
106
129
  mLg,
130
+ "m-xl": "_m-xl_18cnf_109",
107
131
  mXl,
132
+ "m-auto": "_m-auto_18cnf_113",
108
133
  mAuto,
134
+ "mx-none": "_mx-none_18cnf_117",
109
135
  mxNone,
136
+ "mx-xs": "_mx-xs_18cnf_122",
110
137
  mxXs,
138
+ "mx-sm": "_mx-sm_18cnf_127",
111
139
  mxSm,
140
+ "mx-md": "_mx-md_18cnf_132",
112
141
  mxMd,
142
+ "mx-lg": "_mx-lg_18cnf_137",
113
143
  mxLg,
144
+ "mx-xl": "_mx-xl_18cnf_142",
114
145
  mxXl,
146
+ "mx-auto": "_mx-auto_18cnf_147",
115
147
  mxAuto,
148
+ "my-none": "_my-none_18cnf_152",
116
149
  myNone,
150
+ "my-xs": "_my-xs_18cnf_157",
117
151
  myXs,
152
+ "my-sm": "_my-sm_18cnf_162",
118
153
  mySm,
154
+ "my-md": "_my-md_18cnf_167",
119
155
  myMd,
156
+ "my-lg": "_my-lg_18cnf_172",
120
157
  myLg,
158
+ "my-xl": "_my-xl_18cnf_177",
121
159
  myXl,
160
+ "my-auto": "_my-auto_18cnf_182",
122
161
  myAuto,
162
+ "bg-none": "_bg-none_18cnf_187",
123
163
  bgNone,
164
+ "bg-primary": "_bg-primary_18cnf_191",
124
165
  bgPrimary,
166
+ "bg-secondary": "_bg-secondary_18cnf_195",
125
167
  bgSecondary,
168
+ "bg-tertiary": "_bg-tertiary_18cnf_199",
126
169
  bgTertiary,
170
+ "bg-elevated": "_bg-elevated_18cnf_203",
127
171
  bgElevated,
172
+ "rounded-none": "_rounded-none_18cnf_207",
128
173
  roundedNone,
174
+ "rounded-sm": "_rounded-sm_18cnf_211",
129
175
  roundedSm,
176
+ "rounded-md": "_rounded-md_18cnf_215",
130
177
  roundedMd,
178
+ "rounded-lg": "_rounded-lg_18cnf_219",
131
179
  roundedLg,
180
+ "rounded-full": "_rounded-full_18cnf_223",
132
181
  roundedFull,
133
182
  border,
134
183
  borderTop,
135
184
  borderBottom,
136
185
  borderLeft,
137
186
  borderRight,
187
+ "borderColor-default": "_borderColor-default_18cnf_247",
138
188
  borderColorDefault,
189
+ "borderColor-strong": "_borderColor-strong_18cnf_251",
139
190
  borderColorStrong,
191
+ "borderColor-accent": "_borderColor-accent_18cnf_255",
140
192
  borderColorAccent,
193
+ "borderColor-danger": "_borderColor-danger_18cnf_259",
141
194
  borderColorDanger,
195
+ "shadow-sm": "_shadow-sm_18cnf_263",
142
196
  shadowSm,
197
+ "shadow-md": "_shadow-md_18cnf_267",
143
198
  shadowMd,
199
+ "shadow-lg": "_shadow-lg_18cnf_271",
144
200
  shadowLg,
201
+ "shadow-none": "_shadow-none_18cnf_275",
145
202
  shadowNone,
203
+ "overflow-hidden": "_overflow-hidden_18cnf_279",
146
204
  overflowHidden,
205
+ "overflow-auto": "_overflow-auto_18cnf_283",
147
206
  overflowAuto,
207
+ "overflow-scroll": "_overflow-scroll_18cnf_287",
148
208
  overflowScroll,
209
+ "overflow-visible": "_overflow-visible_18cnf_291",
149
210
  overflowVisible,
211
+ "color-primary": "_color-primary_18cnf_295",
150
212
  colorPrimary,
213
+ "color-secondary": "_color-secondary_18cnf_299",
151
214
  colorSecondary,
215
+ "color-tertiary": "_color-tertiary_18cnf_303",
152
216
  colorTertiary,
217
+ "color-accent": "_color-accent_18cnf_307",
153
218
  colorAccent,
219
+ "color-inverse": "_color-inverse_18cnf_311",
154
220
  colorInverse,
221
+ "display-block": "_display-block_18cnf_315",
155
222
  displayBlock,
223
+ "display-inline": "_display-inline_18cnf_319",
156
224
  displayInline,
225
+ "display-inline-block": "_display-inline-block_18cnf_323",
157
226
  displayInlineBlock,
227
+ "display-flex": "_display-flex_18cnf_327",
158
228
  displayFlex,
229
+ "display-inline-flex": "_display-inline-flex_18cnf_331",
159
230
  displayInlineFlex,
231
+ "display-grid": "_display-grid_18cnf_335",
160
232
  displayGrid,
233
+ "display-none": "_display-none_18cnf_339",
161
234
  displayNone
162
235
  };
163
236
  exports.bgElevated = bgElevated;
@@ -1 +1 @@
1
- {"version":3,"file":"Box.module.scss.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Box.module.scss.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}