export declare const promptTemplate = "\"use client\";\nimport React from \"react\";\nimport styled from \"styled-components\";\nimport { interactiveStyles, styledText } from \"cherry-styled-components\";\nimport { Theme } from \"@/app/theme\";\nimport { Icon } from \"@/components/layout/Icon\";\nimport { CopyButton } from \"@/components/layout/CopyButton\";\n\ntype PromptAction = \"copy\" | \"cursor\";\n\nconst CURSOR_DEEPLINK = \"cursor://anysphere.cursor-deeplink/prompt?text=\";\n\n// The prompt body arrives as rendered MDX elements, but the copy and Cursor\n// actions need plain text. Paragraphs and lists become separate lines and\n// list items keep a \"- \" marker so the copied prompt stays readable.\nfunction promptText(node: React.ReactNode): string {\n if (node == null || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node);\n }\n if (Array.isArray(node)) return node.map(promptText).join(\"\");\n if (React.isValidElement(node)) {\n const element = node as React.ReactElement<{\n children?: React.ReactNode;\n }>;\n const inner = promptText(element.props.children);\n if (element.type === \"p\") return inner + \"\\n\\n\";\n if (element.type === \"ul\" || element.type === \"ol\") return inner + \"\\n\";\n if (element.type === \"li\") return \"- \" + inner + \"\\n\";\n return inner;\n }\n return \"\";\n}\n\nconst StyledPrompt = styled.div<{ theme: Theme }>`\n background: ${({ theme }) => theme.colors.light};\n border: solid 1px ${({ theme }) => theme.colors.grayLight};\n border-radius: ${({ theme }) => theme.spacing.radius.lg};\n padding: 20px;\n width: 100%;\n`;\n\nconst StyledPromptHeader = styled.div<{ theme: Theme }>`\n display: flex;\n align-items: flex-start;\n gap: 10px;\n margin: 0 0 15px;\n ${({ theme }) => styledText(theme)};\n font-weight: 700;\n color: ${({ theme }) => theme.colors.dark};\n\n & > svg.lucide {\n flex-shrink: 0;\n margin-top: 4px;\n color: inherit;\n }\n`;\n\nconst StyledPromptDescription = styled.span`\n flex: 1;\n min-width: 0;\n`;\n\nconst StyledPromptActions = styled.span`\n display: flex;\n align-items: center;\n gap: 5px;\n flex-shrink: 0;\n`;\n\n// Matches the CopyButton chrome so the two actions read as one control\n// group; a link rather than a button because it navigates to the Cursor\n// deeplink.\nconst StyledCursorLink = styled.a<{ theme: Theme }>`\n ${interactiveStyles}\n display: flex;\n align-items: center;\n gap: 5px;\n background: ${({ theme }) => theme.colors.light};\n border-color: ${({ theme }) => theme.colors.grayLight};\n border-radius: ${({ theme }) => theme.spacing.radius.xs};\n padding: 4px 8px;\n font-size: 12px;\n line-height: 16px;\n font-weight: 600;\n color: ${({ theme }) => theme.colors.grayDark};\n text-decoration: none;\n\n & svg.lucide {\n margin: 0;\n color: inherit;\n }\n`;\n\nconst StyledPromptBody = styled.div<{ theme: Theme }>`\n ${({ theme }) => styledText(theme)};\n color: ${({ theme }) => theme.colors.grayDark};\n display: flex;\n flex-direction: column;\n gap: 20px;\n`;\n\ninterface PromptProps {\n children: React.ReactNode;\n description: string;\n icon?: string;\n actions?: PromptAction[];\n}\n\nfunction Prompt({\n children,\n description,\n icon,\n actions = [\"copy\"],\n}: PromptProps) {\n const text = promptText(children)\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\n return (\n \n \n {icon ? : null}\n {description}\n \n {actions.includes(\"copy\") && (\n \n )}\n {actions.includes(\"cursor\") && (\n \n Cursor\n \n \n )}\n \n \n {children}\n \n );\n}\n\nexport { Prompt };\n";