@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.
- package/dist/assets/ui.css +247 -48
- package/dist/blocks/components/index.d.ts +0 -2
- package/dist/blocks/components/index.d.ts.map +1 -1
- package/dist/codeblock.cjs +7 -3
- package/dist/codeblock.cjs.map +1 -1
- package/dist/codeblock.js +7 -3
- package/dist/codeblock.js.map +1 -1
- package/dist/components/Box/Box.module.scss.cjs +73 -0
- package/dist/components/Box/Box.module.scss.cjs.map +1 -1
- package/dist/components/Box/Box.module.scss.js +73 -0
- package/dist/components/Box/Box.module.scss.js.map +1 -1
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +6 -0
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs.map +1 -1
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +6 -0
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.js.map +1 -1
- package/dist/components/CodeBlock/index.d.ts +5 -1
- package/dist/components/CodeBlock/index.d.ts.map +1 -1
- package/dist/components/DataTable/DataTable.module.scss.cjs +84 -0
- package/dist/components/DataTable/DataTable.module.scss.cjs.map +1 -0
- package/dist/components/DataTable/DataTable.module.scss.js +84 -0
- package/dist/components/DataTable/DataTable.module.scss.js.map +1 -0
- package/dist/components/DataTable/index.cjs +383 -0
- package/dist/components/DataTable/index.cjs.map +1 -0
- package/dist/components/DataTable/index.d.ts +78 -0
- package/dist/components/DataTable/index.d.ts.map +1 -0
- package/dist/components/DataTable/index.js +366 -0
- package/dist/components/DataTable/index.js.map +1 -0
- package/dist/components/Drawer/Drawer.module.scss.cjs +9 -0
- package/dist/components/Drawer/Drawer.module.scss.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.module.scss.js +9 -0
- package/dist/components/Drawer/Drawer.module.scss.js.map +1 -1
- package/dist/components/Image/Image.module.scss.cjs +12 -0
- package/dist/components/Image/Image.module.scss.cjs.map +1 -1
- package/dist/components/Image/Image.module.scss.js +12 -0
- package/dist/components/Image/Image.module.scss.js.map +1 -1
- package/dist/components/Link/Link.module.scss.cjs +3 -0
- package/dist/components/Link/Link.module.scss.cjs.map +1 -1
- package/dist/components/Link/Link.module.scss.js +3 -0
- package/dist/components/Link/Link.module.scss.js.map +1 -1
- package/dist/components/List/List.module.scss.cjs +5 -0
- package/dist/components/List/List.module.scss.cjs.map +1 -1
- package/dist/components/List/List.module.scss.js +5 -0
- package/dist/components/List/List.module.scss.js.map +1 -1
- package/dist/components/Loading/Loading.module.scss.cjs +5 -0
- package/dist/components/Loading/Loading.module.scss.cjs.map +1 -1
- package/dist/components/Loading/Loading.module.scss.js +5 -0
- package/dist/components/Loading/Loading.module.scss.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.scss.cjs +14 -0
- package/dist/components/Skeleton/Skeleton.module.scss.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.scss.js +14 -0
- package/dist/components/Skeleton/Skeleton.module.scss.js.map +1 -1
- package/dist/components/Stack/Stack.module.scss.cjs +14 -0
- package/dist/components/Stack/Stack.module.scss.cjs.map +1 -1
- package/dist/components/Stack/Stack.module.scss.js +14 -0
- package/dist/components/Stack/Stack.module.scss.js.map +1 -1
- package/dist/components/Table/Table.module.scss.cjs +21 -36
- package/dist/components/Table/Table.module.scss.cjs.map +1 -1
- package/dist/components/Table/Table.module.scss.js +21 -36
- package/dist/components/Table/Table.module.scss.js.map +1 -1
- package/dist/components/Table/index.d.ts +35 -55
- package/dist/components/Table/index.d.ts.map +1 -1
- package/dist/components/Text/Text.module.scss.cjs +14 -0
- package/dist/components/Text/Text.module.scss.cjs.map +1 -1
- package/dist/components/Text/Text.module.scss.js +14 -0
- package/dist/components/Text/Text.module.scss.js.map +1 -1
- package/dist/components/Textarea/Textarea.module.scss.cjs +4 -0
- package/dist/components/Textarea/Textarea.module.scss.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.module.scss.js +4 -0
- package/dist/components/Textarea/Textarea.module.scss.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +5 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +5 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js.map +1 -1
- package/dist/index.cjs +119 -117
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/table.cjs +44 -262
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +47 -248
- package/dist/table.js.map +1 -1
- package/fragments.json +1 -1
- package/package.json +110 -118
- package/src/blocks/components/index.ts +0 -3
- package/src/components/CodeBlock/index.tsx +9 -1
- package/src/components/DataTable/DataTable.fragment.tsx +754 -0
- package/src/components/DataTable/DataTable.module.scss +300 -0
- package/src/components/DataTable/DataTable.test.tsx +224 -0
- package/src/components/DataTable/index.tsx +533 -0
- package/src/components/Table/Table.fragment.tsx +190 -175
- package/src/components/Table/Table.module.scss +15 -88
- package/src/components/Table/Table.test.tsx +184 -94
- package/src/components/Table/index.tsx +105 -374
- package/src/index.ts +15 -4
- package/dist/blocks/components/DataTable.d.ts +0 -19
- package/dist/blocks/components/DataTable.d.ts.map +0 -1
- package/src/blocks/components/DataTable.tsx +0 -124
package/dist/codeblock.cjs.map
CHANGED
|
@@ -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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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":"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"}
|
|
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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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
|
] }) });
|
package/dist/codeblock.js.map
CHANGED
|
@@ -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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|