{"version":3,"file":"Code_Block_v3.CZCVpOGt.mjs","names":["React.useState","React.useRef","React.useCallback","_Fragment","React.Fragment"],"sources":["https:/framerusercontent.com/modules/k9SHsKr9JKk8XiecfvBH/dV245LZkEtgvqJ7uhfXO/Code_Block_v3.js"],"sourcesContent":["// import * as React from \"react\"\n// import { createPortal } from \"react-dom\"\n// import { addPropertyControls, ControlType } from \"framer\"\n// type SyntaxVariant = \"typescript\" | \"javascript\" | \"python\" | \"curl\"\n// type CodeSnippetItem = {\n//     language: string\n//     code: string\n//     syntax: SyntaxVariant\n// }\n// type Props = {\n//     style?: React.CSSProperties\n//     codeSnippets: CodeSnippetItem[]\n//     apiKeyUrl: string\n//     buttonLabel: string\n//     background: string\n//     border: string\n//     codeText: string\n//     codeHighlight: string\n//     buttonText: string\n//     buttonBackground: string\n//     copyHover: string\n//     languageBackground: string\n//     menuBackground: string\n//     menuBorder: string\n//     menuItemHover: string\n//     lineNumberColor: string\n//     borderRadius: number\n//     fontSize: number\n//     lineHeight: number\n//     codeFontSize: number\n//     codeLineHeight: number\n//     copySuccessBackground: string\n// }\n// const DEFAULT_SNIPPETS: CodeSnippetItem[] = [\n//     {\n//         language: \"Typescript\",\n//         syntax: \"typescript\",\n//         code: `import { ApiClient } from \"@sdk/client\"\n// const client = new ApiClient()\n// const response = await client.generate({\n//   text: \"Hello there!\",\n//   modelId: \"v3\",\n// })`,\n//     },\n//     {\n//         language: \"Python\",\n//         syntax: \"python\",\n//         code: `from sdk.client import ApiClient\n// client = ApiClient()\n// response = client.generate(\n//     text=\"Hello there!\",\n//     model_id=\"v3\",\n// )`,\n//     },\n// ]\n// function escapeHtml(line: string) {\n//     return line\n//         .replaceAll(\"&\", \"&amp;\")\n//         .replaceAll(\"<\", \"&lt;\")\n//         .replaceAll(\">\", \"&gt;\")\n// }\n// function highlightJsLike(escaped: string) {\n//     return escaped\n//         .replace(/(\\/\\/.*)$/g, '<span class=\"tok-comment\">$1</span>')\n//         .replace(\n//             /(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')/g,\n//             '<span class=\"tok-string\">$1</span>'\n//         )\n//         .replace(\n//             /\\b(import|from|const|let|var|new|await|return|async)\\b/g,\n//             '<span class=\"tok-keyword\">$1</span>'\n//         )\n//         .replace(\n//             /\\b(text|modelId)\\b(?=\\s*:)/g,\n//             '<span class=\"tok-property\">$1</span>'\n//         )\n//         .replace(\n//             /\\b(ApiClient|client|response)\\b/g,\n//             '<span class=\"tok-variable\">$1</span>'\n//         )\n// }\n// function highlightPython(escaped: string) {\n//     return escaped\n//         .replace(/(#.*)$/g, '<span class=\"tok-comment\">$1</span>')\n//         .replace(\n//             /(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')/g,\n//             '<span class=\"tok-string\">$1</span>'\n//         )\n//         .replace(/\\b(from|import)\\b/g, '<span class=\"tok-keyword\">$1</span>')\n//         .replace(\n//             /\\b(client|response|text|model_id)\\b(?=\\s*=|\\s*:)/g,\n//             '<span class=\"tok-property\">$1</span>'\n//         )\n//         .replace(/\\b(ApiClient)\\b/g, '<span class=\"tok-variable\">$1</span>')\n// }\n// // function highlightCurl(escaped: string) {\n// //     return escaped\n// //         .replace(/\\b(curl)\\b/g, '<span class=\"tok-command\">$1</span>')\n// //         .replace(/(\\s-[A-Za-z]\\b)/g, '<span class=\"tok-flag\">$1</span>')\n// //         .replace(\n// //             /(\\$[A-Za-z_][A-Za-z0-9_]*)/g,\n// //             '<span class=\"tok-env\">$1</span>'\n// //         )\n// //         .replace(/(\"(?:[^\"\\\\]|\\\\.)*\")/g, '<span class=\"tok-string\">$1</span>')\n// // }\n// function highlightCurl(escaped: string) {\n//     return escaped\n//         .replace(/^(curl)\\b/gm, '<span class=\"tok-command\">$1</span>')\n//         .replace(/(?:^|\\s)(-[A-Za-z]\\b)/g, (m, flag) =>\n//             m.replace(flag, `<span class=\"tok-flag\">${flag}</span>`)\n//         )\n//         .replace(\n//             /(\\$[A-Za-z_][A-Za-z0-9_]*)/g,\n//             '<span class=\"tok-env\">$1</span>'\n//         )\n//         .replace(/(\"(?:[^\"\\\\]|\\\\.)*\")/g, '<span class=\"tok-string\">$1</span>')\n// }\n// // function highlightLine(line: string, syntax: SyntaxVariant) {\n// //     const escaped = escapeHtml(line)\n// //     if (syntax === \"typescript\" || syntax === \"javascript\") {\n// //         return highlightJsLike(escaped)\n// //     }\n// //     if (syntax === \"python\") return highlightPython(escaped)\n// //     if (syntax === \"curl\") return highlightCurl(escaped)\n// //     return escaped\n// // }\n// function highlightLine(line: string, syntax: SyntaxVariant) {\n//     const decoded = line\n//         .replace(/&amp;/g, \"&\")\n//         .replace(/&lt;/g, \"<\")\n//         .replace(/&gt;/g, \">\")\n//         .replace(/&quot;/g, '\"')\n//         .replace(/&#39;/g, \"'\")\n//     const clean = decoded\n//         .replace(/<[^>]*>/g, \"\")\n//         .replace(/\"tok-[^\"]*\">/g, \"\")\n//     const escaped = escapeHtml(clean)\n//     if (syntax === \"typescript\" || syntax === \"javascript\") {\n//         return highlightJsLike(escaped)\n//     }\n//     if (syntax === \"python\") return highlightPython(escaped)\n//     if (syntax === \"curl\") return highlightCurl(escaped)\n//     return escaped\n// }\n// function buttonHoverBg(hex: string) {\n//     const value = hex.replace(\"#\", \"\").trim()\n//     if (value.length !== 6) return \"#262626\"\n//     const r = Math.min(255, parseInt(value.slice(0, 2), 16) + 18)\n//     const g = Math.min(255, parseInt(value.slice(2, 4), 16) + 18)\n//     const b = Math.min(255, parseInt(value.slice(4, 6), 16) + 18)\n//     return `#${r.toString(16).padStart(2, \"0\")}${g\n//         .toString(16)\n//         .padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`\n// }\n// function stripLayoutOverrides(style?: React.CSSProperties) {\n//     if (!style) return {}\n//     const { height, minHeight, maxHeight, ...rest } = style\n//     return rest\n// }\n// export default function CodeSnippetBlock(props: Props) {\n//     const {\n//         style,\n//         codeSnippets,\n//         apiKeyUrl,\n//         buttonLabel,\n//         background,\n//         border,\n//         codeText,\n//         codeHighlight,\n//         buttonText,\n//         buttonBackground,\n//         copyHover,\n//         languageBackground,\n//         menuBackground,\n//         menuBorder,\n//         menuItemHover,\n//         lineNumberColor,\n//         borderRadius,\n//         fontSize,\n//         lineHeight,\n//         codeFontSize,\n//         codeLineHeight,\n//         copySuccessBackground,\n//     } = props\n//     const list = codeSnippets?.length ? codeSnippets : DEFAULT_SNIPPETS\n//     const [index, setIndex] = React.useState(0)\n//     const [menuOpen, setMenuOpen] = React.useState(false)\n//     const [copied, setCopied] = React.useState(false)\n//     const [menuPos, setMenuPos] = React.useState({\n//         top: 0,\n//         left: 0,\n//     })\n//     const [cardHeight, setCardHeight] = React.useState<number | null>(null)\n//     const safeIndex = Math.min(index, Math.max(0, list.length - 1))\n//     const item = list[safeIndex] ?? list[0]\n//     const lines = item.code.split(\"\\n\")\n//     const langBtnRef = React.useRef<HTMLButtonElement>(null)\n//     const menuRef = React.useRef<HTMLDivElement>(null)\n//     const measureRef = React.useRef<HTMLDivElement>(null)\n//     const copyTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n//     const measureHeight = React.useCallback(() => {\n//         const el = measureRef.current\n//         if (!el) return\n//         setCardHeight(Math.ceil(el.getBoundingClientRect().height) + 2)\n//     }, [])\n//     React.useLayoutEffect(() => {\n//         measureHeight()\n//         const el = measureRef.current\n//         if (!el || typeof ResizeObserver === \"undefined\") return\n//         const observer = new ResizeObserver(measureHeight)\n//         observer.observe(el)\n//         return () => observer.disconnect()\n//     }, [\n//         measureHeight,\n//         item.code,\n//         item.syntax,\n//         fontSize,\n//         lineHeight,\n//         codeFontSize,\n//         codeLineHeight,\n//         buttonLabel,\n//         borderRadius,\n//     ])\n//     React.useEffect(() => {\n//         const href =\n//             \"https://fonts.googleapis.com/css2?family=Geist:wght@400;500&family=Geist+Mono:wght@400&display=swap\"\n//         if (!document.querySelector(`link[href=\"${href}\"]`)) {\n//             const link = document.createElement(\"link\")\n//             link.href = href\n//             link.rel = \"stylesheet\"\n//             document.head.appendChild(link)\n//         }\n//     }, [])\n//     const positionMenu = React.useCallback(() => {\n//         if (!langBtnRef.current) return\n//         const rect = langBtnRef.current.getBoundingClientRect()\n//         setMenuPos({\n//             left: rect.left,\n//             top: rect.bottom + 8,\n//         })\n//     }, [])\n//     React.useEffect(() => {\n//         if (!menuOpen) return\n//         positionMenu()\n//         window.addEventListener(\"resize\", positionMenu)\n//         window.addEventListener(\"scroll\", positionMenu, true)\n//         return () => {\n//             window.removeEventListener(\"resize\", positionMenu)\n//             window.removeEventListener(\"scroll\", positionMenu, true)\n//         }\n//     }, [menuOpen, positionMenu])\n//     React.useEffect(() => {\n//         const close = (event: MouseEvent) => {\n//             const target = event.target as Node\n//             if (menuRef.current?.contains(target)) return\n//             if (langBtnRef.current?.contains(target)) return\n//             setMenuOpen(false)\n//         }\n//         document.addEventListener(\"click\", close)\n//         return () => document.removeEventListener(\"click\", close)\n//     }, [])\n//     const copyCode = async () => {\n//         try {\n//             await navigator.clipboard.writeText(item.code)\n//             setCopied(true)\n//             if (copyTimer.current) {\n//                 clearTimeout(copyTimer.current)\n//             }\n//             copyTimer.current = setTimeout(() => {\n//                 setCopied(false)\n//             }, 2200)\n//         } catch {\n//             setCopied(false)\n//         }\n//     }\n//     const buttonHover = buttonHoverBg(buttonBackground)\n//     return (\n//         <>\n//             <style>{`\n//                 .code-snippet-root .tok-keyword {\n//                     color: #7c3aed;\n//                 }\n//                 .code-snippet-root .tok-property,\n//                 .code-snippet-root .tok-variable {\n//                     color: var(--highlight);\n//                 }\n//                 .code-snippet-root .tok-string {\n//                     color: #166534;\n//                 }\n//                 .code-snippet-root .tok-comment {\n//                     color: #737373;\n//                 }\n//                 .code-snippet-root .tok-command {\n//                     color: #7c3aed;\n//                 }\n//                 .code-snippet-root .tok-flag {\n//                     color: #be185d;\n//                 }\n//                 .code-snippet-root .tok-env {\n//                     color: #0f766e;\n//                 }\n//                 .code-snippet-root .code-scroll {\n//                     width: 100%;\n//                     overflow-x: auto;\n//                     overflow-y: hidden;\n//                     scrollbar-width: none;\n//                     -ms-overflow-style: none;\n//                     overscroll-behavior-x: contain;\n//                     overscroll-behavior-y: auto;\n//                     touch-action: pan-y pan-x;\n//                     -webkit-overflow-scrolling: touch;\n//                 }\n//                 .code-snippet-root .code-scroll::-webkit-scrollbar {\n//                     display: none;\n//                     width: 0;\n//                     height: 0;\n//                 }\n//                 .code-snippet-root .icon-btn,\n//                 .code-snippet-root .lang-btn,\n//                 .code-snippet-root .cta-btn {\n//                     transition:\n//                         transform 120ms cubic-bezier(0.4, 0, 0.2, 1),\n//                         background-color 160ms ease,\n//                         box-shadow 160ms ease;\n//                 }\n//                 .code-snippet-root .icon-btn:hover {\n//                     background: var(--copy-hover) !important;\n//                 }\n//                 .code-snippet-root .icon-btn[data-copied=\"true\"] {\n//                     background: var(--copy-success) !important;\n//                 }\n//                 .code-snippet-root .lang-btn:hover,\n//                 .code-snippet-root .lang-btn[data-open=\"true\"] {\n//                     background: var(--language-hover) !important;\n//                 }\n//                 .code-snippet-root .cta-btn:hover {\n//                     background: var(--button-hover) !important;\n//                     box-shadow:\n//                         0 2px 8px rgba(0, 0, 0, 0.18);\n//                 }\n//                 .code-snippet-root .icon-btn:active,\n//                 .code-snippet-root .lang-btn:active,\n//                 .code-snippet-root .cta-btn:active {\n//                     transform: scale(0.96);\n//                 }\n//             `}</style>\n//             <div\n//                 className=\"code-snippet-root\"\n//                 style={{\n//                     width: \"100%\",\n//                     height: cardHeight ?? \"auto\",\n//                     overflow: \"hidden\",\n//                     boxSizing: \"border-box\",\n//                     transition: \"height 280ms cubic-bezier(0.4, 0, 0.2, 1)\",\n//                     [\"--highlight\" as string]: codeHighlight,\n//                     [\"--copy-hover\" as string]: copyHover,\n//                     [\"--copy-success\" as string]: copySuccessBackground,\n//                     [\"--language-hover\" as string]: languageBackground,\n//                     [\"--button-hover\" as string]: buttonHover,\n//                     ...stripLayoutOverrides(style),\n//                 }}\n//             >\n//                 <div\n//                     ref={measureRef}\n//                     style={{\n//                         background,\n//                         border: `1px solid ${border}`,\n//                         borderRadius,\n//                         padding: 16,\n//                         overflow: \"hidden\",\n//                         boxSizing: \"border-box\",\n//                         fontFamily: \"Geist, Inter, system-ui, sans-serif\",\n//                     }}\n//                 >\n//                     <div className=\"code-scroll\">\n//                         <div\n//                             style={{\n//                                 display: \"grid\",\n//                                 gridTemplateColumns: \"28px max-content\",\n//                                 columnGap: 10,\n//                                 width: \"max-content\",\n//                                 minWidth: \"100%\",\n//                                 padding: \"12px 24px 12px 6px\",\n//                                 boxSizing: \"border-box\",\n//                                 fontFamily: '\"Geist Mono\", monospace',\n//                                 fontSize: codeFontSize,\n//                                 lineHeight: `${codeLineHeight}px`,\n//                                 color: codeText,\n//                             }}\n//                         >\n//                             {lines.map((line, idx) => (\n//                                 <React.Fragment key={idx}>\n//                                     <span\n//                                         style={{\n//                                             position: \"sticky\",\n//                                             left: 0,\n//                                             zIndex: 2,\n//                                             background,\n//                                             color: lineNumberColor,\n//                                             textAlign: \"right\",\n//                                             paddingRight: 4,\n//                                             userSelect: \"none\",\n//                                             boxShadow: `10px 0 18px -4px ${background}, 4px 0 12px -2px ${background}`,\n//                                         }}\n//                                     >\n//                                         {String(idx + 1).padStart(2, \"0\")}\n//                                     </span>\n//                                     <span\n//                                         style={{\n//                                             whiteSpace: \"pre\",\n//                                         }}\n//                                         dangerouslySetInnerHTML={{\n//                                             __html:\n//                                                 highlightLine(\n//                                                     line,\n//                                                     item.syntax\n//                                                 ) || \"&nbsp;\",\n//                                         }}\n//                                     />\n//                                 </React.Fragment>\n//                             ))}\n//                         </div>\n//                     </div>\n//                     <div\n//                         style={{\n//                             display: \"flex\",\n//                             justifyContent: \"space-between\",\n//                             alignItems: \"center\",\n//                             marginTop: 24,\n//                         }}\n//                     >\n//                         <div\n//                             style={{\n//                                 display: \"flex\",\n//                                 alignItems: \"center\",\n//                                 gap: 4,\n//                             }}\n//                         >\n//                             <button\n//                                 className=\"icon-btn\"\n//                                 data-copied={copied ? \"true\" : undefined}\n//                                 onClick={copyCode}\n//                                 style={{\n//                                     width: 40,\n//                                     height: 40,\n//                                     border: \"none\",\n//                                     borderRadius: 12,\n//                                     background: \"transparent\",\n//                                     cursor: \"pointer\",\n//                                     display: \"flex\",\n//                                     alignItems: \"center\",\n//                                     justifyContent: \"center\",\n//                                 }}\n//                             >\n//                                 {!copied ? (\n//                                     <svg\n//                                         width=\"18\"\n//                                         height=\"18\"\n//                                         viewBox=\"0 0 18 18\"\n//                                         fill=\"none\"\n//                                     >\n//                                         <path\n//                                             d=\"M6.5625 6.5625V3C6.5625 2.48223 6.98223 2.0625 7.5 2.0625H15C15.5178 2.0625 15.9375 2.48223 15.9375 3V10.5C15.9375 11.0178 15.5178 11.4375 15 11.4375H11.4375\"\n//                                             stroke=\"#737373\"\n//                                             strokeWidth=\"1.5\"\n//                                             strokeLinecap=\"round\"\n//                                             strokeLinejoin=\"round\"\n//                                         />\n//                                         <path\n//                                             d=\"M3 6.5625H10.5C11.0178 6.5625 11.4375 6.98223 11.4375 7.5V15C11.4375 15.5178 11.0178 15.9375 10.5 15.9375H3C2.48223 15.9375 2.0625 15.5178 2.0625 15V7.5C2.0625 6.98223 2.48223 6.5625 3 6.5625Z\"\n//                                             stroke=\"#737373\"\n//                                             strokeWidth=\"1.5\"\n//                                             strokeLinecap=\"round\"\n//                                             strokeLinejoin=\"round\"\n//                                         />\n//                                     </svg>\n//                                 ) : (\n//                                     <svg\n//                                         width=\"18\"\n//                                         height=\"18\"\n//                                         viewBox=\"0 0 24 24\"\n//                                     >\n//                                         <circle\n//                                             cx=\"12\"\n//                                             cy=\"12\"\n//                                             r=\"10\"\n//                                             fill=\"#16a34a\"\n//                                         />\n//                                         <path\n//                                             d=\"M8 12.5l2.2 2.2 5.8-5.8\"\n//                                             stroke=\"#ffffff\"\n//                                             strokeWidth=\"2\"\n//                                             strokeLinecap=\"round\"\n//                                             strokeLinejoin=\"round\"\n//                                             fill=\"none\"\n//                                         />\n//                                     </svg>\n//                                 )}\n//                             </button>\n//                             <button\n//                                 ref={langBtnRef}\n//                                 className=\"lang-btn\"\n//                                 data-open={menuOpen ? \"true\" : \"false\"}\n//                                 onClick={() => setMenuOpen(!menuOpen)}\n//                                 style={{\n//                                     height: 40,\n//                                     border: \"none\",\n//                                     borderRadius: 12,\n//                                     display: \"flex\",\n//                                     alignItems: \"center\",\n//                                     gap: 8,\n//                                     padding: \"8px 16px\",\n//                                     background: \"transparent\",\n//                                     cursor: \"pointer\",\n//                                     fontFamily: \"Geist, sans-serif\",\n//                                     fontSize,\n//                                     fontWeight: 500,\n//                                     color: codeText,\n//                                 }}\n//                             >\n//                                 {item.language}\n//                                 <svg\n//                                     width=\"16\"\n//                                     height=\"16\"\n//                                     viewBox=\"0 0 24 24\"\n//                                     fill=\"none\"\n//                                     style={{\n//                                         transition: \"transform 180ms ease\",\n//                                         transform: menuOpen\n//                                             ? \"rotate(180deg)\"\n//                                             : \"rotate(0deg)\",\n//                                     }}\n//                                 >\n//                                     <path\n//                                         d=\"M6 9l6 6 6-6\"\n//                                         stroke=\"#737373\"\n//                                         strokeWidth=\"2\"\n//                                         strokeLinecap=\"round\"\n//                                         strokeLinejoin=\"round\"\n//                                     />\n//                                 </svg>\n//                             </button>\n//                         </div>\n//                         <button\n//                             className=\"cta-btn\"\n//                             onClick={() => {\n//                                 if (apiKeyUrl?.trim()) {\n//                                     window.open(\n//                                         apiKeyUrl.trim(),\n//                                         \"_blank\",\n//                                         \"noopener,noreferrer\"\n//                                     )\n//                                 }\n//                             }}\n//                             style={{\n//                                 border: \"none\",\n//                                 borderRadius: 12,\n//                                 background: buttonBackground,\n//                                 color: buttonText,\n//                                 padding: \"10px 18px\",\n//                                 cursor: \"pointer\",\n//                                 fontFamily: \"Geist, sans-serif\",\n//                                 fontSize,\n//                                 fontWeight: 500,\n//                             }}\n//                         >\n//                             {buttonLabel}\n//                         </button>\n//                     </div>\n//                 </div>\n//             </div>\n//             {menuOpen &&\n//                 createPortal(\n//                     <div\n//                         ref={menuRef}\n//                         style={{\n//                             position: \"fixed\",\n//                             left: menuPos.left,\n//                             top: menuPos.top,\n//                             zIndex: 10000,\n//                             minWidth: 170,\n//                             padding: 6,\n//                             border: `1px solid ${menuBorder}`,\n//                             borderRadius: 12,\n//                             background: menuBackground,\n//                             boxShadow: \"0 10px 26px rgba(23,23,23,0.1)\",\n//                         }}\n//                     >\n//                         {list.map((snippet, i) => (\n//                             <button\n//                                 key={`${snippet.language}-${i}`}\n//                                 onClick={() => {\n//                                     setIndex(i)\n//                                     setMenuOpen(false)\n//                                 }}\n//                                 style={{\n//                                     width: \"100%\",\n//                                     border: \"none\",\n//                                     borderRadius: 8,\n//                                     padding: \"8px 10px\",\n//                                     textAlign: \"left\",\n//                                     background:\n//                                         i === safeIndex\n//                                             ? menuItemHover\n//                                             : \"transparent\",\n//                                     cursor: \"pointer\",\n//                                     fontFamily: \"Geist, sans-serif\",\n//                                     fontSize,\n//                                     color: codeText,\n//                                 }}\n//                             >\n//                                 {snippet.language}\n//                             </button>\n//                         ))}\n//                     </div>,\n//                     document.body\n//                 )}\n//         </>\n//     )\n// }\n// CodeSnippetBlock.defaultProps = {\n//     codeSnippets: DEFAULT_SNIPPETS,\n//     apiKeyUrl: \"\",\n//     buttonLabel: \"Get API key\",\n//     background: \"#FFFFFF\",\n//     border: \"#E5E5E5\",\n//     codeText: \"#404040\",\n//     codeHighlight: \"#0066CC\",\n//     buttonText: \"#FAFAFA\",\n//     buttonBackground: \"#171717\",\n//     copyHover: \"#F5F5F5\",\n//     languageBackground: \"#F5F5F5\",\n//     menuBackground: \"#FFFFFF\",\n//     menuBorder: \"#EBEBEB\",\n//     menuItemHover: \"#FAFAFA\",\n//     lineNumberColor: \"#D4D4D4\",\n//     borderRadius: 24,\n//     fontSize: 14,\n//     lineHeight: 20,\n//     codeFontSize: 16,\n//     codeLineHeight: 26,\n//     copySuccessBackground: \"#DCFCE7\",\n// }\n// addPropertyControls(CodeSnippetBlock, {\n//     codeSnippets: {\n//         title: \"Code Snippets\",\n//         type: ControlType.Array,\n//         control: {\n//             type: ControlType.Object,\n//             controls: {\n//                 language: {\n//                     type: ControlType.String,\n//                 },\n//                 syntax: {\n//                     type: ControlType.Enum,\n//                     options: [\"typescript\", \"javascript\", \"python\", \"curl\"],\n//                 },\n//                 code: {\n//                     type: ControlType.String,\n//                     displayTextArea: true,\n//                 },\n//             },\n//         },\n//     },\n//     apiKeyUrl: {\n//         type: ControlType.String,\n//     },\n//     buttonLabel: {\n//         type: ControlType.String,\n//     },\n//     background: {\n//         type: ControlType.Color,\n//     },\n//     border: {\n//         type: ControlType.Color,\n//     },\n//     codeText: {\n//         type: ControlType.Color,\n//     },\n//     codeHighlight: {\n//         type: ControlType.Color,\n//     },\n//     buttonText: {\n//         type: ControlType.Color,\n//     },\n//     buttonBackground: {\n//         type: ControlType.Color,\n//     },\n//     copyHover: {\n//         type: ControlType.Color,\n//     },\n//     languageBackground: {\n//         type: ControlType.Color,\n//     },\n//     menuBackground: {\n//         type: ControlType.Color,\n//     },\n//     menuBorder: {\n//         type: ControlType.Color,\n//     },\n//     menuItemHover: {\n//         type: ControlType.Color,\n//     },\n//     lineNumberColor: {\n//         type: ControlType.Color,\n//     },\n//     borderRadius: {\n//         type: ControlType.Number,\n//         min: 0,\n//         max: 48,\n//     },\n//     fontSize: {\n//         type: ControlType.Number,\n//         min: 10,\n//         max: 20,\n//     },\n//     lineHeight: {\n//         type: ControlType.Number,\n//         min: 14,\n//         max: 32,\n//     },\n//     codeFontSize: {\n//         type: ControlType.Number,\n//         min: 10,\n//         max: 24,\n//     },\n//     codeLineHeight: {\n//         type: ControlType.Number,\n//         min: 16,\n//         max: 40,\n//     },\n//     copySuccessBackground: {\n//         type: ControlType.Color,\n//     },\n// })\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import*as React from\"react\";import{createPortal}from\"react-dom\";import{addPropertyControls,ControlType}from\"framer\";const DEFAULT_SNIPPETS=[{language:\"Typescript\",syntax:\"typescript\",code:`import { ApiClient } from \"@sdk/client\"\n\nconst client = new ApiClient()\n\nconst response = await client.generate({\n  text: \"Hello there!\",\n  modelId: \"v3\",\n})`},{language:\"Python\",syntax:\"python\",code:`from sdk.client import ApiClient\n\nclient = ApiClient()\n\nresponse = client.generate(\n    text=\"Hello there!\",\n    model_id=\"v3\",\n)`}];function escapeHtml(text){return text.replaceAll(\"&\",\"&amp;\").replaceAll(\"<\",\"&lt;\").replaceAll(\">\",\"&gt;\");}function tokenize(code,patterns){const tokens=[];let pos=0;while(pos<code.length){let earliest=null;for(const{type,regex}of patterns){regex.lastIndex=pos;const m=regex.exec(code);if(m&&(earliest===null||m.index<earliest.start)){earliest={start:m.index,end:m.index+m[0].length,type};}}if(!earliest){tokens.push({type:null,text:code.slice(pos)});break;}if(earliest.start>pos){tokens.push({type:null,text:code.slice(pos,earliest.start)});}tokens.push({type:earliest.type,text:code.slice(earliest.start,earliest.end)});pos=earliest.end;}return tokens;}function renderTokens(tokens){return tokens.map(t=>{const escaped=escapeHtml(t.text);return t.type?`<span class=\"tok-${t.type}\">${escaped}</span>`:escaped;}).join(\"\");}const JS_PATTERNS=[{type:\"comment\",regex:/\\/\\/[^\\n]*/g},{type:\"string\",regex:/\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'/g},{type:\"keyword\",regex:/\\b(?:import|from|const|let|var|new|await|return|async)\\b/g},{type:\"property\",regex:/\\b(?:text|modelId)\\b(?=\\s*:)/g},{type:\"variable\",regex:/\\b(?:ApiClient|client|response)\\b/g}];const PY_PATTERNS=[{type:\"comment\",regex:/#[^\\n]*/g},{type:\"string\",regex:/\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'/g},{type:\"keyword\",regex:/\\b(?:from|import)\\b/g},{type:\"property\",regex:/\\b(?:client|response|text|model_id)\\b(?=\\s*[=:])/g},{type:\"variable\",regex:/\\bApiClient\\b/g}];const CURL_PATTERNS=[{type:\"string\",regex:/\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'/g},{type:\"command\",regex:/^curl\\b/g},{type:\"flag\",regex:RegExp(\"(?<=^|\\\\s)-[A-Za-z]\\\\b\",\"g\")},{type:\"env\",regex:/\\$[A-Za-z_][A-Za-z0-9_]*/g}];function highlightLine(line,syntax){if(syntax===\"typescript\"||syntax===\"javascript\"){return renderTokens(tokenize(line,JS_PATTERNS));}if(syntax===\"python\"){return renderTokens(tokenize(line,PY_PATTERNS));}if(syntax===\"curl\"){return renderTokens(tokenize(line,CURL_PATTERNS));}return escapeHtml(line);}function buttonHoverBg(hex){const value=hex.replace(\"#\",\"\").trim();if(value.length!==6)return\"#262626\";const r=Math.min(255,parseInt(value.slice(0,2),16)+18);const g=Math.min(255,parseInt(value.slice(2,4),16)+18);const b=Math.min(255,parseInt(value.slice(4,6),16)+18);return`#${r.toString(16).padStart(2,\"0\")}${g.toString(16).padStart(2,\"0\")}${b.toString(16).padStart(2,\"0\")}`;}function stripLayoutOverrides(style){if(!style)return{};const{height,minHeight,maxHeight,...rest}=style;return rest;}export default function CodeSnippetBlock(props){const{style,codeSnippets,apiKeyUrl,buttonLabel,background,border,codeText,codeHighlight,buttonText,buttonBackground,copyHover,languageBackground,menuBackground,menuBorder,menuItemHover,lineNumberColor,borderRadius,fontSize,lineHeight,codeFontSize,codeLineHeight,copySuccessBackground}=props;const list=codeSnippets?.length?codeSnippets:DEFAULT_SNIPPETS;const[index,setIndex]=React.useState(0);const[menuOpen,setMenuOpen]=React.useState(false);const[copied,setCopied]=React.useState(false);const[menuPos,setMenuPos]=React.useState({top:0,left:0});const[cardHeight,setCardHeight]=React.useState(null);const safeIndex=Math.min(index,Math.max(0,list.length-1));const item=list[safeIndex]??list[0];const lines=item.code.split(\"\\n\");const langBtnRef=React.useRef(null);const menuRef=React.useRef(null);const measureRef=React.useRef(null);const copyTimer=React.useRef(null);const measureHeight=React.useCallback(()=>{const el=measureRef.current;if(!el)return;setCardHeight(Math.ceil(el.getBoundingClientRect().height)+2);},[]);React.useLayoutEffect(()=>{measureHeight();const el=measureRef.current;if(!el||typeof ResizeObserver===\"undefined\")return;const observer=new ResizeObserver(measureHeight);observer.observe(el);return()=>observer.disconnect();},[measureHeight,item.code,item.syntax,fontSize,lineHeight,codeFontSize,codeLineHeight,buttonLabel,borderRadius]);React.useEffect(()=>{const href=\"https://fonts.googleapis.com/css2?family=Geist:wght@400;500&family=Geist+Mono:wght@400&display=swap\";if(!document.querySelector(`link[href=\"${href}\"]`)){const link=document.createElement(\"link\");link.href=href;link.rel=\"stylesheet\";document.head.appendChild(link);}},[]);const positionMenu=React.useCallback(()=>{if(!langBtnRef.current)return;const rect=langBtnRef.current.getBoundingClientRect();setMenuPos({left:rect.left,top:rect.bottom+8});},[]);React.useEffect(()=>{if(!menuOpen)return;positionMenu();window.addEventListener(\"resize\",positionMenu);window.addEventListener(\"scroll\",positionMenu,true);return()=>{window.removeEventListener(\"resize\",positionMenu);window.removeEventListener(\"scroll\",positionMenu,true);};},[menuOpen,positionMenu]);React.useEffect(()=>{const close=event=>{const target=event.target;if(menuRef.current?.contains(target))return;if(langBtnRef.current?.contains(target))return;setMenuOpen(false);};document.addEventListener(\"click\",close);return()=>document.removeEventListener(\"click\",close);},[]);const copyCode=async()=>{try{await navigator.clipboard.writeText(item.code);setCopied(true);if(copyTimer.current){clearTimeout(copyTimer.current);}copyTimer.current=setTimeout(()=>{setCopied(false);},2200);}catch{setCopied(false);}};const buttonHover=buttonHoverBg(buttonBackground);return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"style\",{children:`\n                .code-snippet-root .tok-keyword {\n                    color: #7c3aed;\n                }\n\n                .code-snippet-root .tok-property,\n                .code-snippet-root .tok-variable {\n                    color: var(--highlight);\n                }\n\n                .code-snippet-root .tok-string {\n                    color: #166534;\n                }\n\n                .code-snippet-root .tok-comment {\n                    color: #737373;\n                }\n\n                .code-snippet-root .tok-command {\n                    color: #7c3aed;\n                }\n\n                .code-snippet-root .tok-flag {\n                    color: #be185d;\n                }\n\n                .code-snippet-root .tok-env {\n                    color: #0f766e;\n                }\n\n                .code-snippet-root .code-scroll {\n                    width: 100%;\n                    overflow-x: auto;\n                    overflow-y: hidden;\n\n                    scrollbar-width: none;\n                    -ms-overflow-style: none;\n\n                    overscroll-behavior-x: contain;\n                    overscroll-behavior-y: auto;\n\n                    touch-action: pan-y pan-x;\n\n                    -webkit-overflow-scrolling: touch;\n                }\n\n                .code-snippet-root .code-scroll::-webkit-scrollbar {\n                    display: none;\n                    width: 0;\n                    height: 0;\n                }\n\n                .code-snippet-root .icon-btn,\n                .code-snippet-root .lang-btn,\n                .code-snippet-root .cta-btn {\n                    transition:\n                        transform 120ms cubic-bezier(0.4, 0, 0.2, 1),\n                        background-color 160ms ease,\n                        box-shadow 160ms ease;\n                }\n\n                .code-snippet-root .icon-btn:hover {\n                    background: var(--copy-hover) !important;\n                }\n\n                .code-snippet-root .icon-btn[data-copied=\"true\"] {\n                    background: var(--copy-success) !important;\n                }\n\n                .code-snippet-root .lang-btn:hover,\n                .code-snippet-root .lang-btn[data-open=\"true\"] {\n                    background: var(--language-hover) !important;\n                }\n\n                .code-snippet-root .cta-btn:hover {\n                    background: var(--button-hover) !important;\n                    box-shadow:\n                        0 2px 8px rgba(0, 0, 0, 0.18);\n                }\n\n                .code-snippet-root .icon-btn:active,\n                .code-snippet-root .lang-btn:active,\n                .code-snippet-root .cta-btn:active {\n                    transform: scale(0.96);\n                }\n            `}),/*#__PURE__*/_jsx(\"div\",{className:\"code-snippet-root\",style:{width:\"100%\",height:cardHeight??\"auto\",overflow:\"hidden\",boxSizing:\"border-box\",transition:\"height 280ms cubic-bezier(0.4, 0, 0.2, 1)\",[\"--highlight\"]:codeHighlight,[\"--copy-hover\"]:copyHover,[\"--copy-success\"]:copySuccessBackground,[\"--language-hover\"]:languageBackground,[\"--button-hover\"]:buttonHover,...stripLayoutOverrides(style)},children:/*#__PURE__*/_jsxs(\"div\",{ref:measureRef,style:{background,border:`1px solid ${border}`,borderRadius,padding:16,overflow:\"hidden\",boxSizing:\"border-box\",fontFamily:\"Geist, Inter, system-ui, sans-serif\"},children:[/*#__PURE__*/_jsx(\"div\",{className:\"code-scroll\",children:/*#__PURE__*/_jsx(\"div\",{style:{display:\"grid\",gridTemplateColumns:\"28px max-content\",columnGap:10,width:\"max-content\",minWidth:\"100%\",padding:\"12px 24px 12px 6px\",boxSizing:\"border-box\",fontFamily:'\"Geist Mono\", monospace',fontSize:codeFontSize,lineHeight:`${codeLineHeight}px`,color:codeText},children:lines.map((line,idx)=>/*#__PURE__*/_jsxs(React.Fragment,{children:[/*#__PURE__*/_jsx(\"span\",{style:{position:\"sticky\",left:0,zIndex:2,background,color:lineNumberColor,textAlign:\"right\",paddingRight:4,userSelect:\"none\",boxShadow:`10px 0 18px -4px ${background}, 4px 0 12px -2px ${background}`},children:String(idx+1).padStart(2,\"0\")}),/*#__PURE__*/_jsx(\"span\",{style:{whiteSpace:\"pre\"},dangerouslySetInnerHTML:{__html:highlightLine(line,item.syntax)||\"&nbsp;\"}})]},idx))})}),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",justifyContent:\"space-between\",alignItems:\"center\",marginTop:24},children:[/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:4},children:[/*#__PURE__*/_jsx(\"button\",{className:\"icon-btn\",\"data-copied\":copied?\"true\":undefined,onClick:copyCode,style:{width:40,height:40,border:\"none\",borderRadius:12,background:\"transparent\",cursor:\"pointer\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\"},children:!copied?/*#__PURE__*/_jsxs(\"svg\",{width:\"18\",height:\"18\",viewBox:\"0 0 18 18\",fill:\"none\",children:[/*#__PURE__*/_jsx(\"path\",{d:\"M6.5625 6.5625V3C6.5625 2.48223 6.98223 2.0625 7.5 2.0625H15C15.5178 2.0625 15.9375 2.48223 15.9375 3V10.5C15.9375 11.0178 15.5178 11.4375 15 11.4375H11.4375\",stroke:\"#737373\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M3 6.5625H10.5C11.0178 6.5625 11.4375 6.98223 11.4375 7.5V15C11.4375 15.5178 11.0178 15.9375 10.5 15.9375H3C2.48223 15.9375 2.0625 15.5178 2.0625 15V7.5C2.0625 6.98223 2.48223 6.5625 3 6.5625Z\",stroke:\"#737373\",strokeWidth:\"1.5\",strokeLinecap:\"round\",strokeLinejoin:\"round\"})]}):/*#__PURE__*/_jsxs(\"svg\",{width:\"18\",height:\"18\",viewBox:\"0 0 24 24\",children:[/*#__PURE__*/_jsx(\"circle\",{cx:\"12\",cy:\"12\",r:\"10\",fill:\"#16a34a\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M8 12.5l2.2 2.2 5.8-5.8\",stroke:\"#ffffff\",strokeWidth:\"2\",strokeLinecap:\"round\",strokeLinejoin:\"round\",fill:\"none\"})]})}),/*#__PURE__*/_jsxs(\"button\",{ref:langBtnRef,className:\"lang-btn\",\"data-open\":menuOpen?\"true\":\"false\",onClick:()=>setMenuOpen(!menuOpen),style:{height:40,border:\"none\",borderRadius:12,display:\"flex\",alignItems:\"center\",gap:8,padding:\"8px 16px\",background:\"transparent\",cursor:\"pointer\",fontFamily:\"Geist, sans-serif\",fontSize,fontWeight:500,color:codeText},children:[item.language,/*#__PURE__*/_jsx(\"svg\",{width:\"16\",height:\"16\",viewBox:\"0 0 24 24\",fill:\"none\",style:{transition:\"transform 180ms ease\",transform:menuOpen?\"rotate(180deg)\":\"rotate(0deg)\"},children:/*#__PURE__*/_jsx(\"path\",{d:\"M6 9l6 6 6-6\",stroke:\"#737373\",strokeWidth:\"2\",strokeLinecap:\"round\",strokeLinejoin:\"round\"})})]})]}),/*#__PURE__*/_jsx(\"button\",{className:\"cta-btn\",onClick:()=>{if(apiKeyUrl?.trim()){window.open(apiKeyUrl.trim(),\"_blank\",\"noopener,noreferrer\");}},style:{border:\"none\",borderRadius:12,background:buttonBackground,color:buttonText,padding:\"10px 18px\",cursor:\"pointer\",fontFamily:\"Geist, sans-serif\",fontSize,fontWeight:500},children:buttonLabel})]})]})}),menuOpen&&/*#__PURE__*/createPortal(/*#__PURE__*/_jsx(\"div\",{ref:menuRef,style:{position:\"fixed\",left:menuPos.left,top:menuPos.top,zIndex:1e4,minWidth:170,padding:6,border:`1px solid ${menuBorder}`,borderRadius:12,background:menuBackground,boxShadow:\"0 10px 26px rgba(23,23,23,0.1)\"},children:list.map((snippet,i)=>/*#__PURE__*/_jsx(\"button\",{onClick:()=>{setIndex(i);setMenuOpen(false);},style:{width:\"100%\",border:\"none\",borderRadius:8,padding:\"8px 10px\",textAlign:\"left\",background:i===safeIndex?menuItemHover:\"transparent\",cursor:\"pointer\",fontFamily:\"Geist, sans-serif\",fontSize,color:codeText},children:snippet.language},`${snippet.language}-${i}`))}),document.body)]});}CodeSnippetBlock.defaultProps={codeSnippets:DEFAULT_SNIPPETS,apiKeyUrl:\"\",buttonLabel:\"Get API key\",background:\"#FFFFFF\",border:\"#E5E5E5\",codeText:\"#404040\",codeHighlight:\"#0066CC\",buttonText:\"#FAFAFA\",buttonBackground:\"#171717\",copyHover:\"#F5F5F5\",languageBackground:\"#F5F5F5\",menuBackground:\"#FFFFFF\",menuBorder:\"#EBEBEB\",menuItemHover:\"#FAFAFA\",lineNumberColor:\"#D4D4D4\",borderRadius:24,fontSize:14,lineHeight:20,codeFontSize:16,codeLineHeight:26,copySuccessBackground:\"#DCFCE7\"};addPropertyControls(CodeSnippetBlock,{codeSnippets:{title:\"Code Snippets\",type:ControlType.Array,control:{type:ControlType.Object,controls:{language:{type:ControlType.String},syntax:{type:ControlType.Enum,options:[\"typescript\",\"javascript\",\"python\",\"curl\"]},code:{type:ControlType.String,displayTextArea:true}}}},apiKeyUrl:{type:ControlType.String},buttonLabel:{type:ControlType.String},background:{type:ControlType.Color},border:{type:ControlType.Color},codeText:{type:ControlType.Color},codeHighlight:{type:ControlType.Color},buttonText:{type:ControlType.Color},buttonBackground:{type:ControlType.Color},copyHover:{type:ControlType.Color},languageBackground:{type:ControlType.Color},menuBackground:{type:ControlType.Color},menuBorder:{type:ControlType.Color},menuItemHover:{type:ControlType.Color},lineNumberColor:{type:ControlType.Color},borderRadius:{type:ControlType.Number,min:0,max:48},fontSize:{type:ControlType.Number,min:10,max:20},lineHeight:{type:ControlType.Number,min:14,max:32},codeFontSize:{type:ControlType.Number,min:10,max:24},codeLineHeight:{type:ControlType.Number,min:16,max:40},copySuccessBackground:{type:ControlType.Color}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CodeSnippetBlock\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Code_Block_v3.map"],"mappings":"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"}