@libredb/studio 0.9.12 → 0.9.13
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/{chunk-VWVRUCQO.mjs → chunk-CPF7XWV5.mjs} +77 -77
- package/dist/chunk-CPF7XWV5.mjs.map +1 -0
- package/dist/{chunk-DZ2UB3C6.mjs → chunk-G3S66G64.mjs} +259 -265
- package/dist/chunk-G3S66G64.mjs.map +1 -0
- package/dist/{chunk-JOGLIOFO.js → chunk-HGPD6PWV.js} +129 -129
- package/dist/chunk-HGPD6PWV.js.map +1 -0
- package/dist/{chunk-RBVDMLFV.js → chunk-Y52UIFEX.js} +259 -265
- package/dist/chunk-Y52UIFEX.js.map +1 -0
- package/dist/components.js +14 -14
- package/dist/components.mjs +2 -2
- package/dist/index.js +14 -14
- package/dist/index.mjs +2 -2
- package/dist/workspace.js +350 -358
- package/dist/workspace.js.map +1 -1
- package/dist/workspace.mjs +220 -228
- package/dist/workspace.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-DZ2UB3C6.mjs.map +0 -1
- package/dist/chunk-JOGLIOFO.js.map +0 -1
- package/dist/chunk-RBVDMLFV.js.map +0 -1
- package/dist/chunk-VWVRUCQO.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/ui/button.tsx","../src/lib/sql/alias-extractor.ts","../src/lib/editor/sql-completions.ts","../src/lib/editor/mongodb-completions.ts","../src/hooks/use-ai-chat.ts","../src/components/QueryEditor.tsx","../src/lib/monitoring-thresholds.ts","../src/lib/storage/local-storage.ts","../src/lib/storage/storage-facade.ts","../src/lib/data-masking.ts","../src/components/results-grid/utils.ts","../src/components/results-grid/ResultCard.tsx","../src/components/ui/sheet.tsx","../src/components/ui/scroll-area.tsx","../src/components/results-grid/RowDetailSheet.tsx","../src/components/results-grid/StatsBar.tsx","../src/components/ResultsGrid.tsx","../src/components/SchemaDiagram.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/select.tsx","../src/components/DataCharts.tsx","../src/components/CodeGenerator.tsx","../src/components/TestDataGenerator.tsx","../src/components/VisualExplain.tsx","../src/components/NL2SQLPanel.tsx","../src/components/DataProfiler.tsx","../src/components/QuerySafetyDialog.tsx","../src/components/ui/input.tsx","../src/components/ui/context-menu.tsx","../src/components/schema-explorer/ColumnList.tsx","../src/components/schema-explorer/TableItem.tsx","../src/components/schema-explorer/SchemaExplorer.tsx","../src/components/ui/dialog.tsx","../src/components/ui/label.tsx","../src/lib/types.ts","../src/components/icons/db-icons.tsx","../src/lib/db-ui-config.ts"],"names":["SQL_KEYWORDS","e","useState","useCallback","jsx","monaco","useMemo","jsxs","Hash","SheetPrimitive","Fragment","Copy","Lock","X","Eye","Loader2","useEffect","_a","Filter","display","className","useRef","nodes","edges","format","motion","CheckIcon","React","LineChartIcon","PieChartIcon","AreaChartIcon","Type","Save","Download","ChevronDown","Check","Play","formatNumber","Search","ArrowDown","LayoutGrid","Zap","Database","ChevronRight","Sparkles","TrendingUp","FileJson","Info","Trash2","Send","BarChart3","AlertCircle","AlertTriangle","ColumnList","Key","Item","Separator","Code","Wand2","TableItem","TableIcon","AnimatePresence","XIcon","Label"],"mappings":"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","file":"chunk-G3S66G64.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","/**\n * SQL Alias Extractor\n *\n * Lightweight SQL alias extraction for Monaco Editor completion.\n * Extracts table aliases from SQL queries without full parsing.\n * Designed for performance on every keystroke.\n *\n * @example\n * const result = extractAliases('SELECT * FROM customer AS c JOIN orders o ON c.id = o.customer_id');\n * // result.aliases.get('c') => { alias: 'c', tableName: 'customer', source: 'from' }\n * // result.aliases.get('o') => { alias: 'o', tableName: 'orders', source: 'join' }\n */\n\nimport type { TableAlias, AliasExtractionResult, AliasExtractorOptions } from './types';\n\n/**\n * SQL keywords that should not be treated as aliases\n */\nconst SQL_KEYWORDS = new Set([\n 'on', 'where', 'and', 'or', 'not', 'in', 'is', 'null', 'like', 'between',\n 'set', 'values', 'select', 'from', 'join', 'using', 'as',\n 'left', 'right', 'inner', 'outer', 'cross', 'full', 'natural', 'lateral',\n 'group', 'order', 'by', 'having', 'limit', 'offset', 'fetch', 'first', 'next',\n 'union', 'except', 'intersect', 'all', 'distinct', 'with', 'recursive',\n 'case', 'when', 'then', 'else', 'end', 'cast', 'over', 'partition',\n 'asc', 'desc', 'nulls', 'rows', 'range', 'preceding', 'following', 'current',\n 'into', 'insert', 'update', 'delete', 'truncate', 'create', 'alter', 'drop',\n 'table', 'view', 'index', 'schema', 'database', 'function', 'trigger', 'procedure',\n 'primary', 'key', 'foreign', 'references', 'unique', 'check', 'default', 'constraint',\n 'true', 'false', 'exists', 'any', 'some'\n]);\n\n/**\n * Check if identifier is a SQL keyword (to avoid false positives)\n */\nfunction isSqlKeyword(identifier: string): boolean {\n return SQL_KEYWORDS.has(identifier.toLowerCase());\n}\n\n/**\n * Quick check for table keywords to enable early exit\n */\nfunction hasTableKeywords(sql: string): boolean {\n const upper = sql.toUpperCase();\n return upper.includes('FROM') || upper.includes('JOIN') || upper.includes('WITH');\n}\n\n/**\n * Remove SQL comments and string literals to prevent false matches\n */\nfunction preprocessSql(sql: string): string {\n return sql\n // Remove multi-line comments /* ... */\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, ' ')\n // Remove single-line comments -- ...\n .replace(/--[^\\n]*/g, ' ')\n // Replace string literals with placeholder to preserve structure\n .replace(/'(?:[^'\\\\]|\\\\.)*'/g, \"''\")\n .replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, '\"\"');\n}\n\n/**\n * Extract aliases from WITH clause (CTEs)\n * Pattern: WITH cte_name AS (...)\n */\nfunction extractCTEAliases(\n sql: string,\n aliases: Map<string, TableAlias>,\n caseInsensitive: boolean\n): void {\n // First, check if there's a WITH clause\n const withMatch = sql.match(/\\bWITH\\s+(?:RECURSIVE\\s+)?/i);\n if (!withMatch) return;\n\n // Find the CTE definitions between WITH and the main query\n // CTEs are: name AS (...), name2 AS (...)\n // We need to carefully match the CTE name before AS (\n const ctePattern = /\\b(\\w+)\\s+AS\\s*\\(/gi;\n\n let match;\n while ((match = ctePattern.exec(sql)) !== null) {\n const cteName = match[1];\n\n // Skip if it's a SQL keyword\n if (isSqlKeyword(cteName)) continue;\n\n const key = caseInsensitive ? cteName.toLowerCase() : cteName;\n\n // Don't overwrite existing aliases (CTEs should be defined before use)\n if (!aliases.has(key)) {\n aliases.set(key, {\n alias: cteName,\n tableName: cteName, // CTE name is both alias and \"table\"\n source: 'cte'\n });\n }\n }\n}\n\n/**\n * Extract aliases from FROM clause\n * Patterns:\n * FROM table AS alias\n * FROM table alias\n * FROM schema.table AS alias\n * FROM schema.table alias\n */\nfunction extractFromAliases(\n sql: string,\n aliases: Map<string, TableAlias>,\n caseInsensitive: boolean\n): void {\n // Pattern explanation:\n // \\bFROM\\s+ - FROM keyword followed by whitespace\n // (?:(\\w+)\\.)? - Optional schema prefix (captured group 1)\n // (\\w+) - Table name (required, captured group 2)\n // \\s+ - Required whitespace\n // (?:AS\\s+)? - Optional AS keyword\n // (\\w+) - Alias (required, captured group 3)\n // (?=\\s|,|$) - Followed by whitespace, comma, or end (lookahead to ensure complete match)\n const fromPattern = /\\bFROM\\s+(?:(\\w+)\\.)?(\\w+)\\s+(?:AS\\s+)?(\\w+)(?=\\s|,|$)/gi;\n\n let match;\n while ((match = fromPattern.exec(sql)) !== null) {\n const [, schema, tableName, alias] = match;\n\n // Skip if alias is a SQL keyword\n if (isSqlKeyword(alias)) continue;\n\n // Skip if alias equals table name (not actually an alias)\n if (alias.toLowerCase() === tableName.toLowerCase()) continue;\n\n const key = caseInsensitive ? alias.toLowerCase() : alias;\n\n // Don't overwrite existing aliases\n if (!aliases.has(key)) {\n aliases.set(key, {\n alias,\n tableName,\n schema,\n source: 'from'\n });\n }\n }\n}\n\n/**\n * Extract aliases from JOIN clauses\n * Patterns:\n * JOIN table AS alias\n * LEFT JOIN table alias\n * INNER JOIN schema.table AS alias\n */\nfunction extractJoinAliases(\n sql: string,\n aliases: Map<string, TableAlias>,\n caseInsensitive: boolean\n): void {\n // Pattern for all JOIN types\n // Optional join type prefix: LEFT, RIGHT, INNER, OUTER, CROSS, FULL, NATURAL\n const joinPattern = /\\b(?:LEFT|RIGHT|INNER|OUTER|CROSS|FULL|NATURAL)?\\s*JOIN\\s+(?:(\\w+)\\.)?(\\w+)\\s+(?:AS\\s+)?(\\w+)(?=\\s|$)/gi;\n\n let match;\n while ((match = joinPattern.exec(sql)) !== null) {\n const [, schema, tableName, alias] = match;\n\n // Skip if alias is a SQL keyword\n if (isSqlKeyword(alias)) continue;\n\n // Skip if alias equals table name (not actually an alias)\n if (alias.toLowerCase() === tableName.toLowerCase()) continue;\n\n const key = caseInsensitive ? alias.toLowerCase() : alias;\n\n // Don't overwrite existing aliases\n if (!aliases.has(key)) {\n aliases.set(key, {\n alias,\n tableName,\n schema,\n source: 'join'\n });\n }\n }\n}\n\n/**\n * Main entry point: Extract all table aliases from a SQL query\n *\n * @param sql - The SQL query string to parse\n * @param options - Extraction options\n * @returns AliasExtractionResult containing the alias map\n *\n * @example\n * const { aliases } = extractAliases('SELECT * FROM customer c WHERE c.id = 1');\n * aliases.get('c'); // { alias: 'c', tableName: 'customer', source: 'from' }\n */\nexport function extractAliases(\n sql: string,\n options: AliasExtractorOptions = {}\n): AliasExtractionResult {\n const { includeCTEs = true, caseInsensitive = true } = options;\n\n const aliases = new Map<string, TableAlias>();\n\n // Early exit: no table references\n if (!hasTableKeywords(sql)) {\n return { aliases, hasTableReferences: false };\n }\n\n // Step 1: Preprocess - remove comments and strings\n const cleanedSql = preprocessSql(sql);\n\n // Step 2: Extract CTEs first (they can be referenced in FROM/JOIN)\n if (includeCTEs) {\n extractCTEAliases(cleanedSql, aliases, caseInsensitive);\n }\n\n // Step 3: Extract FROM clause aliases\n extractFromAliases(cleanedSql, aliases, caseInsensitive);\n\n // Step 4: Extract JOIN clause aliases\n extractJoinAliases(cleanedSql, aliases, caseInsensitive);\n\n return { aliases, hasTableReferences: aliases.size > 0 };\n}\n\n/**\n * Resolve an alias to its table name\n *\n * Returns the table name if alias exists in the map,\n * otherwise returns the input unchanged (for backward compatibility\n * with direct table.column completion)\n *\n * @param aliasOrTable - The identifier to resolve\n * @param aliases - The alias map from extractAliases()\n * @returns The resolved table name or the input if not found\n *\n * @example\n * const { aliases } = extractAliases('SELECT * FROM customer c');\n * resolveAlias('c', aliases); // 'customer'\n * resolveAlias('customer', aliases); // 'customer' (passthrough)\n * resolveAlias('unknown', aliases); // 'unknown' (passthrough)\n */\nexport function resolveAlias(\n aliasOrTable: string,\n aliases: Map<string, TableAlias>\n): string {\n const key = aliasOrTable.toLowerCase();\n const tableAlias = aliases.get(key);\n return tableAlias?.tableName ?? aliasOrTable;\n}\n\n/**\n * Get the schema for an alias if it was specified\n *\n * @param aliasOrTable - The identifier to look up\n * @param aliases - The alias map from extractAliases()\n * @returns The schema name or undefined\n */\nexport function getAliasSchema(\n aliasOrTable: string,\n aliases: Map<string, TableAlias>\n): string | undefined {\n const key = aliasOrTable.toLowerCase();\n return aliases.get(key)?.schema;\n}\n","/**\n * SQL Completion Provider for Monaco Editor\n *\n * Pure utility module (no React) that registers SQL keyword, function, snippet,\n * and schema-aware column/table completions.\n */\n\nimport type * as Monaco from 'monaco-editor';\nimport { extractAliases, resolveAlias } from '@/lib/sql';\n\n// ---------------------------------------------------------------------------\n// Static constants\n// ---------------------------------------------------------------------------\n\nexport const SQL_KEYWORDS = [\n 'SELECT', 'FROM', 'WHERE', 'AND', 'OR', 'NOT', 'IN', 'BETWEEN', 'LIKE', 'IS NULL', 'IS NOT NULL',\n 'GROUP BY', 'HAVING', 'ORDER BY', 'LIMIT', 'OFFSET', 'UNION', 'ALL', 'EXISTS', 'DISTINCT',\n 'INNER JOIN', 'LEFT JOIN', 'RIGHT JOIN', 'FULL JOIN', 'CROSS JOIN', 'NATURAL JOIN', 'ON', 'USING',\n 'INSERT INTO', 'VALUES', 'UPDATE', 'SET', 'DELETE', 'TRUNCATE', 'CREATE', 'ALTER', 'DROP',\n 'TABLE', 'VIEW', 'INDEX', 'SCHEMA', 'DATABASE', 'FUNCTION', 'TRIGGER', 'PROCEDURE',\n 'AS', 'WITH', 'CASE', 'WHEN', 'THEN', 'ELSE', 'END', 'CAST', 'COALESCE', 'NULLIF',\n 'WINDOW', 'OVER', 'PARTITION BY', 'ROWS', 'RANGE', 'PRECEDING', 'FOLLOWING', 'UNBOUNDED'\n];\n\nexport const SQL_FUNCTIONS = [\n 'COUNT', 'SUM', 'AVG', 'MIN', 'MAX', 'FIRST_VALUE', 'LAST_VALUE', 'LEAD', 'LAG',\n 'ROW_NUMBER', 'RANK', 'DENSE_RANK', 'NTILE', 'CONCAT', 'SUBSTR', 'LENGTH', 'LOWER', 'UPPER',\n 'TRIM', 'LTRIM', 'RTRIM', 'REPLACE', 'ROUND', 'TRUNC', 'ABS', 'NOW', 'CURRENT_TIMESTAMP',\n 'DATE_PART', 'DATE_TRUNC', 'EXTRACT', 'AGE', 'TO_CHAR', 'TO_DATE', 'TO_NUMBER', 'JSON_AGG', 'JSON_BUILD_OBJECT'\n];\n\nexport const SQL_SNIPPETS = [\n { label: 'SELECT', value: 'SELECT * FROM ${1:table_name} LIMIT 10;' },\n { label: 'INSERT', value: 'INSERT INTO ${1:table_name} (${2:columns})\\nVALUES (${3:values});' },\n { label: 'UPDATE', value: 'UPDATE ${1:table_name}\\nSET ${2:column} = ${3:value}\\nWHERE ${4:condition};' },\n { label: 'DELETE', value: 'DELETE FROM ${1:table_name}\\nWHERE ${2:condition};' },\n { label: 'JOIN', value: 'SELECT ${1:*}\\nFROM ${2:table1} t1\\nJOIN ${3:table2} t2 ON t1.${4:id} = t2.${5:t1_id};' },\n { label: 'WITH', value: 'WITH ${1:cte_name} AS (\\n SELECT ${2:*}\\n FROM ${3:table_name}\\n)\\nSELECT * FROM ${1:cte_name};' },\n];\n\n// ---------------------------------------------------------------------------\n// Pre-computed completion items\n// ---------------------------------------------------------------------------\n\nexport interface PrecomputedItem {\n label: string;\n labelLower: string;\n kind: number;\n insertText: string;\n insertTextRules?: number;\n detail: string;\n}\n\nexport const KEYWORD_ITEMS: PrecomputedItem[] = SQL_KEYWORDS.map(kw => ({\n label: kw,\n labelLower: kw.toLowerCase(),\n kind: 17, // CompletionItemKind.Keyword\n insertText: kw,\n detail: 'SQL Keyword'\n}));\n\nexport const FUNCTION_ITEMS: PrecomputedItem[] = SQL_FUNCTIONS.map(f => ({\n label: f,\n labelLower: f.toLowerCase(),\n kind: 1, // CompletionItemKind.Function\n insertText: f + '($1)',\n insertTextRules: 4, // InsertAsSnippet\n detail: 'SQL Function'\n}));\n\nexport const SNIPPET_ITEMS: PrecomputedItem[] = SQL_SNIPPETS.map(s => ({\n label: s.label,\n labelLower: s.label.toLowerCase(),\n kind: 27, // CompletionItemKind.Snippet\n insertText: s.value,\n insertTextRules: 4, // InsertAsSnippet\n detail: 'SQL Snippet'\n}));\n\n// ---------------------------------------------------------------------------\n// Schema completion cache type (shared with MongoDB completions)\n// ---------------------------------------------------------------------------\n\nexport interface SchemaTableItem {\n label: string;\n labelLower: string;\n rowCount: number;\n columnNames: string;\n}\n\nexport interface SchemaColumnItem {\n label: string;\n labelLower: string;\n type: string;\n isPrimary: boolean;\n tableName: string;\n}\n\nexport interface SchemaCompletionCache {\n tableItems: SchemaTableItem[];\n columnMap: Map<string, SchemaColumnItem[]>;\n allColumns: Map<string, SchemaColumnItem>;\n}\n\n// ---------------------------------------------------------------------------\n// Registration function\n// ---------------------------------------------------------------------------\n\n/**\n * Registers the SQL completion item provider with Monaco.\n *\n * @param monaco - The Monaco namespace (from `useMonaco()` or `beforeMount`)\n * @param schemaCompletionCache - Pre-computed schema data for table/column completions\n * @returns An `IDisposable` that should be called on cleanup.\n */\nexport function registerSQLCompletionProvider(\n monaco: typeof Monaco,\n schemaCompletionCache: SchemaCompletionCache,\n): Monaco.IDisposable {\n return monaco.languages.registerCompletionItemProvider('sql', {\n triggerCharacters: ['.', ' '],\n provideCompletionItems: (model: Monaco.editor.ITextModel, position: Monaco.Position) => {\n const word = model.getWordUntilPosition(position);\n const range = {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endColumn: word.endColumn,\n };\n\n const line = model.getLineContent(position.lineNumber);\n const lastChar = line[position.column - 2];\n const prefix = word.word.toLowerCase();\n\n const suggestions: Monaco.languages.CompletionItem[] = [];\n\n // Dot-triggered: Show columns for specific table or alias\n if (lastChar === '.') {\n const matches = line.substring(0, position.column - 1).match(/(\\w+)\\.$/);\n if (matches) {\n const identifier = matches[1].toLowerCase();\n\n // Helper to find columns by table name (handles schema.table format)\n const findColumns = (tableName: string) => {\n const tableNameLower = tableName.toLowerCase();\n // 1. Try exact match first\n const cols = schemaCompletionCache.columnMap.get(tableNameLower);\n if (cols) return cols;\n\n // 2. Try matching table name with any schema prefix\n for (const [key, value] of schemaCompletionCache.columnMap.entries()) {\n const parts = key.split('.');\n const justTableName = parts[parts.length - 1];\n if (justTableName === tableNameLower) {\n return value;\n }\n }\n return null;\n };\n\n // 1. First, try direct table lookup\n let columns = findColumns(identifier);\n\n // 2. If not found, try alias resolution\n if (!columns) {\n const textToCursor = model.getValueInRange({\n startLineNumber: 1,\n startColumn: 1,\n endLineNumber: position.lineNumber,\n endColumn: position.column - 1\n });\n\n const { aliases } = extractAliases(textToCursor);\n const resolvedTableName = resolveAlias(identifier, aliases);\n columns = findColumns(resolvedTableName);\n }\n\n // 3. Provide column suggestions\n if (columns) {\n columns.forEach(col => {\n suggestions.push({\n label: col.label,\n kind: monaco.languages.CompletionItemKind.Field,\n insertText: col.label,\n range,\n detail: `${col.type}${col.isPrimary ? ' (PK)' : ''}`,\n documentation: `Column of ${col.tableName}`\n });\n });\n }\n }\n return { suggestions };\n }\n\n // General completion with lazy filtering and context awareness\n const shouldFilter = prefix.length >= 2;\n\n // Detect context: Are we in a position where columns make sense?\n const textBeforeCursor = line.substring(0, position.column - 1).toUpperCase();\n const isColumnContext = /\\b(SELECT|WHERE|AND|OR|ON|SET|HAVING|ORDER\\s+BY|GROUP\\s+BY|,)\\s*\\w*$/i.test(textBeforeCursor);\n\n // Keywords\n KEYWORD_ITEMS.forEach(item => {\n if (!shouldFilter || item.labelLower.startsWith(prefix)) {\n suggestions.push({\n label: item.label,\n kind: monaco.languages.CompletionItemKind.Keyword,\n insertText: item.insertText,\n range,\n detail: item.detail,\n sortText: '0' + item.label\n });\n }\n });\n\n // Functions\n FUNCTION_ITEMS.forEach(item => {\n if (!shouldFilter || item.labelLower.startsWith(prefix)) {\n suggestions.push({\n label: item.label,\n kind: monaco.languages.CompletionItemKind.Function,\n insertText: item.insertText,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n range,\n detail: item.detail,\n sortText: '1' + item.label\n });\n }\n });\n\n // Tables\n schemaCompletionCache.tableItems.forEach(table => {\n if (!shouldFilter || table.labelLower.startsWith(prefix)) {\n suggestions.push({\n label: table.label,\n kind: monaco.languages.CompletionItemKind.Class,\n insertText: table.label,\n range,\n detail: `Table (${table.rowCount} rows)`,\n documentation: table.columnNames,\n sortText: '2' + table.label\n });\n }\n });\n\n // Columns - only show in appropriate context\n if (isColumnContext) {\n schemaCompletionCache.allColumns.forEach((col, colName) => {\n if (!shouldFilter || col.labelLower.startsWith(prefix)) {\n suggestions.push({\n label: colName,\n kind: monaco.languages.CompletionItemKind.Field,\n insertText: colName,\n range,\n detail: `Column (${col.type})`,\n sortText: '4' + colName\n });\n }\n });\n }\n\n // Snippets\n SNIPPET_ITEMS.forEach(item => {\n if (!shouldFilter || item.labelLower.startsWith(prefix)) {\n suggestions.push({\n label: item.label,\n kind: monaco.languages.CompletionItemKind.Snippet,\n insertText: item.insertText,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n range,\n detail: item.detail,\n sortText: '3' + item.label\n });\n }\n });\n\n return { suggestions };\n },\n });\n}\n","/**\n * MongoDB / JSON Completion Provider for Monaco Editor\n *\n * Pure utility module (no React) that registers MQL operator, operation,\n * collection, field, and snippet completions for the JSON language.\n */\n\nimport type * as Monaco from 'monaco-editor';\nimport type { SchemaCompletionCache } from './sql-completions';\n\n// ---------------------------------------------------------------------------\n// Static constants\n// ---------------------------------------------------------------------------\n\nconst MQL_OPERATORS = [\n '$match', '$group', '$sort', '$project', '$lookup', '$unwind', '$limit', '$skip',\n '$addFields', '$count', '$facet', '$bucket', '$merge', '$out', '$replaceRoot',\n '$eq', '$ne', '$gt', '$gte', '$lt', '$lte', '$in', '$nin', '$and', '$or', '$not', '$nor',\n '$exists', '$type', '$regex', '$text', '$where', '$all', '$elemMatch', '$size',\n '$set', '$unset', '$inc', '$push', '$pull', '$addToSet', '$pop', '$rename',\n '$sum', '$avg', '$min', '$max', '$first', '$last',\n];\n\nconst MONGO_OPERATIONS = [\n 'find', 'findOne', 'aggregate', 'count', 'distinct',\n 'insertOne', 'insertMany', 'updateOne', 'updateMany', 'deleteOne', 'deleteMany',\n];\n\nconst MONGO_SNIPPETS: { label: string; template: string; detail: string }[] = [\n {\n label: 'find',\n template: JSON.stringify({ collection: '${1:collection}', operation: 'find', filter: {}, options: { limit: 50 } }, null, 2),\n detail: 'Find documents',\n },\n {\n label: 'findOne',\n template: JSON.stringify({ collection: '${1:collection}', operation: 'findOne', filter: { _id: '${2:id}' } }, null, 2),\n detail: 'Find single document',\n },\n {\n label: 'aggregate',\n template: JSON.stringify({ collection: '${1:collection}', operation: 'aggregate', pipeline: [{ '$match': {} }, { '$group': { _id: '${2:field}', count: { '$sum': 1 } } }] }, null, 2),\n detail: 'Aggregation pipeline',\n },\n {\n label: 'count',\n template: JSON.stringify({ collection: '${1:collection}', operation: 'count', filter: {} }, null, 2),\n detail: 'Count documents',\n },\n {\n label: 'insertOne',\n template: JSON.stringify({ collection: '${1:collection}', operation: 'insertOne', documents: [{ '${2:field}': '${3:value}' }] }, null, 2),\n detail: 'Insert one document',\n },\n {\n label: 'updateOne',\n template: JSON.stringify({ collection: '${1:collection}', operation: 'updateOne', filter: { _id: '${2:id}' }, update: { '$set': { '${3:field}': '${4:value}' } } }, null, 2),\n detail: 'Update one document',\n },\n {\n label: 'deleteMany',\n template: JSON.stringify({ collection: '${1:collection}', operation: 'deleteMany', filter: { '${2:field}': '${3:value}' } }, null, 2),\n detail: 'Delete matching documents',\n },\n];\n\n// ---------------------------------------------------------------------------\n// Registration function\n// ---------------------------------------------------------------------------\n\n/**\n * Registers the MongoDB/JSON completion item provider with Monaco.\n *\n * @param monaco - The Monaco namespace\n * @param schemaCompletionCache - Pre-computed schema data for collection/field completions\n * @returns An `IDisposable` that should be called on cleanup.\n */\nexport function registerMongoDBCompletionProvider(\n monaco: typeof Monaco,\n schemaCompletionCache: SchemaCompletionCache,\n): Monaco.IDisposable {\n return monaco.languages.registerCompletionItemProvider('json', {\n triggerCharacters: ['\"', '$', ':'],\n provideCompletionItems: (model: Monaco.editor.ITextModel, position: Monaco.Position) => {\n const word = model.getWordUntilPosition(position);\n const range = {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endColumn: word.endColumn,\n };\n\n const line = model.getLineContent(position.lineNumber);\n const textBefore = line.substring(0, position.column - 1);\n const suggestions: Monaco.languages.CompletionItem[] = [];\n\n // After \"$\" -- MQL operators\n if (textBefore.includes('$') || word.word.startsWith('$')) {\n MQL_OPERATORS.forEach(op => {\n suggestions.push({\n label: op,\n kind: monaco.languages.CompletionItemKind.Keyword,\n insertText: op,\n range,\n detail: 'MQL Operator',\n sortText: '0' + op,\n });\n });\n }\n\n // After \"operation\": \" -- operation names\n if (/\"operation\"\\s*:\\s*\"[^\"]*$/.test(textBefore)) {\n MONGO_OPERATIONS.forEach(op => {\n suggestions.push({\n label: op,\n kind: monaco.languages.CompletionItemKind.Enum,\n insertText: op,\n range,\n detail: 'MongoDB Operation',\n sortText: '0' + op,\n });\n });\n }\n\n // After \"collection\": \" -- collection names from schema\n if (/\"collection\"\\s*:\\s*\"[^\"]*$/.test(textBefore)) {\n schemaCompletionCache.tableItems.forEach(table => {\n suggestions.push({\n label: table.label,\n kind: monaco.languages.CompletionItemKind.Class,\n insertText: table.label,\n range,\n detail: `Collection (${table.rowCount} docs)`,\n sortText: '0' + table.label,\n });\n });\n }\n\n // Field names inside filter/sort/projection\n if (/\"[^\"]*$/.test(textBefore) && !/\"(collection|operation)\"\\s*:\\s*\"/.test(textBefore)) {\n schemaCompletionCache.allColumns.forEach((col, colName) => {\n suggestions.push({\n label: colName,\n kind: monaco.languages.CompletionItemKind.Field,\n insertText: colName,\n range,\n detail: `Field (${col.type})`,\n sortText: '2' + colName,\n });\n });\n }\n\n // Full template snippets -- when editor is mostly empty or at line start\n const fullText = model.getValue().trim();\n if (fullText.length < 5 || /^\\s*$/.test(textBefore)) {\n MONGO_SNIPPETS.forEach(snippet => {\n suggestions.push({\n label: snippet.label,\n kind: monaco.languages.CompletionItemKind.Snippet,\n insertText: snippet.template,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n range,\n detail: snippet.detail,\n sortText: '1' + snippet.label,\n });\n });\n }\n\n return { suggestions };\n },\n });\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\n\ninterface ParsedTable {\n name: string;\n rowCount?: number;\n columns?: Array<{\n name: string;\n type: string;\n isPrimary?: boolean;\n }>;\n}\n\ninterface AiChatDeps {\n /** Parsed schema tables for context */\n parsedSchema: ParsedTable[];\n /** Raw schema context JSON string (fallback) */\n schemaContext?: string;\n /** Database type for the AI prompt */\n databaseType?: string;\n /** Returns the current editor value */\n getEditorValue: () => string;\n /** Sets editor content and syncs value */\n setEditorValue: (value: string) => void;\n /** Notifies the parent of a value change */\n onChange?: (val: string) => void;\n /** Optional API adapter: when provided, bypasses the built-in /api/ai/chat fetch. */\n onAiChat?: (params: { prompt: string; schemaContext: string; history: { role: string; content: string }[] }) => Promise<string>;\n}\n\nexport interface AiChatState {\n showAi: boolean;\n setShowAi: (show: boolean) => void;\n aiPrompt: string;\n setAiPrompt: (prompt: string) => void;\n isAiLoading: boolean;\n aiError: string | null;\n setAiError: (error: string | null) => void;\n aiConversationHistory: { role: 'user' | 'assistant'; content: string }[];\n setAiConversationHistory: React.Dispatch<React.SetStateAction<{ role: 'user' | 'assistant'; content: string }[]>>;\n handleAiSubmit: (e?: React.FormEvent) => Promise<void>;\n}\n\n/**\n * Manages the AI chat panel state and the streaming submit handler.\n *\n * All editor interactions are done through the callback deps to keep\n * this hook independent of the Monaco editor instance.\n */\nexport function useAiChat(deps: AiChatDeps): AiChatState {\n const { parsedSchema, schemaContext, databaseType, getEditorValue, setEditorValue, onChange, onAiChat } = deps;\n\n const [showAi, setShowAi] = useState(false);\n const [aiPrompt, setAiPrompt] = useState('');\n const [isAiLoading, setIsAiLoading] = useState(false);\n const [aiError, setAiError] = useState<string | null>(null);\n const [aiConversationHistory, setAiConversationHistory] = useState<{ role: 'user' | 'assistant'; content: string }[]>([]);\n\n const handleAiSubmit = useCallback(async (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n if (!aiPrompt.trim() || isAiLoading) return;\n\n setIsAiLoading(true);\n setAiError(null);\n try {\n let filteredSchemaContext = '';\n if (schemaContext) {\n try {\n const topTables = [...parsedSchema]\n .sort((a, b) => (b.rowCount || 0) - (a.rowCount || 0))\n .slice(0, 100);\n\n filteredSchemaContext = topTables.map(table => {\n if (!table.columns || table.columns.length === 0) {\n return `Table: ${table.name} (${table.rowCount || 0} rows)\\nColumns: (none)`;\n }\n const cols = table.columns.slice(0, 10).map((c) => `${c.name} (${c.type}${c.isPrimary ? ', PK' : ''})`).join(', ');\n return `Table: ${table.name} (${table.rowCount || 0} rows)\\nColumns: ${cols}${table.columns.length > 10 ? '...' : ''}`;\n }).join('\\n\\n');\n } catch {\n filteredSchemaContext = schemaContext.substring(0, 2000);\n }\n }\n\n const currentVal = getEditorValue();\n const shouldReplace = !currentVal || currentVal.startsWith('--');\n\n let fullAiResponse = '';\n if (!shouldReplace) {\n fullAiResponse = currentVal + '\\n\\n';\n }\n\n if (onAiChat) {\n // Platform adapter: use callback instead of fetch\n const result = await onAiChat({\n prompt: aiPrompt,\n schemaContext: filteredSchemaContext,\n history: aiConversationHistory,\n });\n fullAiResponse += result;\n setEditorValue(fullAiResponse);\n onChange?.(fullAiResponse);\n } else {\n // Default: existing fetch behavior\n const response = await fetch('/api/ai/chat', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n prompt: aiPrompt,\n databaseType,\n schemaContext: filteredSchemaContext,\n conversationHistory: aiConversationHistory.length > 0 ? aiConversationHistory : undefined,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'AI request failed');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader available');\n\n // Buffered update using requestAnimationFrame to avoid excessive re-renders\n let rafId: number | null = null;\n const updateEditor = () => {\n setEditorValue(fullAiResponse);\n rafId = null;\n };\n\n while (true) {\n const { done, value: chunkValue } = await reader.read();\n if (done) break;\n const chunk = new TextDecoder().decode(chunkValue);\n fullAiResponse += chunk;\n\n // Schedule update on next animation frame if not already scheduled\n if (!rafId) {\n rafId = requestAnimationFrame(updateEditor);\n }\n }\n\n // Ensure final content is set and cancel any pending RAF\n if (rafId) {\n cancelAnimationFrame(rafId);\n }\n setEditorValue(fullAiResponse);\n onChange?.(fullAiResponse);\n }\n\n // Save conversation history for multi-turn\n setAiConversationHistory(prev => [\n ...prev,\n { role: 'user' as const, content: aiPrompt },\n { role: 'assistant' as const, content: fullAiResponse },\n ]);\n\n setAiPrompt('');\n setShowAi(false);\n } catch (error) {\n console.error('AI Error:', error);\n const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred while communicating with the AI.';\n setAiError(errorMessage);\n } finally {\n setIsAiLoading(false);\n }\n }, [aiPrompt, isAiLoading, schemaContext, parsedSchema, databaseType, aiConversationHistory, getEditorValue, setEditorValue, onChange, onAiChat]);\n\n return {\n showAi,\n setShowAi,\n aiPrompt,\n setAiPrompt,\n isAiLoading,\n aiError,\n setAiError,\n aiConversationHistory,\n setAiConversationHistory,\n handleAiSubmit,\n };\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useMemo, forwardRef, useImperativeHandle, useCallback } from 'react';\nimport Editor, { useMonaco } from '@monaco-editor/react';\nimport type * as Monaco from 'monaco-editor';\nimport { Zap, Sparkles, Send, X, Loader2, AlignLeft, Trash2, Copy, Play, Hash } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { format } from 'sql-formatter';\nimport { registerSQLCompletionProvider } from '@/lib/editor/sql-completions';\nimport type { SchemaCompletionCache, SchemaColumnItem } from '@/lib/editor/sql-completions';\nimport { registerMongoDBCompletionProvider } from '@/lib/editor/mongodb-completions';\nimport { useAiChat } from '@/hooks/use-ai-chat';\n\nexport interface QueryEditorRef {\n getSelectedText: () => string;\n getEffectiveQuery: () => string;\n getValue: () => string;\n setValue: (value: string) => void;\n focus: () => void;\n format: () => void;\n toggleAi: () => void;\n}\n\ninterface QueryEditorProps {\n /** Initial value for the editor. Changes to this prop will update the editor content. */\n value: string;\n /** Optional callback for value changes. Only called on blur, execute, or explicit sync - NOT on every keystroke. */\n onChange?: (val: string) => void;\n /** Called when content changes in real-time. Use sparingly as it triggers on every keystroke. */\n onContentChange?: (val: string) => void;\n onExplain?: () => void;\n language?: 'sql' | 'json';\n tables?: string[];\n databaseType?: string;\n schemaContext?: string;\n capabilities?: import('@/lib/db/types').ProviderCapabilities;\n /** Optional API adapter: when provided, bypasses the built-in /api/ai/chat fetch. */\n onAiChat?: (params: { prompt: string; schemaContext: string; history: { role: string; content: string }[] }) => Promise<string>;\n}\n\ninterface ParsedTable {\n name: string;\n rowCount?: number;\n columns?: Array<{\n name: string;\n type: string;\n isPrimary?: boolean;\n }>;\n}\n\n// Static editor options - defined outside component to prevent re-creation on every render\nconst getEditorOptions = (showLineNumbers: boolean) => ({\n minimap: { enabled: false },\n fontSize: 13,\n fontFamily: '\"JetBrains Mono\", \"Fira Code\", Menlo, Monaco, Consolas, monospace',\n lineNumbers: showLineNumbers ? ('on' as const) : ('off' as const),\n roundedSelection: true,\n scrollBeyondLastLine: false,\n readOnly: false,\n automaticLayout: true,\n padding: { top: 12 },\n cursorSmoothCaretAnimation: 'on' as const,\n cursorBlinking: 'smooth' as const,\n smoothScrolling: true,\n contextmenu: true,\n renderLineHighlight: 'all' as const,\n bracketPairColorization: { enabled: true },\n guides: { indentation: true },\n scrollbar: {\n vertical: 'visible' as const,\n horizontal: 'visible' as const,\n verticalScrollbarSize: 8,\n horizontalScrollbarSize: 8,\n },\n fontLigatures: true,\n suggestOnTriggerCharacters: true,\n quickSuggestions: {\n other: true,\n comments: false,\n strings: true\n },\n parameterHints: {\n enabled: true\n }\n});\n\nexport const QueryEditor = forwardRef<QueryEditorRef, QueryEditorProps>(({\n value,\n onChange,\n onContentChange,\n onExplain,\n language = 'sql',\n tables = [],\n databaseType,\n schemaContext,\n capabilities,\n onAiChat,\n}, ref) => {\n const monaco = useMonaco();\n const editorRef = useRef<Monaco.editor.IStandaloneCodeEditor | null>(null);\n const [hasSelection, setHasSelection] = useState(false);\n \n // Line numbers toggle state (persisted in localStorage)\n const [showLineNumbers, setShowLineNumbers] = useState<boolean>(() => {\n if (typeof window !== 'undefined') {\n const saved = localStorage.getItem('editor-line-numbers');\n return saved !== null ? saved === 'true' : true; // default: true\n }\n return true;\n });\n\n // Track last synced value to detect external changes\n const lastSyncedValueRef = useRef<string>(value);\n const isInternalChangeRef = useRef<boolean>(false);\n\n // Sync editor content when value prop changes externally (e.g., tab switch)\n useEffect(() => {\n if (editorRef.current && value !== lastSyncedValueRef.current) {\n const currentEditorValue = editorRef.current.getValue();\n // Only update if the new value is different from current editor content\n // This prevents unnecessary updates when we're the source of the change\n if (value !== currentEditorValue) {\n isInternalChangeRef.current = true;\n editorRef.current.setValue(value);\n lastSyncedValueRef.current = value;\n isInternalChangeRef.current = false;\n }\n }\n }, [value]);\n\n // Update editor options when line numbers toggle changes\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.updateOptions({ lineNumbers: showLineNumbers ? 'on' : 'off' });\n }\n }, [showLineNumbers]);\n\n // Persist line numbers preference to localStorage\n useEffect(() => {\n if (typeof window !== 'undefined') {\n localStorage.setItem('editor-line-numbers', String(showLineNumbers));\n }\n }, [showLineNumbers]);\n\n const parsedSchema = useMemo((): ParsedTable[] => {\n if (!schemaContext) return [];\n try {\n return JSON.parse(schemaContext);\n } catch (e) {\n console.error('Failed to parse schema context for editor:', e);\n return [];\n }\n }, [schemaContext]);\n\n // Pre-compute schema-based completion items for faster lookups\n const schemaCompletionCache = useMemo((): SchemaCompletionCache => {\n const tableItems: SchemaCompletionCache['tableItems'] = [];\n const columnMap = new Map<string, SchemaColumnItem[]>();\n const allColumns = new Map<string, SchemaColumnItem>();\n\n parsedSchema.forEach((table) => {\n const tableLower = table.name.toLowerCase();\n tableItems.push({\n label: table.name,\n labelLower: tableLower,\n rowCount: table.rowCount || 0,\n columnNames: table.columns?.map((c) => c.name).join(', ') || ''\n });\n\n const tableColumns: SchemaColumnItem[] = [];\n table.columns?.forEach((col) => {\n const colItem: SchemaColumnItem = {\n label: col.name,\n labelLower: col.name.toLowerCase(),\n type: col.type,\n isPrimary: col.isPrimary || false,\n tableName: table.name\n };\n tableColumns.push(colItem);\n\n // Only store first occurrence for global column suggestions\n if (!allColumns.has(col.name)) {\n allColumns.set(col.name, colItem);\n }\n });\n columnMap.set(tableLower, tableColumns);\n });\n\n return { tableItems, columnMap, allColumns };\n }, [parsedSchema]);\n\n const handleFormat = () => {\n if (!editorRef.current) return;\n const currentValue = editorRef.current.getValue();\n if (!currentValue) return;\n\n try {\n let formatted: string;\n if (language === 'json') {\n // JSON formatting for MongoDB queries\n const parsed = JSON.parse(currentValue);\n formatted = JSON.stringify(parsed, null, 2);\n } else if (language === 'sql') {\n formatted = format(currentValue, {\n language: 'postgresql',\n keywordCase: 'upper',\n dataTypeCase: 'upper',\n indentStyle: 'tabularLeft',\n logicalOperatorNewline: 'before',\n expressionWidth: 100,\n tabWidth: 2,\n linesBetweenQueries: 2,\n });\n } else {\n return;\n }\n editorRef.current.setValue(formatted);\n lastSyncedValueRef.current = formatted;\n onChange?.(formatted);\n } catch (e) {\n console.error('Formatting failed:', e);\n }\n };\n\n const getSelectedText = () => {\n if (!editorRef.current) return '';\n const selection = editorRef.current.getSelection();\n const model = editorRef.current.getModel();\n if (!selection || !model) return '';\n return model.getValueInRange(selection);\n };\n\n const getEffectiveQuery = () => {\n const editorValue = editorRef.current?.getValue() || '';\n if (!editorRef.current || !monaco) return { query: editorValue, range: null };\n\n const model = editorRef.current.getModel();\n if (!model) return { query: editorValue, range: null };\n\n // 1. Check for explicit selection\n const selection = editorRef.current.getSelection();\n if (selection) {\n const selectedText = model.getValueInRange(selection);\n if (selectedText && selectedText.trim().length > 0) {\n return { query: selectedText, range: selection };\n }\n }\n\n // 2. If no selection, try to find the current statement (between semicolons)\n if (language === 'sql') {\n const position = editorRef.current.getPosition();\n if (position) {\n const fullText = model.getValue();\n const cursorOffset = model.getOffsetAt(position);\n\n // Find boundaries of the current statement\n let startOffset = fullText.lastIndexOf(';', cursorOffset - 1);\n let endOffset = fullText.indexOf(';', cursorOffset);\n\n if (startOffset === -1) startOffset = 0;\n else startOffset += 1; // skip the semicolon\n\n if (endOffset === -1) endOffset = fullText.length;\n\n const statement = fullText.substring(startOffset, endOffset).trim();\n if (statement.length > 0) {\n const startPos = model.getPositionAt(startOffset);\n const endPos = model.getPositionAt(endOffset);\n const range = new monaco.Range(startPos.lineNumber, startPos.column, endPos.lineNumber, endPos.column);\n return { query: statement, range };\n }\n }\n }\n\n return { query: editorValue, range: null };\n };\n\n // Track active highlight timeout to prevent race conditions\n const highlightTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const activeDecorationsRef = useRef<string[]>([]);\n\n const flashHighlight = (range: Monaco.Range | null) => {\n if (!editorRef.current || !monaco || !range) return;\n\n // Clear any existing highlight first\n if (highlightTimeoutRef.current) {\n clearTimeout(highlightTimeoutRef.current);\n highlightTimeoutRef.current = null;\n }\n if (activeDecorationsRef.current.length > 0 && editorRef.current) {\n editorRef.current.deltaDecorations(activeDecorationsRef.current, []);\n activeDecorationsRef.current = [];\n }\n\n // Create new decoration\n const decorations = editorRef.current.deltaDecorations([], [\n {\n range: range,\n options: {\n isWholeLine: false,\n className: 'executed-query-highlight',\n inlineClassName: 'executed-query-inline-highlight'\n }\n }\n ]);\n activeDecorationsRef.current = decorations;\n\n // Schedule removal with ref tracking for safe cleanup\n highlightTimeoutRef.current = setTimeout(() => {\n if (editorRef.current && activeDecorationsRef.current.length > 0) {\n editorRef.current.deltaDecorations(activeDecorationsRef.current, []);\n activeDecorationsRef.current = [];\n }\n highlightTimeoutRef.current = null;\n }, 1000);\n };\n\n // Cleanup highlight timeout on unmount\n useEffect(() => {\n return () => {\n if (highlightTimeoutRef.current) {\n clearTimeout(highlightTimeoutRef.current);\n }\n };\n }, []);\n\n // AI Chat hook (must be before useImperativeHandle that references showAi/setShowAi)\n const getEditorValue = useCallback(() => editorRef.current?.getValue() || '', []);\n const setEditorValueForAi = useCallback((val: string) => {\n if (editorRef.current) {\n editorRef.current.setValue(val);\n lastSyncedValueRef.current = val;\n }\n }, []);\n\n const {\n showAi,\n setShowAi,\n aiPrompt,\n setAiPrompt,\n isAiLoading,\n aiError,\n setAiError,\n aiConversationHistory,\n setAiConversationHistory,\n handleAiSubmit,\n } = useAiChat({\n parsedSchema,\n schemaContext,\n databaseType,\n getEditorValue,\n setEditorValue: setEditorValueForAi,\n onChange,\n onAiChat,\n });\n\n useImperativeHandle(ref, () => ({\n getSelectedText,\n getEffectiveQuery: () => getEffectiveQuery().query,\n getValue: () => editorRef.current?.getValue() || '',\n setValue: (newValue: string) => {\n if (editorRef.current) {\n editorRef.current.setValue(newValue);\n lastSyncedValueRef.current = newValue;\n }\n },\n focus: () => editorRef.current?.focus(),\n format: handleFormat,\n toggleAi: () => setShowAi(!showAi),\n }));\n\n const handleCopy = () => {\n const textToCopy = getSelectedText() || editorRef.current?.getValue() || '';\n navigator.clipboard.writeText(textToCopy);\n };\n\n const handleClear = () => {\n if (editorRef.current) {\n editorRef.current.setValue('');\n lastSyncedValueRef.current = '';\n onChange?.('');\n }\n };\n\n // Store original console.error for cleanup\n const originalConsoleErrorRef = useRef<typeof console.error | null>(null);\n\n // Cleanup console.error override on unmount\n useEffect(() => {\n return () => {\n if (originalConsoleErrorRef.current) {\n console.error = originalConsoleErrorRef.current;\n originalConsoleErrorRef.current = null;\n }\n };\n }, []);\n\n const handleBeforeMount = (monacoInstance: typeof Monaco) => {\n // Suppress Monaco's \"Canceled\" errors in console (with cleanup tracking)\n if (!originalConsoleErrorRef.current) {\n originalConsoleErrorRef.current = console.error;\n const originalConsoleError = console.error;\n console.error = (...args: unknown[]) => {\n const message = args[0]?.toString?.() || '';\n if (message.includes('Canceled') || message.includes('ERR Canceled')) {\n return; // Suppress Monaco cancellation errors\n }\n originalConsoleError.apply(console, args as Parameters<typeof console.error>);\n };\n }\n\n monacoInstance.editor.defineTheme('db-dark', {\n base: 'vs-dark',\n inherit: true,\n rules: [\n { token: 'keyword', foreground: '569cd6', fontStyle: 'bold' },\n { token: 'function', foreground: 'dcdcaa' },\n { token: 'string', foreground: 'ce9178' },\n { token: 'number', foreground: 'b5cea8' },\n { token: 'comment', foreground: '6a9955' },\n { token: 'operator', foreground: 'd4d4d4' },\n { token: 'identifier', foreground: '9cdcfe' },\n ],\n colors: {\n 'editor.background': '#050505',\n 'editor.foreground': '#d4d4d4',\n 'editorCursor.foreground': '#569cd6',\n 'editor.lineHighlightBackground': '#111111',\n 'editorLineNumber.foreground': '#333333',\n 'editorLineNumber.activeForeground': '#666666',\n 'editor.selectionBackground': '#264f78',\n 'editor.inactiveSelectionBackground': '#3a3d41',\n 'editorIndentGuide.background': '#1a1a1a',\n 'editorIndentGuide.activeBackground': '#333333',\n }\n });\n };\n\n // SQL completion provider\n useEffect(() => {\n if (monaco && language === 'sql') {\n const disposable = registerSQLCompletionProvider(monaco, schemaCompletionCache);\n return () => disposable.dispose();\n }\n }, [monaco, language, schemaCompletionCache]);\n\n // MongoDB JSON completion provider\n useEffect(() => {\n if (monaco && language === 'json') {\n const disposable = registerMongoDBCompletionProvider(monaco, schemaCompletionCache);\n return () => disposable.dispose();\n }\n }, [monaco, language, schemaCompletionCache]);\n\n const handleEditorChange = (val: string | undefined) => {\n const newValue = val || '';\n // Only call onContentChange if provided (for real-time sync scenarios)\n // This avoids the performance hit of updating parent state on every keystroke\n onContentChange?.(newValue);\n };\n\n // Sync to parent on blur (when user leaves the editor)\n const handleEditorBlur = () => {\n if (editorRef.current) {\n const currentValue = editorRef.current.getValue();\n lastSyncedValueRef.current = currentValue;\n onChange?.(currentValue);\n }\n };\n\n const handleExecute = () => {\n // Sync current content to parent before executing\n if (editorRef.current) {\n const currentValue = editorRef.current.getValue();\n lastSyncedValueRef.current = currentValue;\n onChange?.(currentValue);\n }\n\n const { query, range } = getEffectiveQuery();\n flashHighlight(range);\n const event = new CustomEvent('execute-query', { detail: { query } });\n window.dispatchEvent(event);\n };\n\n\n return (\n <div className=\"h-full w-full flex flex-col bg-[#050505] relative overflow-hidden group\">\n {/* Dynamic Pro Toolbar - Hidden on mobile */}\n <div className=\"hidden md:flex items-center gap-1 px-4 py-1.5 bg-[#0a0a0a] border-b border-white/5 overflow-x-auto no-scrollbar scroll-smooth\">\n {hasSelection && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs font-medium text-white bg-blue-600 hover:bg-blue-500 hover:text-white gap-2 shadow-[0_0_10px_rgba(37,99,235,0.3)] animate-in fade-in zoom-in duration-200\"\n onClick={handleExecute}\n >\n <Play strokeWidth={1.5} className=\"w-3 h-3 fill-current\" /> Run Sel\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs font-medium text-zinc-500 hover:text-white gap-2\"\n onClick={handleFormat}\n title={language === 'json' ? \"Format JSON (Shift+Alt+F)\" : \"Format SQL (Shift+Alt+F)\"}\n >\n <AlignLeft strokeWidth={1.5} className=\"w-3 h-3\" /> Format\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs font-medium text-zinc-500 hover:text-white gap-2\"\n onClick={handleCopy}\n >\n <Copy strokeWidth={1.5} className=\"w-3 h-3\" /> {hasSelection ? 'Copy Sel' : 'Copy'}\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs font-medium text-zinc-500 hover:text-red-400 gap-2\"\n onClick={handleClear}\n >\n <Trash2 strokeWidth={1.5} className=\"w-3 h-3\" /> Clear\n </Button>\n\n <div className=\"h-4 w-px bg-white/5\" />\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-7 text-xs font-medium gap-2\",\n showLineNumbers ? \"text-zinc-300\" : \"text-zinc-500 hover:text-white\"\n )}\n onClick={() => setShowLineNumbers(!showLineNumbers)}\n title={showLineNumbers ? \"Hide line numbers\" : \"Show line numbers\"}\n >\n <Hash strokeWidth={1.5} className=\"w-3 h-3\" /> Lines\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-7 text-xs font-medium gap-2\",\n showAi\n ? \"text-white bg-blue-600 hover:bg-blue-500 hover:text-white shadow-[0_0_10px_rgba(37,99,235,0.4)]\"\n : \"text-zinc-500 hover:text-blue-400\"\n )}\n onClick={() => setShowAi(!showAi)}\n >\n <Sparkles className={cn(\"w-3 h-3\", showAi && \"animate-pulse\")} /> AI\n </Button>\n\n <div className=\"flex-1\" />\n\n <div className=\"flex items-center gap-2 opacity-50 hover:opacity-100 transition-opacity\">\n {onExplain && capabilities?.supportsExplain && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs font-medium text-amber-500 hover:text-amber-400 gap-2\"\n onClick={onExplain}\n >\n <Zap strokeWidth={1.5} className=\"w-3 h-3\" /> Explain\n </Button>\n )}\n <kbd className=\"px-1.5 py-0.5 rounded bg-zinc-900 border border-white/5 text-[0.5625rem] text-zinc-600 font-mono\">\n ⌘+Enter\n </kbd>\n </div>\n </div>\n\n {/* Floating AI Input */}\n <AnimatePresence>\n {showAi && (\n <motion.div\n initial={{ opacity: 0, y: -10, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -10, scale: 0.95 }}\n className=\"absolute top-2 md:top-12 left-1/2 -translate-x-1/2 w-full max-w-2xl z-50 px-2 md:px-4\"\n >\n <form\n onSubmit={handleAiSubmit}\n className=\"bg-[#0f0f0f]/95 backdrop-blur-xl border border-blue-500/40 rounded-2xl shadow-[0_0_50px_rgba(37,99,235,0.25)] overflow-hidden flex flex-col p-1.5\"\n >\n <div className=\"flex items-center justify-between px-3 py-1.5 border-b border-white/5 mb-1.5\">\n <div className=\"flex items-center gap-2\">\n <div className=\"p-1 rounded-md bg-blue-500/10\">\n <Sparkles strokeWidth={1.5} className=\"w-3 h-3 text-blue-400\" />\n </div>\n <span className=\"text-[0.625rem] font-black text-blue-400\">Expert DBA Mode</span>\n </div>\n <div className=\"flex items-center gap-2\">\n {aiConversationHistory.length > 0 && (\n <button\n type=\"button\"\n onClick={() => setAiConversationHistory([])}\n className=\"text-[0.625rem] text-zinc-500 hover:text-zinc-300 font-medium px-1.5 py-0.5 rounded bg-white/5 hover:bg-white/10 transition-colors\"\n title=\"Clear conversation history\"\n >\n {aiConversationHistory.length / 2} turns - Clear\n </button>\n )}\n <span className=\"text-[0.625rem] text-zinc-500 font-medium\">Context: {tables.length} tables</span>\n <div className=\"w-1 h-1 rounded-full bg-emerald-500 animate-pulse\" />\n </div>\n </div>\n\n <AnimatePresence>\n {aiError && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n className=\"px-3 pb-2\"\n >\n <div className=\"bg-red-500/10 border border-red-500/20 rounded-lg p-2.5 flex items-start gap-2.5\">\n <div className=\"p-1 rounded bg-red-500/20 mt-0.5\">\n <X strokeWidth={1.5} className=\"w-3 h-3 text-red-400\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-xs font-medium text-red-400 mb-0.5\">AI Error</p>\n <p className=\"text-xs text-red-300/90 leading-relaxed\">{aiError}</p>\n </div>\n <button\n type=\"button\"\n onClick={() => setAiError(null)}\n className=\"text-red-400/50 hover:text-red-400 transition-colors\"\n >\n <X strokeWidth={1.5} className=\"w-3 h-3\" />\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n <div className=\"flex items-center gap-2 px-3 pb-1.5\">\n\n <input\n autoFocus\n value={aiPrompt}\n onChange={(e) => setAiPrompt(e.target.value)}\n placeholder=\"Describe the data you need in plain English... (e.g. 'Show me the revenue growth per month')\"\n className=\"bg-transparent border-none outline-none text-xs text-zinc-100 w-full h-12 placeholder:text-zinc-600 font-medium\"\n />\n <div className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={() => setShowAi(false)}\n className=\"p-2.5 rounded-xl hover:bg-white/5 text-zinc-500 transition-colors\"\n >\n <X strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n <button\n type=\"submit\"\n disabled={isAiLoading || !aiPrompt.trim()}\n className=\"bg-blue-600 hover:bg-blue-500 disabled:opacity-50 disabled:hover:bg-blue-600 px-4 py-2 rounded-xl text-white text-[0.625rem] font-medium transition-all shadow-lg shadow-blue-600/30 flex items-center gap-2\"\n >\n {isAiLoading ? (\n <>\n <Loader2 strokeWidth={1.5} className=\"w-3 h-3 animate-spin\" />\n <span>Thinking...</span>\n </>\n ) : (\n <>\n <span>Generate</span>\n <Send strokeWidth={1.5} className=\"w-3 h-3\" />\n </>\n )}\n </button>\n </div>\n </div>\n </form>\n </motion.div>\n )}\n </AnimatePresence>\n\n <div className=\"flex-1 relative\">\n <Editor\n height=\"100%\"\n language={language}\n theme=\"db-dark\"\n value={value}\n beforeMount={handleBeforeMount}\n onChange={handleEditorChange}\n loading={<div className=\"h-full w-full bg-[#050505] flex items-center justify-center\"><Loader2 strokeWidth={1.5} className=\"w-6 h-6 animate-spin text-zinc-800\" /></div>}\n onMount={(editor, monaco) => {\n editorRef.current = editor;\n\n // Sync to parent when editor loses focus\n editor.onDidBlurEditorText(() => {\n handleEditorBlur();\n });\n\n editor.onDidChangeCursorSelection(() => {\n const selection = editor.getSelection();\n setHasSelection(selection ? !selection.isEmpty() : false);\n });\n\n // Add custom keyboard shortcut\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {\n handleExecute();\n });\n\n // Add format shortcut\n editor.addCommand(monaco.KeyMod.Alt | monaco.KeyMod.Shift | monaco.KeyCode.KeyF, () => {\n handleFormat();\n });\n\n // Context Menu Actions\n editor.addAction({\n id: 'run-query',\n label: 'Run Query',\n keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter],\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1,\n run: () => handleExecute()\n });\n\n if (onExplain) {\n editor.addAction({\n id: 'explain-query',\n label: 'Explain Plan',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 2,\n run: () => onExplain()\n });\n }\n\n editor.addAction({\n id: 'format-sql',\n label: 'Format SQL',\n keybindings: [monaco.KeyMod.Alt | monaco.KeyMod.Shift | monaco.KeyCode.KeyF],\n contextMenuGroupId: 'modification',\n contextMenuOrder: 1,\n run: () => handleFormat()\n });\n }}\n options={getEditorOptions(showLineNumbers)}\n />\n\n </div>\n </div>\n );\n});\n\nQueryEditor.displayName = 'QueryEditor';\n","export type ThresholdLevel = 'healthy' | 'warning' | 'critical';\n\nexport interface ThresholdConfig {\n metric: string;\n warning: number;\n critical: number;\n direction: 'above' | 'below';\n label: string;\n}\n\nexport const DEFAULT_THRESHOLDS: ThresholdConfig[] = [\n { metric: 'cacheHitRatio', warning: 90, critical: 80, direction: 'below', label: 'Cache Hit Ratio' },\n { metric: 'connectionPercent', warning: 70, critical: 90, direction: 'above', label: 'Connection Usage' },\n { metric: 'deadlocks', warning: 1, critical: 5, direction: 'above', label: 'Deadlocks' },\n { metric: 'bufferPoolUsage', warning: 85, critical: 95, direction: 'above', label: 'Buffer Pool Usage' },\n];\n\nexport function evaluateThreshold(value: number, config: ThresholdConfig): ThresholdLevel {\n if (config.direction === 'above') {\n if (value >= config.critical) return 'critical';\n if (value >= config.warning) return 'warning';\n return 'healthy';\n } else {\n if (value <= config.critical) return 'critical';\n if (value <= config.warning) return 'warning';\n return 'healthy';\n }\n}\n\nexport function getThresholdColor(level: ThresholdLevel): string {\n switch (level) {\n case 'critical': return 'border-red-500/50';\n case 'warning': return 'border-yellow-500/50';\n case 'healthy': return 'border-green-500/30';\n }\n}\n\nexport function getThresholdBadgeVariant(level: ThresholdLevel): 'destructive' | 'outline' | 'secondary' {\n switch (level) {\n case 'critical': return 'destructive';\n case 'warning': return 'outline';\n case 'healthy': return 'secondary';\n }\n}\n","/**\n * Pure localStorage CRUD operations.\n * All reads/writes go through these functions.\n * No event dispatching — that's the facade's responsibility.\n */\n\nimport { logger } from '@/lib/logger';\n\nconst KEY_PREFIX = 'libredb_';\n\n/** Map collection names to localStorage keys */\nconst COLLECTION_KEYS: Record<string, string> = {\n connections: `${KEY_PREFIX}connections`,\n history: `${KEY_PREFIX}history`,\n saved_queries: `${KEY_PREFIX}saved_queries`,\n schema_snapshots: `${KEY_PREFIX}schema_snapshots`,\n saved_charts: `${KEY_PREFIX}saved_charts`,\n active_connection_id: `${KEY_PREFIX}active_connection_id`,\n audit_log: `${KEY_PREFIX}audit_log`,\n masking_config: `${KEY_PREFIX}masking_config`,\n threshold_config: `${KEY_PREFIX}threshold_config`,\n};\n\nfunction isClient(): boolean {\n return typeof window !== 'undefined';\n}\n\nexport function getKey(collection: string): string {\n return COLLECTION_KEYS[collection] || `${KEY_PREFIX}${collection}`;\n}\n\n/**\n * Read raw JSON from localStorage.\n * Returns null if not found or parse fails.\n */\nexport function readJSON<T>(collection: string): T | null {\n if (!isClient()) return null;\n try {\n const key = getKey(collection);\n const raw = localStorage.getItem(key);\n if (raw === null) return null;\n return JSON.parse(raw) as T;\n } catch {\n logger.warn('Failed to parse JSON from localStorage', { key: getKey(collection) });\n return null;\n }\n}\n\n/**\n * Read raw string from localStorage.\n */\nexport function readString(collection: string): string | null {\n if (!isClient()) return null;\n return localStorage.getItem(getKey(collection));\n}\n\n/**\n * Write JSON to localStorage.\n * Returns true on success, false on failure (e.g. QuotaExceededError).\n */\nexport function writeJSON(collection: string, data: unknown): boolean {\n if (!isClient()) return false;\n try {\n localStorage.setItem(getKey(collection), JSON.stringify(data));\n return true;\n } catch (error) {\n logger.warn('Failed to write to localStorage', {\n key: getKey(collection),\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n}\n\n/**\n * Write raw string to localStorage.\n * Returns true on success, false on failure (e.g. QuotaExceededError).\n */\nexport function writeString(collection: string, value: string): boolean {\n if (!isClient()) return false;\n try {\n localStorage.setItem(getKey(collection), value);\n return true;\n } catch (error) {\n logger.warn('Failed to write to localStorage', {\n key: getKey(collection),\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n}\n\n/**\n * Remove a key from localStorage.\n */\nexport function remove(collection: string): void {\n if (!isClient()) return;\n localStorage.removeItem(getKey(collection));\n}\n","/**\n * Storage Facade — public API for all storage operations.\n * Maintains the same sync interface as the original storage.ts.\n * Dispatches CustomEvent on every mutation for the sync hook.\n */\n\nimport {\n DatabaseConnection,\n QueryHistoryItem,\n SavedQuery,\n SchemaSnapshot,\n SavedChartConfig,\n} from '../types';\nimport { type AuditEvent } from '../audit';\nimport { DEFAULT_MASKING_CONFIG, type MaskingConfig } from '../data-masking';\nimport { DEFAULT_THRESHOLDS, type ThresholdConfig } from '../monitoring-thresholds';\nimport { readJSON, writeJSON, readString, writeString, remove } from './local-storage';\nimport type { StorageCollection } from './types';\n\nconst MAX_HISTORY_ITEMS = 500;\nconst MAX_SNAPSHOTS = 50;\nconst MAX_AUDIT_EVENTS = 1000;\n\n/** Dispatch a custom event to notify the sync hook of a mutation */\nfunction dispatchChange(collection: StorageCollection, data: unknown): void {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(\n new CustomEvent('libredb-storage-change', {\n detail: { collection, data },\n })\n );\n}\n\n/** Revive Date fields from JSON-parsed objects */\nfunction reviveDates<T>(items: T[], ...dateFields: string[]): T[] {\n return items.map((item) => {\n const revived = { ...item } as Record<string, unknown>;\n for (const field of dateFields) {\n if (revived[field]) {\n revived[field] = new Date(revived[field] as string);\n }\n }\n return revived as unknown as T;\n });\n}\n\nexport const storage = {\n // ═══════════════════════════════════════════════════════════════════════════\n // Connections\n // ═══════════════════════════════════════════════════════════════════════════\n\n getConnections: (): DatabaseConnection[] => {\n const data = readJSON<DatabaseConnection[]>('connections');\n if (!data) return [];\n return reviveDates(data, 'createdAt');\n },\n\n saveConnection: (connection: DatabaseConnection) => {\n const connections = storage.getConnections();\n const existingIndex = connections.findIndex((c) => c.id === connection.id);\n\n if (existingIndex > -1) {\n connections[existingIndex] = connection;\n } else {\n connections.push(connection);\n }\n\n writeJSON('connections', connections);\n dispatchChange('connections', connections);\n },\n\n deleteConnection: (id: string) => {\n const connections = storage.getConnections();\n const filtered = connections.filter((c) => c.id !== id);\n writeJSON('connections', filtered);\n dispatchChange('connections', filtered);\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // History\n // ═══════════════════════════════════════════════════════════════════════════\n\n getHistory: (): QueryHistoryItem[] => {\n const data = readJSON<QueryHistoryItem[]>('history');\n if (!data) return [];\n return reviveDates(data, 'executedAt');\n },\n\n addToHistory: (item: QueryHistoryItem) => {\n const history = storage.getHistory();\n const newHistory = [item, ...history].slice(0, MAX_HISTORY_ITEMS);\n writeJSON('history', newHistory);\n dispatchChange('history', newHistory);\n },\n\n clearHistory: () => {\n writeJSON('history', []);\n dispatchChange('history', []);\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Saved Queries\n // ═══════════════════════════════════════════════════════════════════════════\n\n getSavedQueries: (): SavedQuery[] => {\n const data = readJSON<SavedQuery[]>('saved_queries');\n if (!data) return [];\n return reviveDates(data, 'createdAt', 'updatedAt');\n },\n\n saveQuery: (query: SavedQuery) => {\n const queries = storage.getSavedQueries();\n const existingIndex = queries.findIndex((q) => q.id === query.id);\n\n if (existingIndex > -1) {\n queries[existingIndex] = { ...query, updatedAt: new Date() };\n } else {\n queries.push({ ...query, createdAt: new Date(), updatedAt: new Date() });\n }\n\n writeJSON('saved_queries', queries);\n dispatchChange('saved_queries', queries);\n },\n\n deleteSavedQuery: (id: string) => {\n const queries = storage.getSavedQueries();\n const filtered = queries.filter((q) => q.id !== id);\n writeJSON('saved_queries', filtered);\n dispatchChange('saved_queries', filtered);\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Schema Snapshots\n // ═══════════════════════════════════════════════════════════════════════════\n\n getSchemaSnapshots: (connectionId?: string): SchemaSnapshot[] => {\n const data = readJSON<SchemaSnapshot[]>('schema_snapshots');\n if (!data) return [];\n const snapshots = reviveDates(data, 'createdAt');\n if (connectionId) {\n return snapshots.filter((s) => s.connectionId === connectionId);\n }\n return snapshots;\n },\n\n saveSchemaSnapshot: (snapshot: SchemaSnapshot) => {\n const snapshots = storage.getSchemaSnapshots();\n snapshots.push({ ...snapshot, createdAt: new Date() });\n const trimmed = snapshots.slice(-MAX_SNAPSHOTS);\n writeJSON('schema_snapshots', trimmed);\n dispatchChange('schema_snapshots', trimmed);\n },\n\n deleteSchemaSnapshot: (id: string) => {\n const snapshots = storage.getSchemaSnapshots();\n const filtered = snapshots.filter((s) => s.id !== id);\n writeJSON('schema_snapshots', filtered);\n dispatchChange('schema_snapshots', filtered);\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Saved Charts\n // ═══════════════════════════════════════════════════════════════════════════\n\n getSavedCharts: (): SavedChartConfig[] => {\n const data = readJSON<SavedChartConfig[]>('saved_charts');\n if (!data) return [];\n return reviveDates(data, 'createdAt');\n },\n\n saveChart: (chart: SavedChartConfig) => {\n const charts = storage.getSavedCharts();\n const existingIndex = charts.findIndex((c) => c.id === chart.id);\n if (existingIndex > -1) {\n charts[existingIndex] = chart;\n } else {\n charts.push({ ...chart, createdAt: new Date() });\n }\n writeJSON('saved_charts', charts);\n dispatchChange('saved_charts', charts);\n },\n\n deleteChart: (id: string) => {\n const charts = storage.getSavedCharts();\n const filtered = charts.filter((c) => c.id !== id);\n writeJSON('saved_charts', filtered);\n dispatchChange('saved_charts', filtered);\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Active Connection ID\n // ═══════════════════════════════════════════════════════════════════════════\n\n getActiveConnectionId: (): string | null => {\n return readString('active_connection_id');\n },\n\n setActiveConnectionId: (id: string | null) => {\n if (typeof window === 'undefined') return;\n if (id) {\n writeString('active_connection_id', id);\n } else {\n remove('active_connection_id');\n }\n dispatchChange('active_connection_id', id);\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Audit Log (consolidated from audit.ts)\n // ═══════════════════════════════════════════════════════════════════════════\n\n getAuditLog: (): AuditEvent[] => {\n const data = readJSON<AuditEvent[]>('audit_log');\n return data ?? [];\n },\n\n saveAuditLog: (events: AuditEvent[]) => {\n const trimmed = events.slice(-MAX_AUDIT_EVENTS);\n writeJSON('audit_log', trimmed);\n dispatchChange('audit_log', trimmed);\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Masking Config (consolidated from data-masking.ts)\n // ═══════════════════════════════════════════════════════════════════════════\n\n getMaskingConfig: (): MaskingConfig => {\n const data = readJSON<MaskingConfig>('masking_config');\n if (!data) return DEFAULT_MASKING_CONFIG;\n\n // Merge with defaults to ensure new builtin patterns are included\n const builtinIds = new Set(\n DEFAULT_MASKING_CONFIG.patterns.filter((p) => p.isBuiltin).map((p) => p.id)\n );\n const storedIds = new Set(data.patterns.map((p) => p.id));\n\n for (const defaultPattern of DEFAULT_MASKING_CONFIG.patterns) {\n if (defaultPattern.isBuiltin && !storedIds.has(defaultPattern.id)) {\n data.patterns.push(defaultPattern);\n }\n }\n\n if (!data.roleSettings) {\n data.roleSettings = DEFAULT_MASKING_CONFIG.roleSettings;\n }\n\n data.patterns = data.patterns.filter(\n (p) => !p.isBuiltin || builtinIds.has(p.id) || !p.id.startsWith('builtin-')\n );\n\n return data;\n },\n\n saveMaskingConfig: (config: MaskingConfig) => {\n writeJSON('masking_config', config);\n dispatchChange('masking_config', config);\n },\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Threshold Config (consolidated from SecurityTab.tsx)\n // ═══════════════════════════════════════════════════════════════════════════\n\n getThresholdConfig: (): ThresholdConfig[] => {\n const data = readJSON<ThresholdConfig[]>('threshold_config');\n return data ?? DEFAULT_THRESHOLDS;\n },\n\n saveThresholdConfig: (thresholds: ThresholdConfig[]) => {\n writeJSON('threshold_config', thresholds);\n dispatchChange('threshold_config', thresholds);\n },\n};\n","/**\n * Data Masking Utility\n * Auto-detects sensitive columns by name patterns and masks their values.\n * Supports configurable patterns, RBAC, per-cell reveal, and persistence.\n */\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type MaskType = 'email' | 'phone' | 'card' | 'ssn' | 'full' | 'partial' | 'ip' | 'date' | 'financial' | 'custom';\n\nexport interface MaskingPattern {\n id: string;\n name: string;\n columnPatterns: string[]; // regex strings (user-editable)\n maskType: MaskType;\n enabled: boolean;\n isBuiltin: boolean; // builtin patterns cannot be deleted, only disabled\n customMask?: string; // used when maskType === 'custom'\n}\n\nexport interface MaskingConfig {\n enabled: boolean; // global masking on/off\n patterns: MaskingPattern[];\n roleSettings: {\n admin: { canToggle: boolean; canReveal: boolean };\n user: { canToggle: boolean; canReveal: boolean };\n };\n}\n\n/** Legacy interface kept for backward compat (DataProfiler uses it) */\nexport interface MaskingRule {\n pattern: RegExp;\n label: string;\n mask: (value: string) => string;\n}\n\n// ─── Built-in Masking Rules (legacy, used by detectSensitiveColumns) ─────────\n\nconst MASKING_RULES: MaskingRule[] = [\n {\n pattern: /^(email|e_mail|user_email|customer_email|contact_email)$/i,\n label: 'Email',\n mask: (v) => {\n const parts = v.split('@');\n if (parts.length !== 2) return '***@***.***';\n const name = parts[0];\n const domain = parts[1];\n return `${name[0]}${'*'.repeat(Math.max(name.length - 1, 2))}@${domain[0]}${'*'.repeat(Math.max(domain.length - 1, 2))}`;\n },\n },\n {\n pattern: /^(password|passwd|pass|pwd|secret|user_password|hashed_password|password_hash|hash)$/i,\n label: 'Password',\n mask: () => '********',\n },\n {\n pattern: /^(ssn|social_security|social_security_number|national_id|national_number)$/i,\n label: 'SSN',\n mask: (v) => `***-**-${v.slice(-4).padStart(4, '*')}`,\n },\n {\n pattern: /^(credit_card|card_number|cc_number|card_num|pan|credit_card_number)$/i,\n label: 'Credit Card',\n mask: (v) => `****-****-****-${v.replace(/\\D/g, '').slice(-4).padStart(4, '*')}`,\n },\n {\n pattern: /^(phone|phone_number|mobile|cell|telephone|tel|contact_phone)$/i,\n label: 'Phone',\n mask: (v) => {\n const digits = v.replace(/\\D/g, '');\n if (digits.length < 4) return '***';\n return `${'*'.repeat(digits.length - 4)}${digits.slice(-4)}`;\n },\n },\n {\n pattern: /^(token|access_token|refresh_token|api_key|apikey|api_secret|secret_key|auth_token|bearer_token|session_token)$/i,\n label: 'Token/Key',\n mask: (v) => `${v.slice(0, 4)}${'*'.repeat(Math.max(v.length - 8, 4))}${v.slice(-4)}`,\n },\n {\n pattern: /^(address|street|street_address|home_address|billing_address|shipping_address)$/i,\n label: 'Address',\n mask: () => '*** **** ***',\n },\n {\n pattern: /^(ip|ip_address|client_ip|remote_ip|source_ip)$/i,\n label: 'IP Address',\n mask: (v) => {\n const parts = v.split('.');\n if (parts.length === 4) return `${parts[0]}.***.***.${parts[3]}`;\n return '***';\n },\n },\n {\n pattern: /^(salary|income|balance|amount|wage|compensation|net_pay|gross_pay|revenue)$/i,\n label: 'Financial',\n mask: () => '***,***.**',\n },\n {\n pattern: /^(birth|dob|date_of_birth|birthdate|birth_date|birthday)$/i,\n label: 'Birthdate',\n mask: (v) => {\n if (v.length >= 4) return `****-**-${v.slice(-2)}`;\n return '****-**-**';\n },\n },\n];\n\n// ─── Default Masking Config ──────────────────────────────────────────────────\n\nexport const DEFAULT_MASKING_CONFIG: MaskingConfig = {\n enabled: true,\n patterns: [\n {\n id: 'builtin-email',\n name: 'Email',\n columnPatterns: ['email', 'e_mail', 'user_email', 'customer_email', 'contact_email'],\n maskType: 'email',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-password',\n name: 'Password',\n columnPatterns: ['password', 'passwd', 'pass', 'pwd', 'secret', 'user_password', 'hashed_password', 'password_hash', 'hash'],\n maskType: 'full',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-ssn',\n name: 'SSN',\n columnPatterns: ['ssn', 'social_security', 'social_security_number', 'national_id', 'national_number'],\n maskType: 'ssn',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-card',\n name: 'Credit Card',\n columnPatterns: ['credit_card', 'card_number', 'cc_number', 'card_num', 'pan', 'credit_card_number'],\n maskType: 'card',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-phone',\n name: 'Phone',\n columnPatterns: ['phone', 'phone_number', 'mobile', 'cell', 'telephone', 'tel', 'contact_phone'],\n maskType: 'phone',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-token',\n name: 'Token/Key',\n columnPatterns: ['token', 'access_token', 'refresh_token', 'api_key', 'apikey', 'api_secret', 'secret_key', 'auth_token', 'bearer_token', 'session_token'],\n maskType: 'partial',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-address',\n name: 'Address',\n columnPatterns: ['address', 'street', 'street_address', 'home_address', 'billing_address', 'shipping_address'],\n maskType: 'full',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-ip',\n name: 'IP Address',\n columnPatterns: ['ip', 'ip_address', 'client_ip', 'remote_ip', 'source_ip'],\n maskType: 'ip',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-financial',\n name: 'Financial',\n columnPatterns: ['salary', 'income', 'balance', 'amount', 'wage', 'compensation', 'net_pay', 'gross_pay', 'revenue'],\n maskType: 'financial',\n enabled: true,\n isBuiltin: true,\n },\n {\n id: 'builtin-birthdate',\n name: 'Birthdate',\n columnPatterns: ['birth', 'dob', 'date_of_birth', 'birthdate', 'birth_date', 'birthday'],\n maskType: 'date',\n enabled: true,\n isBuiltin: true,\n },\n ],\n roleSettings: {\n admin: { canToggle: true, canReveal: true },\n user: { canToggle: false, canReveal: false },\n },\n};\n\n// ─── MaskType-based Masking Functions ────────────────────────────────────────\n\nconst MASK_FUNCTIONS: Record<MaskType, (value: string, customMask?: string) => string> = {\n email: (v) => {\n const parts = v.split('@');\n if (parts.length !== 2) return '***@***.***';\n const name = parts[0];\n const domain = parts[1];\n return `${name[0]}${'*'.repeat(Math.max(name.length - 1, 2))}@${domain[0]}${'*'.repeat(Math.max(domain.length - 1, 2))}`;\n },\n phone: (v) => {\n const digits = v.replace(/\\D/g, '');\n if (digits.length < 4) return '***';\n return `${'*'.repeat(digits.length - 4)}${digits.slice(-4)}`;\n },\n card: (v) => `****-****-****-${v.replace(/\\D/g, '').slice(-4).padStart(4, '*')}`,\n ssn: (v) => `***-**-${v.slice(-4).padStart(4, '*')}`,\n full: () => '********',\n partial: (v) => {\n if (v.length <= 8) return '*'.repeat(v.length);\n return `${v.slice(0, 4)}${'*'.repeat(Math.max(v.length - 8, 4))}${v.slice(-4)}`;\n },\n ip: (v) => {\n const parts = v.split('.');\n if (parts.length === 4) return `${parts[0]}.***.***.${parts[3]}`;\n return '***';\n },\n date: (v) => {\n if (v.length >= 4) return `****-**-${v.slice(-2)}`;\n return '****-**-**';\n },\n financial: () => '***,***.**',\n custom: (_v, customMask) => customMask || '***',\n};\n\n// ─── Mask by MaskingPattern ──────────────────────────────────────────────────\n\nexport function maskByType(value: string, pattern: MaskingPattern): string {\n const fn = MASK_FUNCTIONS[pattern.maskType];\n return fn(value, pattern.customMask);\n}\n\n// ─── Config-based Detection ──────────────────────────────────────────────────\n\nexport function detectSensitiveColumnsFromConfig(\n fields: string[],\n config: MaskingConfig\n): Map<string, MaskingPattern> {\n const sensitiveMap = new Map<string, MaskingPattern>();\n\n const enabledPatterns = config.patterns.filter(p => p.enabled);\n\n for (const field of fields) {\n for (const pattern of enabledPatterns) {\n const matched = pattern.columnPatterns.some(cp => {\n try {\n return new RegExp(`^${cp}$`, 'i').test(field);\n } catch {\n return cp.toLowerCase() === field.toLowerCase();\n }\n });\n if (matched) {\n sensitiveMap.set(field, pattern);\n break;\n }\n }\n }\n\n return sensitiveMap;\n}\n\n// ─── Legacy Detection (backward compat — DataProfiler) ──────────────────────\n\nexport function detectSensitiveColumns(fields: string[]): Map<string, MaskingRule> {\n const sensitiveMap = new Map<string, MaskingRule>();\n\n for (const field of fields) {\n for (const rule of MASKING_RULES) {\n if (rule.pattern.test(field)) {\n sensitiveMap.set(field, rule);\n break;\n }\n }\n }\n\n return sensitiveMap;\n}\n\n// ─── Mask Value Helpers ──────────────────────────────────────────────────────\n\nexport function maskValue(value: unknown, rule: MaskingRule): string {\n if (value === null || value === undefined) return 'NULL';\n return rule.mask(String(value));\n}\n\nexport function maskValueByPattern(value: unknown, pattern: MaskingPattern): string {\n if (value === null || value === undefined) return 'NULL';\n return maskByType(String(value), pattern);\n}\n\n// ─── Has Sensitive Columns ───────────────────────────────────────────────────\n\nexport function hasSensitiveColumns(fields: string[]): boolean {\n return fields.some(field =>\n MASKING_RULES.some(rule => rule.pattern.test(field))\n );\n}\n\n// ─── Bulk Masking Utility ────────────────────────────────────────────────────\n\nexport function applyMaskingToRows(\n rows: Record<string, unknown>[],\n fields: string[],\n sensitiveColumns: Map<string, MaskingPattern>\n): Record<string, unknown>[] {\n if (sensitiveColumns.size === 0) return rows;\n\n return rows.map(row => {\n const maskedRow: Record<string, unknown> = { ...row };\n for (const field of fields) {\n const pattern = sensitiveColumns.get(field);\n if (pattern && maskedRow[field] !== null && maskedRow[field] !== undefined) {\n maskedRow[field] = maskByType(String(maskedRow[field]), pattern);\n }\n }\n return maskedRow;\n });\n}\n\n// ─── RBAC Helpers ────────────────────────────────────────────────────────────\n\nexport function shouldMask(role: string | undefined, config: MaskingConfig): boolean {\n if (!role || role === 'user') {\n // User role: if canToggle is false, masking is always enforced\n if (!config.roleSettings.user.canToggle) return true;\n return config.enabled;\n }\n // Admin: respects config.enabled\n return config.enabled;\n}\n\nexport function canToggleMasking(role: string | undefined, config: MaskingConfig): boolean {\n if (!role || role === 'user') return config.roleSettings.user.canToggle;\n return config.roleSettings.admin.canToggle;\n}\n\nexport function canReveal(role: string | undefined, config: MaskingConfig): boolean {\n if (!role || role === 'user') return config.roleSettings.user.canReveal;\n return config.roleSettings.admin.canReveal;\n}\n\n// ─── Config Persistence ──────────────────────────────────────────────────────\n\nimport { storage } from '@/lib/storage';\n\nexport const MASKING_CONFIG_KEY = 'libredb_masking_config';\n\nexport function loadMaskingConfig(): MaskingConfig {\n return storage.getMaskingConfig();\n}\n\nexport function saveMaskingConfig(config: MaskingConfig): void {\n storage.saveMaskingConfig(config);\n}\n\n// ─── Preview Samples ─────────────────────────────────────────────────────────\n\nexport const MASK_TYPE_PREVIEWS: Record<MaskType, { sample: string; label: string }> = {\n email: { sample: 'john.doe@example.com', label: 'Email' },\n phone: { sample: '+1-555-123-4545', label: 'Phone' },\n card: { sample: '4111111111111234', label: 'Credit Card' },\n ssn: { sample: '123-45-6789', label: 'SSN' },\n full: { sample: 'secret_value', label: 'Full Mask' },\n partial: { sample: 'sk-proj-abc123xyz789', label: 'Partial' },\n ip: { sample: '192.168.1.100', label: 'IP Address' },\n date: { sample: '1990-05-15', label: 'Date' },\n financial: { sample: '85000.00', label: 'Financial' },\n custom: { sample: 'any_value', label: 'Custom' },\n};\n\nexport function getPreviewMasked(maskType: MaskType, customMask?: string): string {\n const preview = MASK_TYPE_PREVIEWS[maskType];\n const fn = MASK_FUNCTIONS[maskType];\n return fn(preview.sample, customMask);\n}\n","// Format cell value for display\nexport function formatCellValue(value: unknown): { display: string; className: string } {\n if (value === null || value === undefined) {\n return { display: 'NULL', className: 'text-zinc-600 italic' };\n }\n if (typeof value === 'object') {\n return { display: JSON.stringify(value), className: 'text-blue-400/80 italic font-light' };\n }\n if (typeof value === 'number') {\n return { display: String(value), className: 'text-amber-500/90 font-medium' };\n }\n if (typeof value === 'boolean') {\n return { display: String(value), className: value ? 'text-emerald-500/90' : 'text-rose-500/90' };\n }\n const strVal = String(value).toLowerCase();\n if (strVal === 'true' || strVal === 'active' || strVal === 'enabled') {\n return { display: String(value), className: 'text-emerald-500/90' };\n }\n if (strVal === 'false' || strVal === 'inactive' || strVal === 'disabled') {\n return { display: String(value), className: 'text-rose-500/90' };\n }\n return { display: String(value), className: 'text-zinc-300' };\n}\n","\"use client\";\n\nimport React, { useMemo } from 'react';\nimport { cn } from '@/lib/utils';\nimport {\n Hash,\n ChevronRight,\n Lock,\n} from 'lucide-react';\nimport {\n type MaskingPattern,\n maskValueByPattern,\n} from '@/lib/data-masking';\nimport { formatCellValue } from './utils';\n\nexport interface ResultCardProps {\n row: Record<string, unknown>;\n fields: string[];\n primaryColumn: string;\n idColumn: string | null;\n index: number;\n onSelect: () => void;\n maskingActive?: boolean;\n sensitiveColumns?: Map<string, MaskingPattern>;\n}\n\nexport function ResultCard({\n row,\n fields,\n primaryColumn,\n idColumn,\n index,\n onSelect,\n maskingActive,\n sensitiveColumns,\n}: ResultCardProps) {\n const primaryValue: unknown = row[primaryColumn];\n const idValue: unknown = idColumn ? row[idColumn] : null;\n\n // Mask primary value if sensitive\n const displayPrimary = useMemo(() => {\n if (maskingActive && sensitiveColumns?.has(primaryColumn) && primaryValue != null) {\n return maskValueByPattern(primaryValue, sensitiveColumns.get(primaryColumn)!);\n }\n return primaryValue != null ? String(primaryValue) : `Row ${index + 1}`;\n }, [maskingActive, sensitiveColumns, primaryColumn, primaryValue, index]);\n\n // Show first 4 fields (excluding primary and id)\n const previewFields = fields\n .filter(f => f !== primaryColumn && f !== idColumn)\n .slice(0, 4);\n\n return (\n <div\n onClick={onSelect}\n className=\"bg-[#0d0d0d] border border-white/5 rounded-xl p-4 active:scale-[0.98] transition-all cursor-pointer hover:border-white/10 hover:bg-[#111]\"\n >\n {/* Header: Primary value + ID */}\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <div className=\"w-8 h-8 rounded-lg bg-blue-500/10 flex items-center justify-center shrink-0\">\n <Hash strokeWidth={1.5} className=\"w-3.5 h-3.5 text-blue-400\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className={cn(\n \"text-xs font-medium truncate\",\n maskingActive && sensitiveColumns?.has(primaryColumn) ? \"text-zinc-500 italic\" : \"text-zinc-100\"\n )}>\n {displayPrimary}\n </p>\n {idValue != null && (\n <p className=\"text-xs text-zinc-500 font-mono\">#{String(idValue)}</p>\n )}\n </div>\n </div>\n <ChevronRight strokeWidth={1.5} className=\"w-3.5 h-3.5 text-zinc-600\" />\n </div>\n\n {/* Preview Fields */}\n <div className=\"space-y-2\">\n {previewFields.map(field => {\n const pattern = sensitiveColumns?.get(field);\n const isMasked = maskingActive && pattern && row[field] != null && row[field] !== undefined;\n const displayValue = isMasked\n ? maskValueByPattern(row[field], pattern)\n : formatCellValue(row[field]).display;\n const className = isMasked\n ? 'text-zinc-500 italic'\n : formatCellValue(row[field]).className;\n\n return (\n <div key={field} className=\"flex items-center justify-between text-xs\">\n <span className=\"text-zinc-500 truncate mr-2\">\n {field}\n {isMasked && <Lock strokeWidth={1.5} className=\"w-2.5 h-2.5 inline ml-1 text-purple-400\" />}\n </span>\n <span className={cn(\"truncate max-w-[60%] text-right font-mono\", className)}>\n {displayValue}\n </span>\n </div>\n );\n })}\n {fields.length > previewFields.length + 2 && (\n <p className=\"text-xs text-zinc-600 text-center pt-1\">\n +{fields.length - previewFields.length - 2} more fields\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","\"use client\";\n\nimport React, { useState, useCallback } from 'react';\nimport { cn } from '@/lib/utils';\nimport {\n Copy,\n FileJson,\n Check,\n Eye,\n Lock,\n} from 'lucide-react';\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n} from \"@/components/ui/sheet\";\nimport { Button } from '@/components/ui/button';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport {\n type MaskingPattern,\n maskValueByPattern,\n} from '@/lib/data-masking';\nimport { formatCellValue } from './utils';\n\nexport interface RowDetailSheetProps {\n row: Record<string, unknown>;\n fields: string[];\n isOpen: boolean;\n onClose: () => void;\n rowIndex: number;\n maskingActive?: boolean;\n sensitiveColumns?: Map<string, MaskingPattern>;\n allowReveal?: boolean;\n}\n\nexport function RowDetailSheet({\n row,\n fields,\n isOpen,\n onClose,\n rowIndex,\n maskingActive,\n sensitiveColumns,\n allowReveal,\n}: RowDetailSheetProps) {\n const [copiedField, setCopiedField] = useState<string | null>(null);\n const [revealedFields, setRevealedFields] = useState<Set<string>>(new Set());\n\n // Auto-hide revealed fields after 10s\n const revealField = useCallback((field: string) => {\n setRevealedFields(prev => new Set(prev).add(field));\n setTimeout(() => {\n setRevealedFields(prev => {\n const next = new Set(prev);\n next.delete(field);\n return next;\n });\n }, 10000);\n }, []);\n\n const getDisplayValue = useCallback((field: string, value: unknown): { text: string; isMasked: boolean } => {\n const pattern = sensitiveColumns?.get(field);\n if (maskingActive && pattern && value != null && value !== undefined && !revealedFields.has(field)) {\n return { text: maskValueByPattern(value, pattern), isMasked: true };\n }\n return { text: typeof value === 'object' ? JSON.stringify(value) : String(value ?? 'NULL'), isMasked: false };\n }, [maskingActive, sensitiveColumns, revealedFields]);\n\n const copyValue = (field: string, value: unknown) => {\n const { text } = getDisplayValue(field, value);\n navigator.clipboard.writeText(text);\n setCopiedField(field);\n setTimeout(() => setCopiedField(null), 1500);\n };\n\n const copyAllAsJson = () => {\n // If masking is active, copy masked version\n if (maskingActive && sensitiveColumns && sensitiveColumns.size > 0) {\n const maskedRow: Record<string, unknown> = {};\n for (const field of fields) {\n const { text } = getDisplayValue(field, row[field]);\n maskedRow[field] = text;\n }\n navigator.clipboard.writeText(JSON.stringify(maskedRow, null, 2));\n } else {\n navigator.clipboard.writeText(JSON.stringify(row, null, 2));\n }\n setCopiedField('__all__');\n setTimeout(() => setCopiedField(null), 1500);\n };\n\n return (\n <Sheet open={isOpen} onOpenChange={onClose}>\n <SheetContent side=\"bottom\" className=\"h-[85vh] bg-[#0a0a0a] border-t border-white/10 rounded-t-3xl\">\n <SheetHeader className=\"pb-4 border-b border-white/5\">\n <div className=\"flex items-center justify-between\">\n <SheetTitle className=\"text-zinc-100 flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-blue-500/10 flex items-center justify-center\">\n <FileJson strokeWidth={1.5} className=\"w-3.5 h-3.5 text-blue-400\" />\n </div>\n Row #{rowIndex + 1}\n </SheetTitle>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 text-xs border-white/10 hover:bg-white/5\"\n onClick={copyAllAsJson}\n >\n {copiedField === '__all__' ? (\n <><Check strokeWidth={1.5} className=\"w-3 h-3 mr-1 text-emerald-400\" /> Copied</>\n ) : (\n <><Copy strokeWidth={1.5} className=\"w-3 h-3 mr-1\" /> Copy JSON</>\n )}\n </Button>\n </div>\n </SheetHeader>\n\n <ScrollArea className=\"h-[calc(85vh-100px)] mt-4\">\n <div className=\"space-y-1 pr-4\">\n {fields.map(field => {\n const { text, isMasked } = getDisplayValue(field, row[field]);\n const isLongValue = text.length > 50;\n\n return (\n <div\n key={field}\n className=\"group p-3 rounded-lg hover:bg-white/5 transition-colors\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-zinc-500 mb-1 font-mono flex items-center gap-1\">\n {field}\n {isMasked && <Lock strokeWidth={1.5} className=\"w-2.5 h-2.5 text-purple-400\" />}\n </p>\n <p className={cn(\n \"font-mono text-xs break-all\",\n isMasked ? \"text-zinc-500 italic\" : formatCellValue(row[field]).className,\n isLongValue && \"text-xs\"\n )}>\n {text}\n </p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {isMasked && allowReveal && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={() => revealField(field)}\n title=\"Reveal value (10s)\"\n >\n <Eye className=\"w-3.5 h-3.5 text-purple-400\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={() => copyValue(field, row[field])}\n >\n {copiedField === field ? (\n <Check strokeWidth={1.5} className=\"w-3.5 h-3.5 text-emerald-400\" />\n ) : (\n <Copy strokeWidth={1.5} className=\"w-3.5 h-3.5 text-zinc-500\" />\n )}\n </Button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </ScrollArea>\n </SheetContent>\n </Sheet>\n );\n}\n","\"use client\";\n\nimport React from 'react';\nimport { QueryResult } from '@/lib/types';\nimport { cn } from '@/lib/utils';\nimport {\n ChevronDown,\n LayoutGrid,\n Table2,\n Loader2,\n EyeOff,\n Eye,\n Save,\n X,\n Filter,\n Lock,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport type { CellChange } from '@/components/ResultsGrid';\n\nexport interface StatsBarProps {\n result: QueryResult;\n filteredRowCount: number;\n activeFilterCount: number;\n onClearFilters: () => void;\n viewMode: 'card' | 'table';\n onSetViewMode: (mode: 'card' | 'table') => void;\n // Masking props\n hasSensitive: boolean;\n effectiveMaskingEnabled: boolean;\n userCanToggle: boolean;\n onToggleMasking?: () => void;\n // Editing props\n editingEnabled?: boolean;\n pendingChanges?: CellChange[];\n onApplyChanges?: () => void;\n onDiscardChanges?: () => void;\n // Load more props\n onLoadMore?: () => void;\n isLoadingMore?: boolean;\n}\n\nexport function StatsBar({\n result,\n filteredRowCount,\n activeFilterCount,\n onClearFilters,\n viewMode,\n onSetViewMode,\n hasSensitive,\n effectiveMaskingEnabled,\n userCanToggle,\n onToggleMasking,\n editingEnabled,\n pendingChanges,\n onApplyChanges,\n onDiscardChanges,\n}: StatsBarProps) {\n return (\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-white/5 bg-[#0a0a0a] text-xs text-zinc-500 font-mono\">\n <div className=\"flex items-center gap-4\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-500/50\" />\n {result.rows.length} rows\n {result.pagination?.hasMore && (\n <span className=\"text-amber-400 ml-1\">(more available)</span>\n )}\n </span>\n <span className=\"hidden sm:inline\">{result.fields.length} columns</span>\n {activeFilterCount > 0 && (\n <button\n className=\"flex items-center gap-1 text-blue-400 text-xs bg-blue-500/10 px-2 py-0.5 rounded hover:bg-blue-500/20 transition-colors\"\n onClick={onClearFilters}\n title=\"Clear all filters\"\n >\n <Filter strokeWidth={1.5} className=\"w-3 h-3\" />\n {activeFilterCount} filter{activeFilterCount > 1 ? 's' : ''} • {filteredRowCount} shown\n <X strokeWidth={1.5} className=\"w-3 h-3\" />\n </button>\n )}\n {result.pagination?.wasLimited && (\n <span className=\"text-blue-400 text-xs bg-blue-500/10 px-2 py-0.5 rounded\">\n AUTO-LIMITED\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Data Masking Toggle */}\n {hasSensitive && (\n userCanToggle && onToggleMasking ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"h-6 px-2 text-xs font-medium gap-1\",\n effectiveMaskingEnabled ? \"text-purple-400 bg-purple-500/10\" : \"text-zinc-500\"\n )}\n onClick={onToggleMasking}\n title={effectiveMaskingEnabled ? 'Show sensitive data' : 'Mask sensitive data'}\n >\n {effectiveMaskingEnabled ? <EyeOff className=\"w-3 h-3\" /> : <Eye className=\"w-3 h-3\" />}\n {effectiveMaskingEnabled ? 'MASKED' : 'MASK'}\n </Button>\n ) : effectiveMaskingEnabled ? (\n <span className=\"h-6 px-2 text-xs font-medium text-purple-400 bg-purple-500/10 rounded flex items-center gap-1\">\n <Lock strokeWidth={1.5} className=\"w-3 h-3\" />\n MASKED\n </span>\n ) : null\n )}\n\n {/* Pending Changes Indicator */}\n {editingEnabled && pendingChanges && pendingChanges.length > 0 && (\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-amber-400 bg-amber-500/10 px-1.5 py-0.5 rounded\">\n {pendingChanges.length} change{pendingChanges.length > 1 ? 's' : ''}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-1.5 text-xs text-emerald-400 hover:bg-emerald-500/10\"\n onClick={onApplyChanges}\n >\n <Save strokeWidth={1.5} className=\"w-3 h-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-1.5 text-xs text-red-400 hover:bg-red-500/10\"\n onClick={onDiscardChanges}\n >\n <X strokeWidth={1.5} className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Execution Time - Hidden on mobile */}\n <span className=\"hidden sm:flex px-2 py-0.5 rounded bg-white/5 border border-white/5\">\n EXEC TIME: {result.executionTime || '0ms'}\n </span>\n\n {/* View Toggle - Mobile only */}\n <div className=\"flex md:hidden items-center bg-white/5 rounded-lg p-0.5\">\n <button\n onClick={() => onSetViewMode('card')}\n className={cn(\n \"p-1.5 rounded transition-all\",\n viewMode === 'card' ? \"bg-blue-600 text-white\" : \"text-zinc-500\"\n )}\n >\n <LayoutGrid strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n <button\n onClick={() => onSetViewMode('table')}\n className={cn(\n \"p-1.5 rounded transition-all\",\n viewMode === 'table' ? \"bg-blue-600 text-white\" : \"text-zinc-500\"\n )}\n >\n <Table2 strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport interface LoadMoreFooterProps {\n hasMore: boolean;\n onLoadMore: () => void;\n isLoadingMore?: boolean;\n}\n\nexport function LoadMoreFooter({ hasMore, onLoadMore, isLoadingMore }: LoadMoreFooterProps) {\n if (!hasMore) return null;\n\n return (\n <div className=\"flex items-center justify-center py-3 border-t border-white/5 bg-[#0a0a0a]\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onLoadMore}\n disabled={isLoadingMore}\n className=\"h-8 px-4 text-xs border-white/10 hover:bg-white/5\"\n >\n {isLoadingMore ? (\n <>\n <Loader2 strokeWidth={1.5} className=\"w-3 h-3 mr-2 animate-spin\" />\n Loading...\n </>\n ) : (\n <>\n <ChevronDown strokeWidth={1.5} className=\"w-3 h-3 mr-2\" />\n Load More (500 rows)\n </>\n )}\n </Button>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState, useRef, useCallback, useEffect } from 'react';\nimport { QueryResult } from '@/lib/types';\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n getSortedRowModel,\n SortingState,\n ColumnDef,\n} from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { cn } from '@/lib/utils';\nimport {\n ArrowUpDown,\n ArrowUp,\n ArrowDown,\n Eye,\n Filter,\n Lock,\n} from 'lucide-react';\nimport {\n type MaskingConfig,\n detectSensitiveColumnsFromConfig,\n maskValueByPattern,\n shouldMask,\n canToggleMasking,\n canReveal,\n loadMaskingConfig,\n} from '@/lib/data-masking';\nimport { ResultCard } from '@/components/results-grid/ResultCard';\nimport { RowDetailSheet } from '@/components/results-grid/RowDetailSheet';\nimport { StatsBar, LoadMoreFooter } from '@/components/results-grid/StatsBar';\nimport { formatCellValue } from '@/components/results-grid/utils';\n\nexport interface CellChange {\n rowIndex: number;\n columnId: string;\n originalValue: unknown;\n newValue: string;\n}\n\ninterface ResultsGridProps {\n result: QueryResult;\n onLoadMore?: () => void;\n isLoadingMore?: boolean;\n maskingEnabled?: boolean;\n onToggleMasking?: () => void;\n userRole?: string;\n maskingConfig?: MaskingConfig;\n // Inline editing props\n editingEnabled?: boolean;\n pendingChanges?: CellChange[];\n onCellChange?: (change: CellChange) => void;\n onDiscardChanges?: () => void;\n onApplyChanges?: () => void;\n}\n\n// Detect primary column (first text-like column that's not an ID)\nfunction detectPrimaryColumn(fields: string[], rows: Record<string, unknown>[]): string {\n const preferredNames = ['name', 'title', 'label', 'username', 'email', 'description'];\n\n for (const name of preferredNames) {\n if (fields.some(f => f.toLowerCase().includes(name))) {\n return fields.find(f => f.toLowerCase().includes(name))!;\n }\n }\n\n // Find first string column that's not an ID\n if (rows.length > 0) {\n for (const field of fields) {\n const value = rows[0][field];\n if (typeof value === 'string' && !field.toLowerCase().includes('id')) {\n return field;\n }\n }\n }\n\n return fields[0];\n}\n\n// Get ID column if exists\nfunction detectIdColumn(fields: string[]): string | null {\n return fields.find(f => f.toLowerCase() === 'id' || f.toLowerCase().endsWith('_id')) || null;\n}\n\nexport function ResultsGrid({\n result,\n onLoadMore,\n isLoadingMore,\n maskingEnabled,\n onToggleMasking,\n userRole,\n maskingConfig,\n editingEnabled,\n pendingChanges,\n onCellChange,\n onDiscardChanges,\n onApplyChanges,\n}: ResultsGridProps) {\n const [sorting, setSorting] = useState<SortingState>([]);\n const [editingCell, setEditingCell] = useState<{ rowIndex: number, columnId: string } | null>(null);\n const [editValue, setEditValue] = useState<string>(\"\");\n const [viewMode, setViewMode] = useState<'card' | 'table'>('card');\n const [selectedRow, setSelectedRow] = useState<{ row: Record<string, unknown>; index: number } | null>(null);\n const [columnFilters, setColumnFilters] = useState<Map<string, string>>(new Map());\n const [activeFilterCol, setActiveFilterCol] = useState<string | null>(null);\n const [revealedCells, setRevealedCells] = useState<Set<string>>(new Set());\n\n // Resolve config\n const resolvedConfig = useMemo(() => maskingConfig ?? loadMaskingConfig(), [maskingConfig]);\n\n // Effective masking state (RBAC-aware)\n const effectiveMaskingEnabled = useMemo(() => {\n return shouldMask(userRole, resolvedConfig) && (maskingEnabled ?? resolvedConfig.enabled);\n }, [userRole, resolvedConfig, maskingEnabled]);\n\n const userCanToggle = useMemo(() => canToggleMasking(userRole, resolvedConfig), [userRole, resolvedConfig]);\n const userCanReveal = useMemo(() => canReveal(userRole, resolvedConfig), [userRole, resolvedConfig]);\n\n // Config-based sensitive column detection\n const sensitiveColumns = useMemo(\n () => detectSensitiveColumnsFromConfig(result.fields, resolvedConfig),\n [result.fields, resolvedConfig]\n );\n\n const hasSensitive = sensitiveColumns.size > 0;\n\n // Clear revealed cells when result changes\n useEffect(() => {\n setRevealedCells(new Set());\n }, [result]);\n\n // Per-cell reveal with auto-hide\n const revealCell = useCallback((key: string) => {\n setRevealedCells(prev => new Set(prev).add(key));\n setTimeout(() => {\n setRevealedCells(prev => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }, 10000);\n }, []);\n\n const primaryColumn = useMemo(\n () => detectPrimaryColumn(result.fields, result.rows),\n [result.fields, result.rows]\n );\n\n const idColumn = useMemo(\n () => detectIdColumn(result.fields),\n [result.fields]\n );\n\n // Filter rows based on column filters\n const filteredRows = useMemo(() => {\n if (columnFilters.size === 0) return result.rows;\n return result.rows.filter(row => {\n for (const [col, filterVal] of columnFilters) {\n if (!filterVal) continue;\n const cellVal = String(row[col] ?? '').toLowerCase();\n if (!cellVal.includes(filterVal.toLowerCase())) return false;\n }\n return true;\n });\n }, [result.rows, columnFilters]);\n\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const [, v] of columnFilters) {\n if (v) count++;\n }\n return count;\n }, [columnFilters]);\n\n // Check if a cell has a pending change\n const getCellChange = useCallback((rowIndex: number, columnId: string): CellChange | undefined => {\n return pendingChanges?.find(c => c.rowIndex === rowIndex && c.columnId === columnId);\n }, [pendingChanges]);\n\n const handleClearFilters = useCallback(() => {\n setColumnFilters(new Map());\n setActiveFilterCol(null);\n }, []);\n\n const columns = useMemo<ColumnDef<Record<string, unknown>>[]>(() => {\n return result.fields.map(field => ({\n accessorKey: field,\n header: ({ column }) => {\n const hasFilter = columnFilters.has(field) && !!columnFilters.get(field);\n const isSensitive = effectiveMaskingEnabled && sensitiveColumns.has(field);\n return (\n <div className=\"flex items-center gap-1 select-none group/header w-full\">\n <div\n className=\"flex items-center gap-1 cursor-pointer flex-1 min-w-0\"\n onClick={() => column.toggleSorting(column.getIsSorted() === \"asc\")}\n >\n <span className=\"truncate\">{field}</span>\n {isSensitive && (\n <span title=\"Masked column\"><Lock strokeWidth={1.5} className=\"w-3 h-3 text-purple-400 shrink-0\" /></span>\n )}\n <div className=\"flex-shrink-0 opacity-0 group-hover/header:opacity-100 transition-opacity\">\n {column.getIsSorted() === \"asc\" ? (\n <ArrowUp className=\"w-3 h-3\" />\n ) : column.getIsSorted() === \"desc\" ? (\n <ArrowDown strokeWidth={1.5} className=\"w-3 h-3\" />\n ) : (\n <ArrowUpDown strokeWidth={1.5} className=\"w-3 h-3\" />\n )}\n </div>\n </div>\n <button\n className={cn(\n \"shrink-0 p-0.5 rounded transition-colors\",\n hasFilter ? \"text-blue-400\" : \"opacity-0 group-hover/header:opacity-100 text-zinc-500 hover:text-zinc-300\"\n )}\n onClick={(e) => { e.stopPropagation(); setActiveFilterCol(activeFilterCol === field ? null : field); }}\n title=\"Filter column\"\n >\n <Filter strokeWidth={1.5} className=\"w-3 h-3\" />\n </button>\n {activeFilterCol === field && (\n <div\n className=\"absolute top-full left-0 mt-1 z-30 bg-[#111] border border-white/10 rounded-lg shadow-xl p-2 w-48\"\n onClick={e => e.stopPropagation()}\n >\n <input\n autoFocus\n placeholder={`Filter ${field}...`}\n value={columnFilters.get(field) || ''}\n onChange={e => {\n const next = new Map(columnFilters);\n if (e.target.value) next.set(field, e.target.value);\n else next.delete(field);\n setColumnFilters(next);\n }}\n onKeyDown={e => { if (e.key === 'Escape' || e.key === 'Enter') setActiveFilterCol(null); }}\n className=\"w-full bg-[#050505] border border-white/10 rounded px-2 py-1 text-xs text-zinc-200 outline-none focus:border-blue-500/30\"\n />\n {hasFilter && (\n <button\n className=\"mt-1 text-xs text-red-400 hover:text-red-300\"\n onClick={() => {\n const next = new Map(columnFilters);\n next.delete(field);\n setColumnFilters(next);\n setActiveFilterCol(null);\n }}\n >\n Clear filter\n </button>\n )}\n </div>\n )}\n </div>\n );\n },\n cell: ({ row, column, getValue }) => {\n const val = getValue();\n const isEditing = editingCell?.rowIndex === row.index && editingCell?.columnId === column.id;\n const pendingChange = getCellChange(row.index, column.id);\n\n if (isEditing) {\n return (\n <div className=\"flex items-center gap-1 w-full\" onClick={(e) => e.stopPropagation()}>\n <input\n autoFocus\n className=\"w-full bg-zinc-800 border border-blue-500 rounded px-1 py-0.5 text-zinc-100 outline-none\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n if (editValue !== String(val ?? '') && onCellChange && editingEnabled) {\n onCellChange({\n rowIndex: row.index,\n columnId: column.id,\n originalValue: val,\n newValue: editValue,\n });\n }\n setEditingCell(null);\n }\n if (e.key === 'Escape') setEditingCell(null);\n }}\n onBlur={() => {\n if (editValue !== String(val ?? '') && onCellChange && editingEnabled) {\n onCellChange({\n rowIndex: row.index,\n columnId: column.id,\n originalValue: val,\n newValue: editValue,\n });\n }\n setEditingCell(null);\n }}\n />\n </div>\n );\n }\n\n // Apply masking if enabled\n const sensitivePattern = sensitiveColumns.get(column.id);\n const cellKey = `${row.index}:${column.id}`;\n const isRevealed = revealedCells.has(cellKey);\n\n if (effectiveMaskingEnabled && sensitivePattern && val !== null && val !== undefined && !isRevealed) {\n const masked = maskValueByPattern(val, sensitivePattern);\n return (\n <div className=\"truncate w-full h-full flex items-center gap-1 group/cell\">\n <span className=\"text-zinc-500 italic\">{masked}</span>\n {userCanReveal && (\n <button\n className=\"opacity-0 group-hover/cell:opacity-100 transition-opacity p-0.5 rounded hover:bg-purple-500/10\"\n onClick={(e) => { e.stopPropagation(); revealCell(cellKey); }}\n title=\"Reveal value (10s)\"\n >\n <Eye className=\"w-3 h-3 text-purple-400\" />\n </button>\n )}\n </div>\n );\n }\n\n // Show revealed cell with lock indicator\n if (effectiveMaskingEnabled && sensitivePattern && isRevealed) {\n const { display, className } = formatCellValue(val);\n return (\n <div className=\"truncate w-full h-full flex items-center gap-1\">\n <span className={className}>{display}</span>\n <Lock strokeWidth={1.5} className=\"w-2.5 h-2.5 text-purple-400/50 shrink-0\" />\n </div>\n );\n }\n\n // Show pending change value\n const displayVal = pendingChange !== undefined ? pendingChange.newValue : val;\n const { display, className } = formatCellValue(displayVal);\n\n return (\n <div\n className={cn(\n \"truncate w-full h-full cursor-text\",\n pendingChange && \"bg-amber-500/10 rounded px-0.5\"\n )}\n onDoubleClick={() => {\n setEditingCell({ rowIndex: row.index, columnId: column.id });\n setEditValue(pendingChange ? pendingChange.newValue : String(val ?? \"\"));\n }}\n >\n <span className={cn(className, pendingChange && \"text-amber-400\")}>{display}</span>\n </div>\n );\n },\n size: 150,\n minSize: 80,\n maxSize: 500,\n }));\n }, [result.fields, editingCell, editValue, effectiveMaskingEnabled, sensitiveColumns, editingEnabled, onCellChange, getCellChange, columnFilters, activeFilterCol, revealedCells, userCanReveal, revealCell]);\n\n const table = useReactTable({\n data: filteredRows,\n columns,\n state: {\n sorting,\n },\n onSortingChange: setSorting,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n columnResizeMode: 'onChange',\n });\n\n const tableContainerRef = useRef<HTMLDivElement>(null);\n const cardContainerRef = useRef<HTMLDivElement>(null);\n const mobileTableContainerRef = useRef<HTMLDivElement>(null);\n\n const { rows } = table.getRowModel();\n\n const rowVirtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => tableContainerRef.current,\n estimateSize: () => 36,\n overscan: 10,\n });\n\n const cardVirtualizer = useVirtualizer({\n count: result.rows.length,\n getScrollElement: () => cardContainerRef.current,\n estimateSize: () => 160,\n overscan: 5,\n });\n\n const mobileTableVirtualizer = useVirtualizer({\n count: result.rows.length,\n getScrollElement: () => mobileTableContainerRef.current,\n estimateSize: () => 48,\n overscan: 5,\n });\n\n if (!result || result.rows.length === 0) {\n return (\n <div className=\"h-full flex flex-col items-center justify-center p-8 text-center text-zinc-600 animate-in fade-in zoom-in-95 duration-500\">\n <div className=\"w-16 h-16 rounded-2xl bg-zinc-900/50 flex items-center justify-center mb-6 border border-white/5 shadow-2xl\">\n <span className=\"text-2xl text-zinc-500\">∅</span>\n </div>\n <p className=\"text-xs font-medium text-zinc-400\">Query returned no data</p>\n <p className=\"text-xs text-zinc-600 mt-2 max-w-[280px] leading-relaxed\">\n The operation was successful, but the result set is currently empty.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full bg-[#080808]\">\n {/* Stats Bar with View Toggle */}\n <StatsBar\n result={result}\n filteredRowCount={filteredRows.length}\n activeFilterCount={activeFilterCount}\n onClearFilters={handleClearFilters}\n viewMode={viewMode}\n onSetViewMode={setViewMode}\n hasSensitive={hasSensitive}\n effectiveMaskingEnabled={effectiveMaskingEnabled}\n userCanToggle={userCanToggle}\n onToggleMasking={onToggleMasking}\n editingEnabled={editingEnabled}\n pendingChanges={pendingChanges}\n onApplyChanges={onApplyChanges}\n onDiscardChanges={onDiscardChanges}\n />\n\n {/* Mobile Card View */}\n <div\n ref={cardContainerRef}\n className={cn(\n \"flex-1 overflow-auto p-4 md:hidden\",\n viewMode !== 'card' && \"hidden\"\n )}\n >\n <div\n style={{ height: `${cardVirtualizer.getTotalSize()}px`, position: 'relative' }}\n >\n {cardVirtualizer.getVirtualItems().map(virtualRow => (\n <div\n key={virtualRow.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n padding: '4px 0',\n }}\n >\n <ResultCard\n row={result.rows[virtualRow.index]}\n fields={result.fields}\n primaryColumn={primaryColumn}\n idColumn={idColumn}\n index={virtualRow.index}\n onSelect={() => setSelectedRow({ row: result.rows[virtualRow.index], index: virtualRow.index })}\n maskingActive={effectiveMaskingEnabled}\n sensitiveColumns={sensitiveColumns}\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Mobile Table View (when toggled) - Virtualized with horizontal scroll */}\n <div\n ref={mobileTableContainerRef}\n className={cn(\n \"flex-1 overflow-auto md:hidden\",\n viewMode !== 'table' && \"hidden\"\n )}\n >\n <div className=\"min-w-max\">\n {/* Header - Sticky */}\n <div className=\"sticky top-0 z-20 bg-[#0d0d0d] flex\">\n {result.fields.map((field, idx) => {\n const isSensitive = effectiveMaskingEnabled && sensitiveColumns.has(field);\n return (\n <div\n key={field}\n className={cn(\n \"h-10 px-4 flex items-center gap-1 border-r border-b border-white/5 text-xs uppercase font-mono text-zinc-500 bg-[#0d0d0d] whitespace-nowrap\",\n idx === 0 && \"sticky left-0 z-30 bg-[#0d0d0d] shadow-[2px_0_8px_rgba(0,0,0,0.3)]\",\n \"min-w-[120px]\"\n )}\n >\n {field}\n {isSensitive && <Lock strokeWidth={1.5} className=\"w-2.5 h-2.5 text-purple-400\" />}\n </div>\n );\n })}\n </div>\n\n {/* Virtualized Body */}\n <div\n style={{\n height: `${mobileTableVirtualizer.getTotalSize()}px`,\n position: 'relative',\n }}\n >\n {mobileTableVirtualizer.getVirtualItems().map(virtualRow => {\n const row = result.rows[virtualRow.index];\n return (\n <div\n key={virtualRow.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n className=\"flex hover:bg-blue-500/[0.03] transition-colors border-b border-white/5 cursor-pointer\"\n onClick={() => setSelectedRow({ row, index: virtualRow.index })}\n >\n {result.fields.map((field, idx) => {\n const pattern = sensitiveColumns.get(field);\n const isMasked = effectiveMaskingEnabled && pattern && row[field] != null && row[field] !== undefined;\n const displayValue = isMasked\n ? maskValueByPattern(row[field], pattern)\n : formatCellValue(row[field]).display;\n const className = isMasked\n ? 'text-zinc-500 italic'\n : formatCellValue(row[field]).className;\n\n return (\n <div\n key={field}\n className={cn(\n \"h-full px-4 py-3 border-r border-white/5 text-xs font-mono whitespace-nowrap overflow-hidden flex items-center\",\n idx === 0 && \"sticky left-0 z-10 bg-[#080808] shadow-[2px_0_8px_rgba(0,0,0,0.3)]\",\n \"min-w-[120px]\"\n )}\n >\n <span className={className}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Desktop Table View (always visible on desktop) */}\n <div\n ref={tableContainerRef}\n className=\"hidden md:block flex-1 overflow-auto editor-scrollbar\"\n >\n <div className=\"min-w-max\">\n {/* Header */}\n <div className=\"sticky top-0 z-20 bg-[#0d0d0d] flex\">\n {table.getHeaderGroups().map(headerGroup => (\n headerGroup.headers.map(header => (\n <div\n key={header.id}\n style={{ width: header.getSize(), minWidth: header.getSize() }}\n className=\"h-10 px-4 flex items-center border-r border-b border-white/5 text-xs uppercase font-mono text-zinc-500 bg-[#0d0d0d] relative group shrink-0\"\n >\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n\n {/* Column Resizer */}\n <div\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n className={cn(\n \"absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-blue-500/50 transition-colors\",\n header.column.getIsResizing() ? \"bg-blue-500 w-1\" : \"bg-transparent\"\n )}\n />\n </div>\n ))\n ))}\n </div>\n\n {/* Body */}\n <div style={{ height: `${rowVirtualizer.getTotalSize()}px`, position: 'relative' }}>\n {rowVirtualizer.getVirtualItems().map(virtualRow => {\n const row = rows[virtualRow.index];\n return (\n <div\n key={row.id}\n data-index={virtualRow.index}\n style={{\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n className=\"flex group hover:bg-blue-500/[0.03] transition-colors border-b border-white/5\"\n >\n {row.getVisibleCells().map(cell => (\n <div\n key={cell.id}\n style={{ width: cell.column.getSize(), minWidth: cell.column.getSize() }}\n className=\"h-full px-4 py-2 border-r border-white/5 text-xs font-mono whitespace-nowrap overflow-hidden group-hover:border-white/10 flex items-center shrink-0\"\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </div>\n ))}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Load More Footer */}\n {result.pagination?.hasMore && onLoadMore && (\n <LoadMoreFooter\n hasMore={true}\n onLoadMore={onLoadMore}\n isLoadingMore={isLoadingMore}\n />\n )}\n\n {/* Row Detail Sheet */}\n {selectedRow && (\n <RowDetailSheet\n row={selectedRow.row}\n fields={result.fields}\n isOpen={!!selectedRow}\n onClose={() => setSelectedRow(null)}\n rowIndex={selectedRow.index}\n maskingActive={effectiveMaskingEnabled}\n sensitiveColumns={sensitiveColumns}\n allowReveal={userCanReveal}\n />\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState, useCallback, useRef, useEffect } from 'react';\nimport {\n ReactFlow,\n Background,\n Controls,\n Handle,\n Position,\n NodeProps,\n Edge,\n Node,\n Panel,\n MiniMap,\n useReactFlow,\n ReactFlowProvider,\n type NodeTypes\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport { TableSchema } from '@/lib/types';\nimport { Database, Hash, Type, Key, Loader2, X, Download, Search, Info, Link2 } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { motion } from 'framer-motion';\n\n// Custom Node for Database Tables\ninterface TableNodeData extends Record<string, unknown> {\n table: TableSchema;\n highlighted?: boolean;\n compact?: boolean;\n}\n\nconst TableNode = ({ data }: NodeProps<Node<TableNodeData>>) => {\n if (!data) return null;\n const nodeData = data as TableNodeData;\n const table = nodeData.table;\n if (!table) return null;\n\n const isHighlighted = nodeData.highlighted;\n const isCompact = nodeData.compact;\n\n // Show FK icon for columns that are foreign keys\n const fkColumns = new Set((table.foreignKeys || []).map(fk => fk.columnName));\n\n return (\n <div className={`bg-[#0d0d0d] border rounded-lg overflow-hidden min-w-[200px] shadow-2xl transition-all ${\n isHighlighted ? 'border-blue-500/60 ring-1 ring-blue-500/30' : 'border-white/10'\n }`}>\n <div className=\"bg-blue-600/10 px-3 py-2 border-b border-white/5 flex items-center gap-2\">\n <Database strokeWidth={1.5} className=\"w-3.5 h-3.5 text-blue-400\" />\n <span className=\"text-xs font-medium text-zinc-100r\">{table.name}</span>\n <span className=\"text-[0.625rem] text-zinc-600 ml-auto\">{table.columns?.length || 0} cols</span>\n </div>\n {!isCompact && (\n <div className=\"p-1\">\n {table.columns?.map((col: { name: string; type: string; isPrimary: boolean; nullable?: boolean; defaultValue?: string }, idx: number) => {\n const isFk = fkColumns.has(col.name);\n return (\n <div key={idx} className=\"flex items-center justify-between px-2 py-1 text-xs hover:bg-white/5 rounded transition-colors group relative\">\n <Handle\n type=\"source\"\n position={Position.Right}\n id={`${col.name}-right`}\n style={{ opacity: 0, right: -5 }}\n />\n <Handle\n type=\"target\"\n position={Position.Left}\n id={`${col.name}-left`}\n style={{ opacity: 0, left: -5 }}\n />\n\n <div className=\"flex items-center gap-2\">\n {col.isPrimary ? (\n <Key strokeWidth={1.5} className=\"w-2.5 h-2.5 text-yellow-500\" />\n ) : isFk ? (\n <Link2 strokeWidth={1.5} className=\"w-2.5 h-2.5 text-blue-400\" />\n ) : col.type.toLowerCase().includes('int') ? (\n <Hash strokeWidth={1.5} className=\"w-2.5 h-2.5 text-zinc-500\" />\n ) : (\n <Type strokeWidth={1.5} className=\"w-2.5 h-2.5 text-zinc-500\" />\n )}\n <span className={\n col.isPrimary ? \"text-yellow-500/90 font-medium\" :\n isFk ? \"text-blue-400/80\" :\n \"text-zinc-400\"\n }>\n {col.name}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n {col.nullable === false && <span className=\"text-[0.5rem] text-red-500/60\">NN</span>}\n <span className=\"text-[0.625rem] text-zinc-600 font-mono uppercase\">{col.type}</span>\n </div>\n\n {/* Hover tooltip */}\n <div className=\"absolute left-full ml-2 top-0 z-50 hidden group-hover:block\">\n <div className=\"bg-[#1a1a1a] border border-white/10 rounded px-2 py-1 text-[0.625rem] whitespace-nowrap shadow-xl\">\n <div className=\"text-zinc-300\">{col.name}: <span className=\"text-zinc-500\">{col.type}</span></div>\n {col.isPrimary && <div className=\"text-yellow-500\">Primary Key</div>}\n {isFk && <div className=\"text-blue-400\">Foreign Key</div>}\n {col.nullable === false && <div className=\"text-red-400\">NOT NULL</div>}\n {col.defaultValue && <div className=\"text-zinc-500\">Default: {col.defaultValue}</div>}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nconst nodeTypes: NodeTypes = {\n table: TableNode,\n} as NodeTypes;\n\ninterface SchemaDiagramProps {\n schema: TableSchema[];\n onClose: () => void;\n}\n\nfunction SchemaDiagramInner({ schema, onClose }: SchemaDiagramProps) {\n const [selectedNode, setSelectedNode] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n const [compactMode, setCompactMode] = useState(false);\n const reactFlowInstance = useReactFlow();\n const layoutInitRef = useRef(false);\n\n // Filter tables by search\n const filteredSchema = useMemo(() => {\n if (!searchQuery.trim()) return schema;\n const q = searchQuery.toLowerCase();\n return schema.filter(t => t.name.toLowerCase().includes(q));\n }, [schema, searchQuery]);\n\n // Build nodes and edges from real FK data\n const { nodes, edges, edgeCount } = useMemo(() => {\n const tableSet = new Set(filteredSchema.map(t => t.name));\n\n // ELK-style hierarchical layout: tables with more relations go first\n const relationCount = new Map<string, number>();\n filteredSchema.forEach(table => {\n const fkCount = (table.foreignKeys || []).length;\n relationCount.set(table.name, (relationCount.get(table.name) || 0) + fkCount);\n (table.foreignKeys || []).forEach(fk => {\n if (tableSet.has(fk.referencedTable)) {\n relationCount.set(fk.referencedTable, (relationCount.get(fk.referencedTable) || 0) + 1);\n }\n });\n });\n\n // Sort by relation count for better layout\n const sorted = [...filteredSchema].sort((a, b) =>\n (relationCount.get(b.name) || 0) - (relationCount.get(a.name) || 0)\n );\n\n // Grid layout with spacing\n const cols = Math.max(2, Math.ceil(Math.sqrt(sorted.length)));\n const colWidth = compactMode ? 250 : 300;\n const rowHeight = compactMode ? 80 : 400;\n\n const nodes: Node<TableNodeData>[] = sorted.map((table, index) => ({\n id: table.name,\n type: 'table' as const,\n position: { x: (index % cols) * colWidth, y: Math.floor(index / cols) * rowHeight },\n data: {\n table,\n highlighted: selectedNode === table.name ||\n (selectedNode ? filteredSchema.some(t =>\n t.name === selectedNode && (t.foreignKeys || []).some(fk => fk.referencedTable === table.name)\n ) || filteredSchema.some(t =>\n t.name === table.name && (t.foreignKeys || []).some(fk => fk.referencedTable === selectedNode)\n ) : false),\n compact: compactMode,\n } as TableNodeData,\n }));\n\n // Build edges from real foreignKeys data\n const edges: Edge[] = [];\n const edgeIds = new Set<string>();\n\n filteredSchema.forEach(table => {\n (table.foreignKeys || []).forEach(fk => {\n if (!tableSet.has(fk.referencedTable)) return;\n const edgeId = `${table.name}.${fk.columnName}->${fk.referencedTable}.${fk.referencedColumn}`;\n if (edgeIds.has(edgeId)) return;\n edgeIds.add(edgeId);\n\n const isHighlighted = selectedNode === table.name || selectedNode === fk.referencedTable;\n\n edges.push({\n id: edgeId,\n source: table.name,\n target: fk.referencedTable,\n sourceHandle: `${fk.columnName}-right`,\n targetHandle: `${fk.referencedColumn}-left`,\n animated: isHighlighted,\n label: '1:N',\n labelStyle: { fill: '#666', fontSize: 9 },\n labelBgStyle: { fill: '#0d0d0d', fillOpacity: 0.8 },\n labelBgPadding: [4, 2] as [number, number],\n style: {\n stroke: isHighlighted ? '#3b82f6' : '#3b82f6',\n strokeWidth: isHighlighted ? 2 : 1.5,\n opacity: selectedNode ? (isHighlighted ? 1 : 0.15) : 0.4,\n },\n });\n });\n });\n\n // Fallback: if no FK data, use heuristic for _id columns\n if (edges.length === 0) {\n filteredSchema.forEach(table => {\n table.columns.forEach(col => {\n if (col.name.endsWith('_id')) {\n const targetTable = col.name.replace('_id', '') + 's';\n const target = filteredSchema.find(t => t.name === targetTable || t.name === col.name.replace('_id', ''));\n if (target) {\n const edgeId = `heuristic-${table.name}-${target.name}-${col.name}`;\n if (!edgeIds.has(edgeId)) {\n edgeIds.add(edgeId);\n const isHighlighted = selectedNode === table.name || selectedNode === target.name;\n edges.push({\n id: edgeId,\n source: table.name,\n target: target.name,\n sourceHandle: `${col.name}-right`,\n targetHandle: `id-left`,\n animated: isHighlighted,\n label: '1:N?',\n labelStyle: { fill: '#666', fontSize: 9, fontStyle: 'italic' },\n labelBgStyle: { fill: '#0d0d0d', fillOpacity: 0.8 },\n labelBgPadding: [4, 2] as [number, number],\n style: {\n stroke: '#6b7280',\n strokeWidth: 1,\n strokeDasharray: '4 2',\n opacity: selectedNode ? (isHighlighted ? 0.8 : 0.1) : 0.3,\n },\n });\n }\n }\n }\n });\n });\n }\n\n return { nodes, edges, edgeCount: edges.length };\n }, [filteredSchema, selectedNode, compactMode]);\n\n // Attempt ELK layout\n useEffect(() => {\n if (layoutInitRef.current || nodes.length === 0) return;\n layoutInitRef.current = true;\n\n // Try to import and use elkjs for better layout\n import('elkjs/lib/elk.bundled.js').then(({ default: ELK }) => {\n const elk = new ELK();\n const graph = {\n id: 'root',\n layoutOptions: {\n 'elk.algorithm': 'layered',\n 'elk.direction': 'RIGHT',\n 'elk.spacing.nodeNode': '80',\n 'elk.layered.spacing.nodeNodeBetweenLayers': '120',\n 'elk.layered.crossingMinimization.strategy': 'LAYER_SWEEP',\n },\n children: nodes.map(n => ({\n id: n.id,\n width: compactMode ? 220 : 240,\n height: compactMode ? 60 : Math.max(80, 50 + (n.data.table?.columns?.length || 0) * 22),\n })),\n edges: edges.map(e => ({\n id: e.id,\n sources: [e.source],\n targets: [e.target],\n })),\n };\n\n elk.layout(graph).then(layoutedGraph => {\n const updates = (layoutedGraph.children || []).map(node => ({\n id: node.id,\n position: { x: node.x || 0, y: node.y || 0 },\n }));\n\n // Apply positions\n updates.forEach(update => {\n const nodeIdx = nodes.findIndex(n => n.id === update.id);\n if (nodeIdx >= 0) {\n nodes[nodeIdx] = { ...nodes[nodeIdx], position: update.position };\n }\n });\n\n // layout ready\n // Fit view after layout\n setTimeout(() => {\n reactFlowInstance.fitView({ padding: 0.2 });\n }, 100);\n }).catch(() => {\n // layout ready\n });\n }).catch(() => {\n // elkjs not available, use grid layout\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nodes.length]);\n\n const onNodeClick = useCallback((_: React.MouseEvent, node: Node) => {\n setSelectedNode(prev => prev === node.id ? null : node.id);\n }, []);\n\n const onPaneClick = useCallback(() => {\n setSelectedNode(null);\n }, []);\n\n const exportDiagram = useCallback(async (format: 'png' | 'svg') => {\n const container = document.querySelector('.react-flow') as HTMLElement;\n if (!container) return;\n\n if (format === 'png') {\n try {\n const html2canvasModule = await import('html2canvas');\n const html2canvas = html2canvasModule.default as (element: HTMLElement, options?: { backgroundColor?: string; scale?: number }) => Promise<HTMLCanvasElement>;\n const canvas = await html2canvas(container, { backgroundColor: '#050505', scale: 2 });\n const link = document.createElement('a');\n link.download = `erd_${Date.now()}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n } catch (error) {\n console.error('Failed to export PNG:', error);\n }\n } else {\n const svgElement = container.querySelector('svg');\n if (svgElement) {\n const svgData = new XMLSerializer().serializeToString(svgElement);\n const blob = new Blob([svgData], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.download = `erd_${Date.now()}.svg`;\n link.href = url;\n link.click();\n URL.revokeObjectURL(url);\n }\n }\n }, []);\n\n if (schema.length === 0) {\n return (\n <div className=\"absolute inset-0 z-50 bg-[#050505] flex flex-col items-center justify-center\">\n <Loader2 strokeWidth={1.5} className=\"w-8 h-8 text-blue-500 animate-spin mb-4\" />\n <p className=\"text-zinc-500 text-xs\">Generating ERD Diagram...</p>\n </div>\n );\n }\n\n const hasForeignKeys = schema.some(t => (t.foreignKeys || []).length > 0);\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n className=\"absolute inset-0 z-40 bg-[#050505]\"\n >\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodeClick={onNodeClick}\n onPaneClick={onPaneClick}\n fitView\n colorMode=\"dark\"\n >\n <Background color=\"#1a1a1a\" gap={20} />\n <Controls showInteractive={false} className=\"bg-[#0d0d0d] border-white/10 fill-white\" />\n <MiniMap\n nodeColor=\"#1e40af\"\n maskColor=\"rgba(0,0,0,0.7)\"\n style={{ backgroundColor: '#0d0d0d', border: '1px solid rgba(255,255,255,0.1)' }}\n />\n\n {/* Close button */}\n <Panel position=\"top-right\" className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n {/* Export buttons */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"bg-[#0d0d0d] border-white/10 hover:bg-white/5 text-xs gap-1\"\n onClick={() => exportDiagram('png')}\n >\n <Download strokeWidth={1.5} className=\"w-3 h-3\" /> PNG\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"bg-[#0d0d0d] border-white/10 hover:bg-white/5 text-xs gap-1\"\n onClick={() => exportDiagram('svg')}\n >\n <Download strokeWidth={1.5} className=\"w-3 h-3\" /> SVG\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className={`bg-[#0d0d0d] border-white/10 hover:bg-white/5 text-xs ${compactMode ? 'text-blue-400' : ''}`}\n onClick={() => { setCompactMode(!compactMode); layoutInitRef.current = false; }}\n >\n {compactMode ? 'Detail' : 'Compact'}\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"rounded-full bg-[#0d0d0d] border-white/10 hover:bg-white/5\"\n onClick={onClose}\n >\n <X strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </Button>\n </div>\n </Panel>\n\n {/* Info panel with stats and search */}\n <Panel position=\"top-left\" className=\"p-4\">\n <div className=\"bg-[#0d0d0d]/80 backdrop-blur-md border border-white/10 p-3 rounded-xl shadow-2xl space-y-2\">\n <h3 className=\"text-xs font-medium text-white mb-1 flex items-center gap-2\">\n <div className=\"w-2 h-2 rounded-full bg-blue-500 animate-pulse\" />\n ERD Visualizer\n </h3>\n <div className=\"flex items-center gap-3 text-xs text-zinc-500\">\n <span>{filteredSchema.length} tables</span>\n <span>{edgeCount} relationships</span>\n </div>\n\n {/* Search */}\n <div className=\"relative\">\n <Search strokeWidth={1.5} className=\"absolute left-2 top-1/2 -translate-y-1/2 w-3 h-3 text-zinc-600\" />\n <input\n type=\"text\"\n placeholder=\"Filter tables...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-7 pr-2 py-1.5 bg-white/5 border border-white/10 rounded text-xs text-zinc-300 placeholder-zinc-600 focus:outline-none focus:border-blue-500/50\"\n />\n </div>\n\n {/* No FK warning */}\n {!hasForeignKeys && (\n <div className=\"flex items-start gap-1.5 text-[0.625rem] text-amber-500/80\">\n <Info strokeWidth={1.5} className=\"w-3 h-3 mt-0.5 shrink-0\" />\n <span>No FK data available. Showing heuristic relationships (dashed).</span>\n </div>\n )}\n\n {/* Selected node info */}\n {selectedNode && (\n <div className=\"text-xs text-blue-400 border-t border-white/5 pt-2\">\n Selected: <span className=\"font-mono font-medium\">{selectedNode}</span>\n <button onClick={() => setSelectedNode(null)} className=\"ml-2 text-zinc-600 hover:text-zinc-400\">clear</button>\n </div>\n )}\n </div>\n </Panel>\n </ReactFlow>\n </motion.div>\n );\n}\n\nexport function SchemaDiagram({ schema, onClose }: SchemaDiagramProps) {\n return (\n <ReactFlowProvider>\n <SchemaDiagramInner schema={schema} onClose={onClose} />\n </ReactFlowProvider>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\";\n\nimport React, { useState, useMemo, useRef, useCallback } from 'react';\nimport {\n BarChart,\n Bar,\n LineChart,\n Line,\n PieChart,\n Pie,\n AreaChart,\n Area,\n ScatterChart,\n Scatter,\n ZAxis,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n Cell,\n ResponsiveContainer,\n} from 'recharts';\nimport { QueryResult } from '@/lib/types';\nimport { cn } from '@/lib/utils';\nimport {\n BarChart3,\n LineChart as LineChartIcon,\n PieChart as PieChartIcon,\n AreaChart as AreaChartIcon,\n Download,\n Settings2,\n TrendingUp,\n Hash,\n Calendar,\n Type,\n AlertCircle,\n Circle,\n BarChart2,\n Save,\n FolderOpen,\n X,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { storage } from '@/lib/storage';\n\n// Chart colors matching CSS variables\nconst CHART_COLORS = [\n 'hsl(217, 91%, 60%)', // Blue\n 'hsl(142, 71%, 45%)', // Green\n 'hsl(38, 92%, 50%)', // Amber\n 'hsl(270, 91%, 65%)', // Purple\n 'hsl(330, 81%, 60%)', // Pink\n 'hsl(199, 89%, 48%)', // Cyan\n 'hsl(24, 95%, 53%)', // Orange\n 'hsl(162, 63%, 41%)', // Teal\n];\n\ntype ChartType = 'bar' | 'line' | 'pie' | 'area' | 'scatter' | 'histogram' | 'stacked-bar' | 'stacked-area';\n\nexport type AggregationType = 'none' | 'sum' | 'avg' | 'count' | 'min' | 'max';\nexport type DateGrouping = 'hour' | 'day' | 'week' | 'month' | 'year';\n\nexport interface FieldAnalysis {\n name: string;\n type: 'numeric' | 'categorical' | 'date' | 'unknown';\n uniqueValues: number;\n hasNulls: boolean;\n sample: unknown;\n}\n\nexport interface DataAnalysis {\n fields: FieldAnalysis[];\n numericFields: string[];\n categoricalFields: string[];\n dateFields: string[];\n suggestedChartType: ChartType;\n isVisualizable: boolean;\n reason?: string;\n}\n\ninterface DataChartsProps {\n result: QueryResult | null;\n}\n\nexport function analyzeField(name: string, values: unknown[]): FieldAnalysis {\n const nonNullValues = values.filter(v => v !== null && v !== undefined);\n const uniqueValues = new Set(nonNullValues).size;\n const sample = nonNullValues[0];\n\n // Check if numeric\n const numericCount = nonNullValues.filter(v => typeof v === 'number' || (typeof v === 'string' && !isNaN(Number(v)))).length;\n const isNumeric = numericCount > nonNullValues.length * 0.8;\n\n // Check if date\n const datePatterns = [\n /^\\d{4}-\\d{2}-\\d{2}/, // ISO date\n /^\\d{2}\\/\\d{2}\\/\\d{4}/, // US date\n /^\\d{2}\\.\\d{2}\\.\\d{4}/, // EU date\n ];\n const isDate = nonNullValues.some(v =>\n (typeof v === 'string' && datePatterns.some(p => p.test(v))) ||\n v instanceof Date\n );\n\n let type: FieldAnalysis['type'] = 'unknown';\n if (isDate) type = 'date';\n else if (isNumeric) type = 'numeric';\n else if (uniqueValues <= 50) type = 'categorical';\n\n return {\n name,\n type,\n uniqueValues,\n hasNulls: nonNullValues.length < values.length,\n sample,\n };\n}\n\nexport function analyzeData(result: QueryResult | null): DataAnalysis {\n if (!result || !result.rows || result.rows.length === 0) {\n return {\n fields: [],\n numericFields: [],\n categoricalFields: [],\n dateFields: [],\n suggestedChartType: 'bar',\n isVisualizable: false,\n reason: 'No data to visualize',\n };\n }\n\n if (result.rows.length < 2) {\n return {\n fields: [],\n numericFields: [],\n categoricalFields: [],\n dateFields: [],\n suggestedChartType: 'bar',\n isVisualizable: false,\n reason: 'Need at least 2 rows for visualization',\n };\n }\n\n const fieldNames = result.fields || Object.keys(result.rows[0]);\n const fields = fieldNames.map(name =>\n analyzeField(name, result.rows.map(row => row[name]))\n );\n\n const numericFields = fields.filter(f => f.type === 'numeric').map(f => f.name);\n const categoricalFields = fields.filter(f => f.type === 'categorical').map(f => f.name);\n const dateFields = fields.filter(f => f.type === 'date').map(f => f.name);\n\n if (numericFields.length === 0) {\n return {\n fields,\n numericFields,\n categoricalFields,\n dateFields,\n suggestedChartType: 'bar',\n isVisualizable: false,\n reason: 'No numeric fields found for Y-axis',\n };\n }\n\n // Suggest chart type based on data\n let suggestedChartType: ChartType = 'bar';\n\n if (dateFields.length > 0) {\n suggestedChartType = 'line'; // Time series → line chart\n } else if (numericFields.length >= 2 && categoricalFields.length === 0) {\n suggestedChartType = 'scatter'; // 2+ numeric, no categorical → scatter\n } else if (categoricalFields.length > 0 && result.rows.length <= 10) {\n suggestedChartType = 'pie'; // Few categories → pie chart\n } else if (categoricalFields.length > 0) {\n suggestedChartType = 'bar'; // Many categories → bar chart\n }\n\n return {\n fields,\n numericFields,\n categoricalFields,\n dateFields,\n suggestedChartType,\n isVisualizable: true,\n };\n}\n\nexport function formatNumber(value: number): string {\n if (Math.abs(value) >= 1000000) {\n return (value / 1000000).toFixed(1) + 'M';\n }\n if (Math.abs(value) >= 1000) {\n return (value / 1000).toFixed(1) + 'K';\n }\n return value.toLocaleString();\n}\n\ninterface TooltipProps {\n active?: boolean;\n payload?: Array<{\n name: string;\n value: number;\n color: string;\n }>;\n label?: string;\n}\n\nconst CustomTooltip = ({ active, payload, label }: TooltipProps) => {\n if (!active || !payload || !payload.length) return null;\n\n return (\n <div className=\"bg-[#111] border border-white/10 rounded-lg px-3 py-2 shadow-xl\">\n <p className=\"text-zinc-400 text-xs mb-1\">{label}</p>\n {payload.map((entry, index) => (\n <p key={index} className=\"text-xs\" style={{ color: entry.color }}>\n {entry.name}: <span className=\"font-mono font-medium\">{formatNumber(entry.value)}</span>\n </p>\n ))}\n </div>\n );\n};\n\n// Histogram bin calculation\nexport function computeHistogramBins(values: number[], buckets: number): { range: string; count: number; min: number; max: number }[] {\n if (values.length === 0) return [];\n const min = Math.min(...values);\n const max = Math.max(...values);\n if (min === max) return [{ range: `${min}`, count: values.length, min, max }];\n const binWidth = (max - min) / buckets;\n const bins = Array.from({ length: buckets }, (_, i) => ({\n range: `${(min + i * binWidth).toFixed(1)}-${(min + (i + 1) * binWidth).toFixed(1)}`,\n count: 0,\n min: min + i * binWidth,\n max: min + (i + 1) * binWidth,\n }));\n values.forEach(v => {\n let idx = Math.floor((v - min) / binWidth);\n if (idx >= buckets) idx = buckets - 1;\n bins[idx].count++;\n });\n return bins;\n}\n\n// Data aggregation helper\nexport function aggregateData(\n rows: Record<string, unknown>[],\n groupByField: string,\n metrics: { field: string; aggregation: AggregationType }[],\n dateGrouping?: DateGrouping\n): Record<string, unknown>[] {\n if (metrics.every(m => m.aggregation === 'none')) return rows;\n\n const groups = new Map<string, Record<string, unknown>[]>();\n rows.forEach(row => {\n let key = String(row[groupByField] ?? '');\n if (dateGrouping && key) {\n key = groupByDate(key, dateGrouping);\n }\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(row);\n });\n\n return Array.from(groups.entries()).map(([key, groupRows]) => {\n const result: Record<string, unknown> = { [groupByField]: key };\n metrics.forEach(({ field, aggregation }) => {\n const values = groupRows.map(r => Number(r[field]) || 0);\n switch (aggregation) {\n case 'sum': result[field] = values.reduce((a, b) => a + b, 0); break;\n case 'avg': result[field] = values.length ? values.reduce((a, b) => a + b, 0) / values.length : 0; break;\n case 'count': result[field] = values.length; break;\n case 'min': result[field] = Math.min(...values); break;\n case 'max': result[field] = Math.max(...values); break;\n default: result[field] = values[0];\n }\n });\n return result;\n });\n}\n\nexport function groupByDate(dateStr: string, grouping: DateGrouping): string {\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) return dateStr;\n switch (grouping) {\n case 'hour': return `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2,'0')}-${String(date.getDate()).padStart(2,'0')} ${String(date.getHours()).padStart(2,'0')}:00`;\n case 'day': return `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2,'0')}-${String(date.getDate()).padStart(2,'0')}`;\n case 'week': { const d = new Date(date); d.setDate(d.getDate() - d.getDay()); return `W${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`; }\n case 'month': return `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2,'0')}`;\n case 'year': return `${date.getFullYear()}`;\n default: return dateStr;\n }\n}\n\nexport function DataCharts({ result }: DataChartsProps) {\n const chartRef = useRef<HTMLDivElement>(null);\n const analysis = useMemo(() => analyzeData(result), [result]);\n\n const [chartType, setChartType] = useState<ChartType>(analysis.suggestedChartType);\n const [xAxis, setXAxis] = useState<string>('');\n const [yAxis, setYAxis] = useState<string[]>([]);\n const [scatterY, setScatterY] = useState<string>('');\n const [histogramBuckets, setHistogramBuckets] = useState(10);\n const [aggregation, setAggregation] = useState<AggregationType>('none');\n const [dateGrouping, setDateGrouping] = useState<DateGrouping | ''>('');\n\n // Saved charts state\n const [savedCharts, setSavedCharts] = useState<{ id: string; name: string; chartType: ChartType; xAxis: string; yAxis: string[]; aggregation: AggregationType; dateGrouping: string }[]>([]);\n const [showSaveDialog, setShowSaveDialog] = useState(false);\n const [saveName, setSaveName] = useState('');\n\n // Load saved charts from storage\n React.useEffect(() => {\n const charts = storage.getSavedCharts();\n if (charts.length > 0) {\n setSavedCharts(charts.map(c => ({\n id: c.id,\n name: c.name,\n chartType: c.chartType as ChartType,\n xAxis: c.xAxis,\n yAxis: c.yAxis,\n aggregation: (c.aggregation || 'none') as AggregationType,\n dateGrouping: c.dateGrouping || '',\n })));\n }\n }, []);\n\n // Initialize axis selections when analysis changes\n React.useEffect(() => {\n if (analysis.isVisualizable) {\n setChartType(analysis.suggestedChartType);\n\n const defaultX = analysis.categoricalFields[0] || analysis.dateFields[0] || analysis.fields[0]?.name || '';\n setXAxis(defaultX);\n\n if (analysis.numericFields.length > 0) {\n setYAxis([analysis.numericFields[0]]);\n }\n if (analysis.numericFields.length >= 2) {\n setScatterY(analysis.numericFields[1]);\n }\n }\n }, [analysis]);\n\n const chartData = useMemo(() => {\n if (!result?.rows) return [];\n\n // Histogram: special data preparation\n if (chartType === 'histogram' && yAxis.length > 0) {\n const values = result.rows.map(r => Number(r[yAxis[0]]) || 0).filter(v => !isNaN(v));\n return computeHistogramBins(values, histogramBuckets);\n }\n\n // Scatter: needs both axes as numeric\n if (chartType === 'scatter') {\n if (!xAxis || !scatterY) return [];\n return result.rows.map(row => ({\n [xAxis]: typeof row[xAxis] === 'number' ? row[xAxis] : Number(row[xAxis]) || 0,\n [scatterY]: typeof row[scatterY] === 'number' ? row[scatterY] : Number(row[scatterY]) || 0,\n }));\n }\n\n if (!xAxis) return [];\n\n const baseData = result.rows.map(row => {\n const dataPoint: Record<string, unknown> = { [xAxis]: row[xAxis] };\n yAxis.forEach(field => {\n const value = row[field];\n dataPoint[field] = typeof value === 'number' ? value : Number(value) || 0;\n });\n return dataPoint;\n });\n\n // Apply aggregation if set\n if (aggregation !== 'none' && yAxis.length > 0) {\n return aggregateData(\n baseData,\n xAxis,\n yAxis.map(f => ({ field: f, aggregation })),\n dateGrouping || undefined\n );\n }\n\n // Apply date grouping even without aggregation\n if (dateGrouping) {\n return aggregateData(\n baseData,\n xAxis,\n yAxis.map(f => ({ field: f, aggregation: 'sum' })),\n dateGrouping\n );\n }\n\n return baseData;\n }, [result, xAxis, yAxis, chartType, scatterY, histogramBuckets, aggregation, dateGrouping]);\n\n // Save chart config\n const handleSaveChart = useCallback(() => {\n if (!saveName.trim()) return;\n const newChart = {\n id: Date.now().toString(),\n name: saveName.trim(),\n chartType,\n xAxis,\n yAxis: [...yAxis],\n aggregation,\n dateGrouping: dateGrouping || '',\n };\n const updated = [...savedCharts, newChart];\n setSavedCharts(updated);\n storage.saveChart({\n id: newChart.id,\n name: newChart.name,\n chartType: newChart.chartType,\n xAxis: newChart.xAxis,\n yAxis: newChart.yAxis,\n aggregation: newChart.aggregation,\n dateGrouping: (newChart.dateGrouping || undefined) as DateGrouping | undefined,\n createdAt: new Date(),\n });\n setShowSaveDialog(false);\n setSaveName('');\n }, [saveName, chartType, xAxis, yAxis, aggregation, dateGrouping, savedCharts]);\n\n // Load saved chart config\n const loadSavedChart = useCallback((chart: typeof savedCharts[0]) => {\n setChartType(chart.chartType);\n setXAxis(chart.xAxis);\n setYAxis(chart.yAxis);\n setAggregation(chart.aggregation);\n setDateGrouping((chart.dateGrouping || '') as DateGrouping | '');\n }, []);\n\n // Delete saved chart\n const deleteSavedChart = useCallback((id: string) => {\n const updated = savedCharts.filter(c => c.id !== id);\n setSavedCharts(updated);\n storage.deleteChart(id);\n }, [savedCharts]);\n\n const exportChart = useCallback(async (format: 'png' | 'svg') => {\n if (!chartRef.current) return;\n\n if (format === 'png') {\n try {\n // Dynamic import for html2canvas\n const html2canvasModule = await import('html2canvas');\n const html2canvas = html2canvasModule.default as (element: HTMLElement, options?: { backgroundColor?: string; scale?: number }) => Promise<HTMLCanvasElement>;\n const canvas = await html2canvas(chartRef.current, {\n backgroundColor: '#080808',\n scale: 2,\n });\n const link = document.createElement('a');\n link.download = `chart_${Date.now()}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n } catch (error) {\n console.error('Failed to export PNG:', error);\n }\n } else {\n // SVG export - find the SVG element\n const svgElement = chartRef.current.querySelector('svg');\n if (svgElement) {\n const svgData = new XMLSerializer().serializeToString(svgElement);\n const blob = new Blob([svgData], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.download = `chart_${Date.now()}.svg`;\n link.href = url;\n link.click();\n URL.revokeObjectURL(url);\n }\n }\n }, []);\n\n const toggleYAxis = (field: string) => {\n setYAxis(prev => {\n if (prev.includes(field)) {\n return prev.filter(f => f !== field);\n }\n return [...prev, field];\n });\n };\n\n // Empty state\n if (!analysis.isVisualizable) {\n return (\n <div className=\"h-full flex flex-col items-center justify-center bg-[#080808] text-zinc-500\">\n <TrendingUp className=\"w-12 h-12 mb-4 opacity-30\" />\n <p className=\"text-xs font-medium mb-1\">Cannot Visualize Data</p>\n <p className=\"text-xs text-zinc-600\">{analysis.reason}</p>\n </div>\n );\n }\n\n const chartTypes: { type: ChartType; icon: React.ReactNode; label: string }[] = [\n { type: 'bar', icon: <BarChart3 strokeWidth={1.5} className=\"w-3.5 h-3.5\" />, label: 'Bar' },\n { type: 'line', icon: <LineChartIcon strokeWidth={1.5} className=\"w-3.5 h-3.5\" />, label: 'Line' },\n { type: 'pie', icon: <PieChartIcon strokeWidth={1.5} className=\"w-3.5 h-3.5\" />, label: 'Pie' },\n { type: 'area', icon: <AreaChartIcon strokeWidth={1.5} className=\"w-3.5 h-3.5\" />, label: 'Area' },\n { type: 'scatter', icon: <Circle strokeWidth={1.5} className=\"w-3.5 h-3.5\" />, label: 'Scatter' },\n { type: 'histogram', icon: <BarChart2 strokeWidth={1.5} className=\"w-3.5 h-3.5\" />, label: 'Histogram' },\n { type: 'stacked-bar', icon: <BarChart3 strokeWidth={1.5} className=\"w-3.5 h-3.5\" />, label: 'Stacked' },\n { type: 'stacked-area', icon: <AreaChartIcon strokeWidth={1.5} className=\"w-3.5 h-3.5\" />, label: 'Stack Area' },\n ];\n\n const getFieldIcon = (type: FieldAnalysis['type']) => {\n switch (type) {\n case 'numeric': return <Hash strokeWidth={1.5} className=\"w-3 h-3\" />;\n case 'date': return <Calendar className=\"w-3 h-3\" />;\n case 'categorical': return <Type strokeWidth={1.5} className=\"w-3 h-3\" />;\n default: return <AlertCircle strokeWidth={1.5} className=\"w-3 h-3\" />;\n }\n };\n\n return (\n <div className=\"h-full flex flex-col bg-[#080808]\">\n {/* Config Bar */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-white/5 bg-[#0a0a0a] flex-wrap\">\n {/* Chart Type Selector */}\n <div className=\"flex items-center gap-1 bg-white/5 rounded-lg p-0.5\">\n {chartTypes.map(({ type, icon, label }) => (\n <button\n key={type}\n onClick={() => setChartType(type)}\n className={cn(\n \"flex items-center gap-1.5 px-2.5 py-1.5 rounded-md text-xs font-medium transition-all\",\n chartType === type\n ? \"bg-blue-600 text-white\"\n : \"text-zinc-500 hover:text-zinc-300 hover:bg-white/5\"\n )}\n title={label}\n >\n {icon}\n <span className=\"hidden sm:inline\">{label}</span>\n </button>\n ))}\n </div>\n\n <div className=\"h-4 w-px bg-white/10 hidden sm:block\" />\n\n {/* X-Axis Selector */}\n {chartType !== 'pie' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-600r\">X-Axis</span>\n <Select value={xAxis} onValueChange={setXAxis}>\n <SelectTrigger className=\"h-7 w-[140px] text-xs bg-white/5 border-white/10\">\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent className=\"bg-[#111] border-white/10\">\n {analysis.fields.map(field => (\n <SelectItem key={field.name} value={field.name} className=\"text-xs\">\n <div className=\"flex items-center gap-2\">\n {getFieldIcon(field.type)}\n {field.name}\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Y-Axis Selector (for pie, this becomes the value field) */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-600r\">\n {chartType === 'pie' ? 'Value' : 'Y-Axis'}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-7 text-xs bg-white/5 border-white/10 gap-1\">\n {yAxis.length > 0 ? yAxis.join(', ') : 'Select fields'}\n <Settings2 strokeWidth={1.5} className=\"w-3 h-3 ml-1\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"bg-[#111] border-white/10\">\n {analysis.numericFields.map(field => (\n <DropdownMenuItem\n key={field}\n onClick={() => chartType === 'pie' ? setYAxis([field]) : toggleYAxis(field)}\n className={cn(\n \"text-xs cursor-pointer\",\n yAxis.includes(field) && \"bg-blue-600/20 text-blue-400\"\n )}\n >\n <Hash strokeWidth={1.5} className=\"w-3 h-3 mr-2\" />\n {field}\n {yAxis.includes(field) && <span className=\"ml-auto\">✓</span>}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Scatter Y-axis */}\n {chartType === 'scatter' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-600r\">Y</span>\n <Select value={scatterY} onValueChange={setScatterY}>\n <SelectTrigger className=\"h-7 w-[120px] text-xs bg-white/5 border-white/10\">\n <SelectValue placeholder=\"Y field\" />\n </SelectTrigger>\n <SelectContent className=\"bg-[#111] border-white/10\">\n {analysis.numericFields.filter(f => f !== xAxis).map(field => (\n <SelectItem key={field} value={field} className=\"text-xs\">{field}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Histogram buckets */}\n {chartType === 'histogram' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-600r\">Buckets</span>\n <Select value={String(histogramBuckets)} onValueChange={(v) => setHistogramBuckets(Number(v))}>\n <SelectTrigger className=\"h-7 w-[70px] text-xs bg-white/5 border-white/10\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-[#111] border-white/10\">\n {[5, 10, 20, 50].map(n => (\n <SelectItem key={n} value={String(n)} className=\"text-xs\">{n}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Aggregation */}\n {chartType !== 'scatter' && chartType !== 'histogram' && chartType !== 'pie' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-600r\">Agg</span>\n <Select value={aggregation} onValueChange={(v) => setAggregation(v as AggregationType)}>\n <SelectTrigger className=\"h-7 w-[80px] text-xs bg-white/5 border-white/10\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-[#111] border-white/10\">\n {(['none', 'sum', 'avg', 'count', 'min', 'max'] as const).map(a => (\n <SelectItem key={a} value={a} className=\"text-xs\">{a}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Date Grouping */}\n {analysis.dateFields.length > 0 && chartType !== 'scatter' && chartType !== 'histogram' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-600r\">Group</span>\n <Select value={dateGrouping || 'none'} onValueChange={(v) => setDateGrouping(v === 'none' ? '' : v as DateGrouping)}>\n <SelectTrigger className=\"h-7 w-[80px] text-xs bg-white/5 border-white/10\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-[#111] border-white/10\">\n <SelectItem value=\"none\" className=\"text-xs\">None</SelectItem>\n {(['hour', 'day', 'week', 'month', 'year'] as const).map(g => (\n <SelectItem key={g} value={g} className=\"text-xs capitalize\">{g}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Save Chart */}\n {showSaveDialog ? (\n <div className=\"flex items-center gap-1\">\n <input\n type=\"text\"\n placeholder=\"Chart name...\"\n value={saveName}\n onChange={(e) => setSaveName(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSaveChart()}\n className=\"h-7 px-2 text-xs bg-white/5 border border-white/10 rounded text-zinc-300 focus:outline-none focus:border-blue-500\"\n autoFocus\n />\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-blue-400\" onClick={handleSaveChart}>Save</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-zinc-500\" onClick={() => setShowSaveDialog(false)}>Cancel</Button>\n </div>\n ) : (\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-zinc-500 hover:text-white gap-1\" onClick={() => setShowSaveDialog(true)}>\n <Save strokeWidth={1.5} className=\"w-3 h-3\" /> Save\n </Button>\n {savedCharts.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-zinc-500 hover:text-white gap-1\">\n <FolderOpen strokeWidth={1.5} className=\"w-3 h-3\" /> Saved ({savedCharts.length})\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"bg-[#111] border-white/10 max-h-48 overflow-auto\">\n {savedCharts.map(chart => (\n <DropdownMenuItem key={chart.id} className=\"text-xs cursor-pointer flex items-center justify-between gap-4\">\n <span onClick={() => loadSavedChart(chart)}>{chart.name} <span className=\"text-zinc-600\">({chart.chartType})</span></span>\n <button onClick={(e) => { e.stopPropagation(); deleteSavedChart(chart.id); }} className=\"text-zinc-600 hover:text-red-400\">\n <X strokeWidth={1.5} className=\"w-3 h-3\" />\n </button>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )}\n\n {/* Export Button */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs font-medium text-zinc-500 hover:text-white gap-1\">\n <Download strokeWidth={1.5} className=\"w-3 h-3\" /> Export\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"bg-[#111] border-white/10\">\n <DropdownMenuItem onClick={() => exportChart('png')} className=\"text-xs cursor-pointer\">\n Export as PNG\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => exportChart('svg')} className=\"text-xs cursor-pointer\">\n Export as SVG\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Chart Area */}\n <div ref={chartRef} className=\"flex-1 p-4 min-h-0\">\n {yAxis.length === 0 ? (\n <div className=\"h-full flex items-center justify-center text-zinc-600 text-xs\">\n Select at least one numeric field for the chart\n </div>\n ) : (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {chartType === 'bar' ? (\n <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 60 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#222\" />\n <XAxis\n dataKey={xAxis}\n tick={{ fill: '#666', fontSize: 11 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis\n tick={{ fill: '#666', fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n <Tooltip content={<CustomTooltip />} />\n <Legend wrapperStyle={{ paddingTop: 20 }} />\n {yAxis.map((field, index) => (\n <Bar\n key={field}\n dataKey={field}\n fill={CHART_COLORS[index % CHART_COLORS.length]}\n radius={[4, 4, 0, 0]}\n />\n ))}\n </BarChart>\n ) : chartType === 'line' ? (\n <LineChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 60 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#222\" />\n <XAxis\n dataKey={xAxis}\n tick={{ fill: '#666', fontSize: 11 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis\n tick={{ fill: '#666', fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n <Tooltip content={<CustomTooltip />} />\n <Legend wrapperStyle={{ paddingTop: 20 }} />\n {yAxis.map((field, index) => (\n <Line\n key={field}\n type=\"monotone\"\n dataKey={field}\n stroke={CHART_COLORS[index % CHART_COLORS.length]}\n strokeWidth={2}\n dot={{ fill: CHART_COLORS[index % CHART_COLORS.length], strokeWidth: 0, r: 4 }}\n activeDot={{ r: 6, strokeWidth: 0 }}\n />\n ))}\n </LineChart>\n ) : chartType === 'area' ? (\n <AreaChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 60 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#222\" />\n <XAxis\n dataKey={xAxis}\n tick={{ fill: '#666', fontSize: 11 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis\n tick={{ fill: '#666', fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n <Tooltip content={<CustomTooltip />} />\n <Legend wrapperStyle={{ paddingTop: 20 }} />\n {yAxis.map((field, index) => (\n <Area\n key={field}\n type=\"monotone\"\n dataKey={field}\n stroke={CHART_COLORS[index % CHART_COLORS.length]}\n fill={CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={0.3}\n strokeWidth={2}\n />\n ))}\n </AreaChart>\n ) : chartType === 'scatter' ? (\n <ScatterChart margin={{ top: 20, right: 30, left: 20, bottom: 60 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#222\" />\n <XAxis\n dataKey={xAxis}\n type=\"number\"\n tick={{ fill: '#666', fontSize: 11 }}\n name={xAxis}\n label={{ value: xAxis, position: 'bottom', fill: '#666', fontSize: 11 }}\n />\n <YAxis\n dataKey={scatterY}\n type=\"number\"\n tick={{ fill: '#666', fontSize: 11 }}\n name={scatterY}\n label={{ value: scatterY, angle: -90, position: 'insideLeft', fill: '#666', fontSize: 11 }}\n />\n <ZAxis range={[40, 200]} />\n <Tooltip content={<CustomTooltip />} cursor={{ strokeDasharray: '3 3' }} />\n <Scatter\n name={`${xAxis} vs ${scatterY}`}\n data={chartData}\n fill={CHART_COLORS[0]}\n shape=\"circle\"\n />\n </ScatterChart>\n ) : chartType === 'histogram' ? (\n <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 60 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#222\" />\n <XAxis\n dataKey=\"range\"\n tick={{ fill: '#666', fontSize: 10 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis\n tick={{ fill: '#666', fontSize: 11 }}\n label={{ value: 'Count', angle: -90, position: 'insideLeft', fill: '#666', fontSize: 11 }}\n />\n <Tooltip content={<CustomTooltip />} />\n <Bar dataKey=\"count\" fill={CHART_COLORS[0]} radius={[4, 4, 0, 0]} />\n </BarChart>\n ) : chartType === 'stacked-bar' ? (\n <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 60 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#222\" />\n <XAxis\n dataKey={xAxis}\n tick={{ fill: '#666', fontSize: 11 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis\n tick={{ fill: '#666', fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n <Tooltip content={<CustomTooltip />} />\n <Legend wrapperStyle={{ paddingTop: 20 }} />\n {yAxis.map((field, index) => (\n <Bar\n key={field}\n dataKey={field}\n stackId=\"stack\"\n fill={CHART_COLORS[index % CHART_COLORS.length]}\n />\n ))}\n </BarChart>\n ) : chartType === 'stacked-area' ? (\n <AreaChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 60 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#222\" />\n <XAxis\n dataKey={xAxis}\n tick={{ fill: '#666', fontSize: 11 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis\n tick={{ fill: '#666', fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n <Tooltip content={<CustomTooltip />} />\n <Legend wrapperStyle={{ paddingTop: 20 }} />\n {yAxis.map((field, index) => (\n <Area\n key={field}\n type=\"monotone\"\n dataKey={field}\n stackId=\"stack\"\n stroke={CHART_COLORS[index % CHART_COLORS.length]}\n fill={CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={0.5}\n />\n ))}\n </AreaChart>\n ) : (\n <PieChart margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>\n <Pie\n data={chartData.slice(0, 10)}\n dataKey={yAxis[0]}\n nameKey={xAxis}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius=\"70%\"\n label={({ name, percent }) => `${name} (${(percent * 100).toFixed(0)}%)`}\n labelLine={{ stroke: '#444' }}\n >\n {chartData.slice(0, 10).map((_entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={CHART_COLORS[index % CHART_COLORS.length]}\n />\n ))}\n </Pie>\n <Tooltip content={<CustomTooltip />} />\n <Legend />\n </PieChart>\n )}\n </ResponsiveContainer>\n )}\n </div>\n\n {/* Footer Stats */}\n <div className=\"px-3 py-2 border-t border-white/5 bg-[#0a0a0a] flex items-center gap-4 text-xs text-zinc-600\">\n <span>Rows: <span className=\"text-zinc-400 font-mono\">{result?.rows.length || 0}</span></span>\n <span>Fields: <span className=\"text-zinc-400 font-mono\">{analysis.fields.length}</span></span>\n <span>Numeric: <span className=\"text-zinc-400 font-mono\">{analysis.numericFields.length}</span></span>\n {chartType === 'pie' && chartData.length > 10 && (\n <span className=\"text-amber-500\">Showing top 10 values</span>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useMemo } from 'react';\nimport { Code, X, Copy, Check, ChevronDown } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { TableSchema } from '@/lib/types';\n\ninterface CodeGeneratorProps {\n isOpen: boolean;\n onClose: () => void;\n tableName: string;\n tableSchema: TableSchema | null;\n databaseType?: string;\n}\n\ntype Language = 'typescript' | 'zod' | 'prisma' | 'go' | 'python' | 'java';\n\nconst LANGUAGES: { id: Language; label: string; ext: string }[] = [\n { id: 'typescript', label: 'TypeScript Interface', ext: 'ts' },\n { id: 'zod', label: 'Zod Schema', ext: 'ts' },\n { id: 'prisma', label: 'Prisma Model', ext: 'prisma' },\n { id: 'go', label: 'Go Struct', ext: 'go' },\n { id: 'python', label: 'Python Dataclass', ext: 'py' },\n { id: 'java', label: 'Java POJO', ext: 'java' },\n];\n\nexport function toPascalCase(str: string): string {\n return str\n .replace(/[_-](\\w)/g, (_, c) => c.toUpperCase())\n .replace(/^\\w/, c => c.toUpperCase())\n .replace(/s$/, ''); // Remove trailing 's' (pluralized table name)\n}\n\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nexport function toSnakeCase(str: string): string {\n return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');\n}\n\nexport function mapSqlTypeToTS(sqlType: string): string {\n const t = sqlType.toLowerCase();\n if (t.includes('int') || t.includes('float') || t.includes('double') || t.includes('decimal') || t.includes('numeric') || t.includes('real') || t.includes('serial')) return 'number';\n if (t.includes('bool')) return 'boolean';\n if (t.includes('date') || t.includes('time')) return 'Date';\n if (t.includes('json')) return 'Record<string, unknown>';\n if (t.includes('uuid')) return 'string';\n if (t.includes('array')) return 'unknown[]';\n return 'string';\n}\n\nexport function mapSqlTypeToZod(sqlType: string): string {\n const t = sqlType.toLowerCase();\n if (t.includes('int') || t.includes('float') || t.includes('double') || t.includes('decimal') || t.includes('numeric') || t.includes('real') || t.includes('serial')) return 'z.number()';\n if (t.includes('bool')) return 'z.boolean()';\n if (t.includes('date') || t.includes('time')) return 'z.date()';\n if (t.includes('json')) return 'z.record(z.unknown())';\n if (t.includes('uuid')) return 'z.string().uuid()';\n return 'z.string()';\n}\n\nexport function mapSqlTypeToPrisma(sqlType: string): string {\n const t = sqlType.toLowerCase();\n if (t.includes('serial') || t === 'integer' || t === 'int' || t === 'int4') return 'Int';\n if (t.includes('bigint') || t.includes('int8')) return 'BigInt';\n if (t.includes('float') || t.includes('double') || t.includes('decimal') || t.includes('numeric') || t.includes('real')) return 'Float';\n if (t.includes('bool')) return 'Boolean';\n if (t.includes('timestamp') || t.includes('datetime')) return 'DateTime';\n if (t.includes('date')) return 'DateTime';\n if (t.includes('json')) return 'Json';\n return 'String';\n}\n\nexport function mapSqlTypeToGo(sqlType: string): string {\n const t = sqlType.toLowerCase();\n if (t.includes('serial') || t === 'integer' || t === 'int' || t === 'int4') return 'int';\n if (t.includes('bigint') || t.includes('int8')) return 'int64';\n if (t.includes('float') || t.includes('real')) return 'float32';\n if (t.includes('double') || t.includes('decimal') || t.includes('numeric')) return 'float64';\n if (t.includes('bool')) return 'bool';\n if (t.includes('date') || t.includes('time')) return 'time.Time';\n return 'string';\n}\n\nexport function mapSqlTypeToPython(sqlType: string): string {\n const t = sqlType.toLowerCase();\n if (t.includes('int') || t.includes('serial')) return 'int';\n if (t.includes('float') || t.includes('double') || t.includes('decimal') || t.includes('numeric') || t.includes('real')) return 'float';\n if (t.includes('bool')) return 'bool';\n if (t.includes('date') || t.includes('time')) return 'datetime';\n if (t.includes('json')) return 'dict';\n return 'str';\n}\n\nexport function mapSqlTypeToJava(sqlType: string): string {\n const t = sqlType.toLowerCase();\n if (t.includes('serial') || t === 'integer' || t === 'int' || t === 'int4') return 'Integer';\n if (t.includes('bigint') || t.includes('int8')) return 'Long';\n if (t.includes('float') || t.includes('real')) return 'Float';\n if (t.includes('double') || t.includes('decimal') || t.includes('numeric')) return 'Double';\n if (t.includes('bool')) return 'Boolean';\n if (t.includes('date') || t.includes('time')) return 'LocalDateTime';\n return 'String';\n}\n\nexport function generateCode(lang: Language, table: TableSchema): string {\n const name = toPascalCase(table.name);\n const columns = table.columns || [];\n\n switch (lang) {\n case 'typescript': {\n const fields = columns.map(c => {\n const tsType = mapSqlTypeToTS(c.type);\n const nullable = c.nullable ? ' | null' : '';\n return ` ${toCamelCase(c.name)}: ${tsType}${nullable};`;\n });\n return `export interface ${name} {\\n${fields.join('\\n')}\\n}`;\n }\n case 'zod': {\n const fields = columns.map(c => {\n let zodType = mapSqlTypeToZod(c.type);\n if (c.nullable) zodType += '.nullable()';\n return ` ${toCamelCase(c.name)}: ${zodType},`;\n });\n return `import { z } from 'zod';\\n\\nexport const ${name}Schema = z.object({\\n${fields.join('\\n')}\\n});\\n\\nexport type ${name} = z.infer<typeof ${name}Schema>;`;\n }\n case 'prisma': {\n const fields = columns.map(c => {\n const prismaType = mapSqlTypeToPrisma(c.type);\n const nullable = c.nullable ? '?' : '';\n const pk = c.isPrimary ? ' @id' : '';\n const auto = c.type.toLowerCase().includes('serial') ? ' @default(autoincrement())' : '';\n return ` ${c.name} ${prismaType}${nullable}${pk}${auto}`;\n });\n return `model ${name} {\\n${fields.join('\\n')}\\n\\n @@map(\"${table.name}\")\\n}`;\n }\n case 'go': {\n const fields = columns.map(c => {\n const goType = mapSqlTypeToGo(c.type);\n const nullable = c.nullable ? '*' : '';\n const fieldName = toPascalCase(c.name);\n return `\\t${fieldName} ${nullable}${goType} \\`json:\"${c.name}\" db:\"${c.name}\"\\``;\n });\n const needsTime = columns.some(c => c.type.toLowerCase().includes('date') || c.type.toLowerCase().includes('time'));\n const imports = needsTime ? '\\nimport \"time\"\\n' : '';\n return `package models${imports}\\n\\ntype ${name} struct {\\n${fields.join('\\n')}\\n}`;\n }\n case 'python': {\n const fields = columns.map(c => {\n const pyType = mapSqlTypeToPython(c.type);\n const optional = c.nullable ? `Optional[${pyType}]` : pyType;\n return ` ${toSnakeCase(c.name)}: ${optional}`;\n });\n const needsOptional = columns.some(c => c.nullable);\n const needsDatetime = columns.some(c => c.type.toLowerCase().includes('date') || c.type.toLowerCase().includes('time'));\n const imports: string[] = ['from dataclasses import dataclass'];\n if (needsOptional) imports.push('from typing import Optional');\n if (needsDatetime) imports.push('from datetime import datetime');\n return `${imports.join('\\n')}\\n\\n\\n@dataclass\\nclass ${name}:\\n${fields.join('\\n')}`;\n }\n case 'java': {\n const fields = columns.map(c => {\n const javaType = mapSqlTypeToJava(c.type);\n return ` private ${javaType} ${toCamelCase(c.name)};`;\n });\n const needsLocalDateTime = columns.some(c => c.type.toLowerCase().includes('date') || c.type.toLowerCase().includes('time'));\n const imports = needsLocalDateTime ? 'import java.time.LocalDateTime;\\n\\n' : '';\n return `${imports}public class ${name} {\\n${fields.join('\\n')}\\n}`;\n }\n }\n}\n\nexport function CodeGenerator({\n isOpen,\n onClose,\n tableName,\n tableSchema,\n databaseType,\n}: CodeGeneratorProps) {\n const [language, setLanguage] = useState<Language>('typescript');\n const [copied, setCopied] = useState(false);\n const [showLangDropdown, setShowLangDropdown] = useState(false);\n\n const code = useMemo(() => {\n if (!tableSchema) return '// No schema available';\n return generateCode(language, tableSchema);\n }, [language, tableSchema]);\n\n const handleCopy = () => {\n navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n if (!isOpen) return null;\n\n const currentLang = LANGUAGES.find(l => l.id === language)!;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n <div className=\"bg-[#111] border border-white/10 rounded-xl shadow-2xl w-full max-w-xl mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-3 border-b border-white/5\">\n <div className=\"flex items-center gap-2\">\n <Code strokeWidth={1.5} className=\"w-3.5 h-3.5 text-purple-400\" />\n <span className=\"text-xs font-medium text-zinc-200\">Code Generator</span>\n <span className=\"text-xs text-zinc-500 font-mono\">{tableName}</span>\n {databaseType && (\n <span className=\"text-xs text-zinc-600 font-mono uppercase\">{databaseType}</span>\n )}\n </div>\n <button onClick={onClose} className=\"p-1 rounded hover:bg-white/5 text-zinc-500\">\n <X strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Language Selector */}\n <div className=\"px-5 py-2 border-b border-white/5 bg-[#0a0a0a]\">\n <div className=\"relative\">\n <button\n onClick={() => setShowLangDropdown(!showLangDropdown)}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-white/5 border border-white/10 text-xs text-zinc-300 hover:bg-white/10 transition-colors\"\n >\n {currentLang.label}\n <ChevronDown strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n </button>\n {showLangDropdown && (\n <div className=\"absolute top-full left-0 mt-1 bg-[#111] border border-white/10 rounded-lg shadow-xl z-10 py-1 w-48\">\n {LANGUAGES.map(lang => (\n <button\n key={lang.id}\n onClick={() => { setLanguage(lang.id); setShowLangDropdown(false); }}\n className={cn(\n \"w-full text-left px-3 py-1.5 text-xs hover:bg-white/5 transition-colors\",\n language === lang.id ? \"text-purple-400\" : \"text-zinc-400\"\n )}\n >\n {lang.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Code Preview */}\n <div className=\"relative\">\n <pre className=\"p-5 text-xs font-mono text-zinc-300 overflow-auto max-h-[50vh] bg-[#050505] leading-relaxed whitespace-pre\">\n {code}\n </pre>\n <button\n onClick={handleCopy}\n className=\"absolute top-3 right-3 flex items-center gap-1.5 px-2.5 py-1 rounded-lg bg-white/10 hover:bg-white/20 text-xs text-zinc-400 transition-colors\"\n >\n {copied ? <Check strokeWidth={1.5} className=\"w-3 h-3 text-emerald-400\" /> : <Copy strokeWidth={1.5} className=\"w-3 h-3\" />}\n {copied ? 'Copied!' : 'Copy'}\n </button>\n </div>\n\n {/* Footer */}\n <div className=\"px-5 py-3 border-t border-white/5 bg-[#0a0a0a]\">\n <p className=\"text-xs text-zinc-600\">\n Generated from <span className=\"text-zinc-500\">{tableName}</span> • {tableSchema?.columns?.length || 0} columns • {currentLang.ext} format\n </p>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useMemo } from 'react';\nimport { Wand2, X, Play, Copy, Check, RefreshCw } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { TableSchema } from '@/lib/types';\n\ninterface TestDataGeneratorProps {\n isOpen: boolean;\n onClose: () => void;\n tableName: string;\n tableSchema: TableSchema | null;\n databaseType?: string;\n queryLanguage?: string;\n onExecuteQuery: (query: string) => void;\n}\n\nfunction inferFakerType(colName: string, colType: string): { generator: string; example: string } {\n const name = colName.toLowerCase();\n const type = colType.toLowerCase();\n\n // Name-based inference\n if (name.includes('email')) return { generator: 'email', example: 'user@example.com' };\n if (name.includes('phone') || name.includes('mobile') || name.includes('tel')) return { generator: 'phone', example: '+1-555-0123' };\n if (name === 'first_name' || name === 'firstname') return { generator: 'firstName', example: 'John' };\n if (name === 'last_name' || name === 'lastname' || name === 'surname') return { generator: 'lastName', example: 'Doe' };\n if (name === 'name' || name === 'full_name' || name === 'fullname') return { generator: 'fullName', example: 'John Doe' };\n if (name.includes('address') || name.includes('street')) return { generator: 'address', example: '123 Main St' };\n if (name.includes('city')) return { generator: 'city', example: 'New York' };\n if (name.includes('country')) return { generator: 'country', example: 'United States' };\n if (name.includes('zip') || name.includes('postal')) return { generator: 'zipCode', example: '10001' };\n if (name.includes('state') || name.includes('province')) return { generator: 'state', example: 'California' };\n if (name.includes('url') || name.includes('website') || name.includes('link')) return { generator: 'url', example: 'https://example.com' };\n if (name.includes('company') || name.includes('organization') || name.includes('org')) return { generator: 'company', example: 'Acme Corp' };\n if (name.includes('title') || name.includes('subject')) return { generator: 'sentence', example: 'A brief title here' };\n if (name.includes('description') || name.includes('bio') || name.includes('about') || name.includes('content') || name.includes('body')) return { generator: 'paragraph', example: 'Lorem ipsum dolor sit amet...' };\n if (name.includes('avatar') || name.includes('image') || name.includes('photo') || name.includes('picture')) return { generator: 'imageUrl', example: 'https://picsum.photos/200' };\n if (name.includes('color') || name.includes('colour')) return { generator: 'color', example: '#3b82f6' };\n if (name.includes('ip')) return { generator: 'ip', example: '192.168.1.1' };\n if (name.includes('username') || name === 'login') return { generator: 'username', example: 'johndoe42' };\n if (name.includes('password') || name.includes('hash') || name.includes('token') || name.includes('secret')) return { generator: 'hash', example: 'a1b2c3d4e5f6...' };\n if (name.includes('price') || name.includes('amount') || name.includes('cost') || name.includes('total') || name.includes('salary')) return { generator: 'price', example: '99.99' };\n if (name.includes('age')) return { generator: 'age', example: '28' };\n if (name.includes('status')) return { generator: 'status', example: 'active' };\n if (name.includes('gender') || name.includes('sex')) return { generator: 'gender', example: 'male' };\n\n // Type-based inference\n if (type.includes('serial') || name === 'id' || name.endsWith('_id')) return { generator: 'autoIncrement', example: '1' };\n if (type.includes('bool')) return { generator: 'boolean', example: 'true' };\n if (type.includes('int')) return { generator: 'integer', example: '42' };\n if (type.includes('float') || type.includes('double') || type.includes('decimal') || type.includes('numeric')) return { generator: 'decimal', example: '3.14' };\n if (type.includes('date') && !type.includes('time')) return { generator: 'date', example: '2024-03-15' };\n if (type.includes('time')) return { generator: 'datetime', example: '2024-03-15 14:30:00' };\n if (type.includes('uuid')) return { generator: 'uuid', example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' };\n if (type.includes('json')) return { generator: 'json', example: '{}' };\n\n return { generator: 'text', example: 'Lorem ipsum' };\n}\n\n// Lightweight fake data generators\nconst FAKE = {\n autoIncrement: (i: number) => String(i + 1),\n email: (i: number) => `user${i + 1}@example.com`,\n phone: () => `+1-555-${String(Math.floor(Math.random() * 9000) + 1000)}`,\n firstName: () => ['John', 'Jane', 'Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank', 'Grace', 'Henry'][Math.floor(Math.random() * 10)],\n lastName: () => ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Wilson', 'Taylor'][Math.floor(Math.random() * 10)],\n fullName: () => `${FAKE.firstName()} ${FAKE.lastName()}`,\n address: (i: number) => `${(i + 1) * 100} ${['Main', 'Oak', 'Pine', 'Elm', 'Maple'][Math.floor(Math.random() * 5)]} St`,\n city: () => ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'London', 'Paris', 'Berlin', 'Tokyo', 'Sydney'][Math.floor(Math.random() * 10)],\n country: () => ['United States', 'United Kingdom', 'Canada', 'Germany', 'France', 'Japan', 'Australia', 'Brazil'][Math.floor(Math.random() * 8)],\n zipCode: () => String(Math.floor(Math.random() * 90000) + 10000),\n state: () => ['California', 'New York', 'Texas', 'Florida', 'Illinois', 'Pennsylvania', 'Ohio', 'Georgia'][Math.floor(Math.random() * 8)],\n url: (i: number) => `https://example.com/page/${i + 1}`,\n company: () => ['Acme Corp', 'TechStart', 'GlobalSync', 'NovaTech', 'DataFlow', 'CloudPeak', 'ByteWise', 'NetSphere'][Math.floor(Math.random() * 8)],\n sentence: () => ['Quick update needed', 'New feature request', 'Bug fix applied', 'Performance review', 'System maintenance'][Math.floor(Math.random() * 5)],\n paragraph: () => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore.',\n imageUrl: (i: number) => `https://picsum.photos/200?id=${i}`,\n color: () => '#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0'),\n ip: () => `${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}`,\n username: (i: number) => `user_${String.fromCharCode(97 + (i % 26))}${Math.floor(Math.random() * 100)}`,\n hash: () => Array.from({ length: 32 }, () => Math.floor(Math.random() * 16).toString(16)).join(''),\n price: () => (Math.random() * 999 + 0.01).toFixed(2),\n age: () => String(Math.floor(Math.random() * 60) + 18),\n status: () => ['active', 'inactive', 'pending', 'archived'][Math.floor(Math.random() * 4)],\n gender: () => ['male', 'female', 'non-binary'][Math.floor(Math.random() * 3)],\n boolean: () => Math.random() > 0.5 ? 'true' : 'false',\n integer: () => String(Math.floor(Math.random() * 10000)),\n decimal: () => (Math.random() * 1000).toFixed(2),\n date: () => { const d = new Date(Date.now() - Math.random() * 365 * 86400000); return d.toISOString().split('T')[0]; },\n datetime: () => { const d = new Date(Date.now() - Math.random() * 365 * 86400000); return d.toISOString().replace('T', ' ').substring(0, 19); },\n uuid: () => 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { const r = Math.random() * 16 | 0; return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); }),\n json: () => '{}',\n text: () => ['Sample text', 'Test data', 'Example value', 'Test content', 'Placeholder'][Math.floor(Math.random() * 5)],\n};\n\nexport function TestDataGenerator({\n isOpen,\n onClose,\n tableName,\n tableSchema,\n queryLanguage,\n onExecuteQuery,\n}: TestDataGeneratorProps) {\n const [rowCount, setRowCount] = useState(10);\n const [copied, setCopied] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const columnConfigs = useMemo(() => {\n if (!tableSchema?.columns) return [];\n return tableSchema.columns.map(col => ({\n ...col,\n faker: inferFakerType(col.name, col.type),\n }));\n }, [tableSchema]);\n\n const generatedQuery = useMemo(() => {\n if (!tableSchema?.columns || columnConfigs.length === 0) return '';\n\n // Filter out auto-increment columns\n const cols = columnConfigs.filter(c => c.faker.generator !== 'autoIncrement');\n\n if (queryLanguage === 'json') {\n // MongoDB insertMany\n const docs = Array.from({ length: rowCount }, (_, i) => {\n const doc: Record<string, string> = {};\n for (const col of cols) {\n const gen = FAKE[col.faker.generator as keyof typeof FAKE];\n doc[col.name] = gen ? gen(i) : `value_${i}`;\n }\n return doc;\n });\n return JSON.stringify({ collection: tableName, operation: 'insertMany', documents: docs }, null, 2);\n }\n\n // SQL INSERT\n const colNames = cols.map(c => `\"${c.name}\"`).join(', ');\n const rows = Array.from({ length: rowCount }, (_, i) => {\n const values = cols.map(col => {\n const gen = FAKE[col.faker.generator as keyof typeof FAKE];\n const val = gen ? gen(i) : `value_${i}`;\n // Determine if value should be quoted\n const type = col.type.toLowerCase();\n if (type.includes('bool')) return val;\n if (type.includes('int') || type.includes('float') || type.includes('double') || type.includes('decimal') || type.includes('numeric') || type.includes('real')) return val;\n return `'${val.replace(/'/g, \"''\")}'`;\n });\n return `(${values.join(', ')})`;\n });\n\n return `INSERT INTO ${tableName} (${colNames})\\nVALUES\\n ${rows.join(',\\n ')};`;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tableSchema, columnConfigs, rowCount, queryLanguage, tableName, refreshKey]);\n\n const handleCopy = () => {\n navigator.clipboard.writeText(generatedQuery);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n <div className=\"bg-[#111] border border-white/10 rounded-xl shadow-2xl w-full max-w-2xl mx-4 max-h-[85vh] flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-3 border-b border-white/5\">\n <div className=\"flex items-center gap-2\">\n <Wand2 strokeWidth={1.5} className=\"w-3.5 h-3.5 text-amber-400\" />\n <span className=\"text-xs font-medium text-zinc-200\">Test Data Generator</span>\n <span className=\"text-xs text-zinc-500 font-mono\">{tableName}</span>\n </div>\n <button onClick={onClose} className=\"p-1 rounded hover:bg-white/5 text-zinc-500\">\n <X strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Controls */}\n <div className=\"px-5 py-3 border-b border-white/5 bg-[#0a0a0a] flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-zinc-500r font-medium\">Rows:</span>\n <div className=\"flex items-center gap-1\">\n {[5, 10, 25, 50, 100].map(n => (\n <button\n key={n}\n onClick={() => setRowCount(n)}\n className={cn(\n \"px-2 py-0.5 rounded text-xs font-medium transition-colors\",\n rowCount === n\n ? \"bg-amber-500/20 text-amber-400 border border-amber-500/20\"\n : \"text-zinc-500 hover:text-zinc-300 hover:bg-white/5\"\n )}\n >\n {n}\n </button>\n ))}\n </div>\n </div>\n <button\n onClick={() => setRefreshKey(k => k + 1)}\n className=\"flex items-center gap-1 px-2 py-1 rounded text-xs font-medium text-zinc-500 hover:text-zinc-300 hover:bg-white/5 transition-colors\"\n title=\"Regenerate random data\"\n >\n <RefreshCw strokeWidth={1.5} className=\"w-3 h-3\" /> Regenerate\n </button>\n </div>\n\n {/* Column mapping preview */}\n <div className=\"px-5 py-2 border-b border-white/5 bg-[#0a0a0a]\">\n <div className=\"flex flex-wrap gap-1.5\">\n {columnConfigs.map(col => (\n <span\n key={col.name}\n className={cn(\n \"text-xs px-1.5 py-0.5 rounded font-mono\",\n col.faker.generator === 'autoIncrement'\n ? \"bg-zinc-800 text-zinc-600 line-through\"\n : \"bg-amber-500/10 text-amber-400/80\"\n )}\n title={`${col.name} → ${col.faker.generator} (e.g., ${col.faker.example})`}\n >\n {col.name}: {col.faker.generator}\n </span>\n ))}\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"flex-1 overflow-auto relative\">\n <pre className=\"p-5 text-xs font-mono text-blue-300 whitespace-pre-wrap leading-relaxed\">\n {generatedQuery}\n </pre>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-between px-5 py-3 border-t border-white/5 bg-[#0a0a0a]\">\n <p className=\"text-xs text-zinc-600\">\n {columnConfigs.filter(c => c.faker.generator !== 'autoIncrement').length} columns • {rowCount} rows\n </p>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-white/5 text-zinc-400 text-xs font-medium hover:bg-white/10 transition-colors\"\n >\n {copied ? <Check strokeWidth={1.5} className=\"w-3 h-3 text-emerald-400\" /> : <Copy strokeWidth={1.5} className=\"w-3 h-3\" />}\n {copied ? 'Copied!' : 'Copy'}\n </button>\n <button\n onClick={() => {\n onExecuteQuery(generatedQuery);\n onClose();\n }}\n className=\"flex items-center gap-1.5 px-4 py-1.5 rounded-lg bg-amber-600 hover:bg-amber-500 text-white text-xs font-medium transition-colors\"\n >\n <Play strokeWidth={1.5} className=\"w-3 h-3 fill-current\" /> Execute\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState, useCallback, useRef } from 'react';\nimport {\n Zap,\n Search,\n ArrowDown,\n Layers,\n Database,\n Clock,\n LayoutGrid,\n AlertTriangle,\n CheckCircle2,\n TrendingUp,\n HardDrive,\n Target,\n ChevronRight,\n Info,\n FileJson,\n Activity,\n Sparkles,\n Play,\n Loader2,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\ntype ExplainPlanNode = {\n Plan?: ExplainPlanNode;\n 'Node Type'?: string;\n 'Actual Rows'?: number;\n 'Plan Rows'?: number;\n 'Actual Total Time'?: number;\n 'Total Cost'?: number;\n 'Shared Hit Blocks'?: number;\n 'Shared Read Blocks'?: number;\n 'Relation Name'?: string;\n 'Actual Loops'?: number;\n Filter?: string;\n 'Index Name'?: string;\n Plans?: ExplainPlanNode[];\n};\n\nexport type ExplainPlanResult = {\n Plan?: ExplainPlanNode;\n 'Execution Time'?: number;\n 'Planning Time'?: number;\n};\n\ninterface VisualExplainProps {\n plan: ExplainPlanResult[] | null | undefined;\n query?: string;\n schemaContext?: string;\n databaseType?: string;\n onLoadQuery?: (query: string) => void;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction formatNumber(num: number): string {\n if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;\n if (num >= 1000) return `${(num / 1000).toFixed(1)}K`;\n return num.toFixed(0);\n}\n\n\nfunction formatTime(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(2)}s`;\n if (ms >= 1) return `${ms.toFixed(2)}ms`;\n return `${(ms * 1000).toFixed(0)}μs`;\n}\n\n// ============================================================================\n// Analysis Functions\n// ============================================================================\n\ninterface PlanAnalysis {\n totalTime: number;\n planningTime: number;\n executionTime: number;\n totalRows: number;\n totalCost: number;\n bufferHits: number;\n bufferReads: number;\n nodeCount: number;\n warnings: Warning[];\n insights: Insight[];\n}\n\ninterface Warning {\n type: 'critical' | 'warning' | 'info';\n title: string;\n description: string;\n node?: string;\n}\n\ninterface Insight {\n label: string;\n value: string;\n status: 'good' | 'warning' | 'critical';\n}\n\nfunction analyzePlan(plan: ExplainPlanResult[]): PlanAnalysis {\n const warnings: Warning[] = [];\n const insights: Insight[] = [];\n let totalRows = 0;\n let nodeCount = 0;\n let bufferHits = 0;\n let bufferReads = 0;\n\n const rootPlan = plan?.[0]?.Plan;\n const executionTime = plan?.[0]?.['Execution Time'] || rootPlan?.['Actual Total Time'] || 0;\n const planningTime = plan?.[0]?.['Planning Time'] || 0;\n const totalCost = rootPlan?.['Total Cost'] || 0;\n\n // Recursive node analysis\n function analyzeNode(node: ExplainPlanNode, depth: number = 0) {\n if (!node) return;\n nodeCount++;\n\n const nodeType = node['Node Type'] || '';\n const actualRows = node['Actual Rows'] || 0;\n const planRows = node['Plan Rows'] || 0;\n const actualTime = node['Actual Total Time'] || 0;\n\n totalRows += actualRows;\n bufferHits += node['Shared Hit Blocks'] || 0;\n bufferReads += node['Shared Read Blocks'] || 0;\n\n // Check for Sequential Scan on large tables\n if (nodeType.includes('Seq Scan') && actualRows > 10000) {\n warnings.push({\n type: 'warning',\n title: 'Sequential Scan',\n description: `Full table scan on \"${node['Relation Name'] || 'table'}\" (${formatNumber(actualRows)} rows). Consider adding an index.`,\n node: nodeType,\n });\n }\n\n // Check for row estimate mismatch\n if (planRows > 0 && actualRows > 0) {\n const ratio = actualRows / planRows;\n if (ratio > 10 || ratio < 0.1) {\n warnings.push({\n type: 'info',\n title: 'Estimate Mismatch',\n description: `Expected ${formatNumber(planRows)} rows, got ${formatNumber(actualRows)}. Statistics may be outdated.`,\n node: nodeType,\n });\n }\n }\n\n // Check for expensive sorts\n if (nodeType.includes('Sort') && actualTime > 100) {\n warnings.push({\n type: 'warning',\n title: 'Expensive Sort',\n description: `Sort operation took ${formatTime(actualTime)}. Consider adding an index for ordered access.`,\n node: nodeType,\n });\n }\n\n // Check for nested loops with high iterations\n const actualLoops = node['Actual Loops'] ?? 1;\n if (nodeType.includes('Nested Loop') && actualLoops > 1000) {\n warnings.push({\n type: 'critical',\n title: 'High Loop Count',\n description: `Nested loop executed ${formatNumber(actualLoops)} times. This could indicate an N+1 problem.`,\n node: nodeType,\n });\n }\n\n // Recurse into children\n (node['Plans'] || []).forEach((child) => analyzeNode(child, depth + 1));\n }\n\n if (rootPlan) {\n analyzeNode(rootPlan);\n }\n\n // Build insights\n insights.push({\n label: 'Cache Hit Rate',\n value: bufferHits + bufferReads > 0\n ? `${((bufferHits / (bufferHits + bufferReads)) * 100).toFixed(1)}%`\n : 'N/A',\n status: bufferHits / (bufferHits + bufferReads || 1) > 0.95 ? 'good' : 'warning',\n });\n\n insights.push({\n label: 'Operations',\n value: nodeCount.toString(),\n status: nodeCount > 20 ? 'warning' : 'good',\n });\n\n insights.push({\n label: 'Execution',\n value: formatTime(executionTime),\n status: executionTime > 1000 ? 'critical' : executionTime > 100 ? 'warning' : 'good',\n });\n\n return {\n totalTime: executionTime + planningTime,\n planningTime,\n executionTime,\n totalRows,\n totalCost,\n bufferHits,\n bufferReads,\n nodeCount,\n warnings,\n insights,\n };\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\nconst NodeIcon = ({ type }: { type: string }) => {\n if (type.includes('Seq Scan')) return <Search strokeWidth={1.5} className=\"w-3.5 h-3.5 text-amber-400\" />;\n if (type.includes('Index Scan') || type.includes('Index Only')) return <Target strokeWidth={1.5} className=\"w-3.5 h-3.5 text-emerald-400\" />;\n if (type.includes('Scan')) return <Search strokeWidth={1.5} className=\"w-3.5 h-3.5 text-blue-400\" />;\n if (type.includes('Join')) return <Layers strokeWidth={1.5} className=\"w-3.5 h-3.5 text-purple-400\" />;\n if (type.includes('Sort')) return <ArrowDown strokeWidth={1.5} className=\"w-3.5 h-3.5 text-amber-400\" />;\n if (type.includes('Limit')) return <LayoutGrid strokeWidth={1.5} className=\"w-3.5 h-3.5 text-zinc-400\" />;\n if (type.includes('Aggregate') || type.includes('Group')) return <Zap strokeWidth={1.5} className=\"w-3.5 h-3.5 text-pink-400\" />;\n if (type.includes('Hash')) return <HardDrive strokeWidth={1.5} className=\"w-3.5 h-3.5 text-cyan-400\" />;\n return <Database strokeWidth={1.5} className=\"w-3.5 h-3.5 text-zinc-500\" />;\n};\n\nconst StatusBadge = ({ status }: { status: 'good' | 'warning' | 'critical' }) => {\n return <div className={cn('w-2 h-2 rounded-full', status === 'good' ? 'bg-emerald-500' : status === 'warning' ? 'bg-amber-500' : 'bg-red-500')} />;\n};\n\n// Compact Plan Node\nconst PlanNode = ({ node, depth = 0, maxTime }: { node: ExplainPlanNode; depth?: number; maxTime: number }) => {\n const [expanded, setExpanded] = useState(depth < 2);\n const nodeType = node['Node Type'] || 'Unknown';\n const actualTime = node['Actual Total Time'] || 0;\n const actualRows = node['Actual Rows'] || 0;\n const children = node['Plans'] || [];\n const isIndexScan = nodeType.includes('Index');\n const isSeqScan = nodeType.includes('Seq Scan');\n\n const timePercent = maxTime > 0 ? (actualTime / maxTime) * 100 : 0;\n\n return (\n <div className=\"relative\">\n {/* Node */}\n <div\n className={cn(\n \"group flex items-center gap-2 py-1.5 px-2 rounded-lg transition-all cursor-pointer hover:bg-white/5\",\n depth === 0 && \"bg-white/[0.02]\"\n )}\n onClick={() => setExpanded(!expanded)}\n style={{ marginLeft: depth * 20 }}\n >\n {/* Expand icon */}\n {children.length > 0 && (\n <ChevronRight className={cn(\"w-3 h-3 text-zinc-600 transition-transform\", expanded && \"rotate-90\")} />\n )}\n {children.length === 0 && <div className=\"w-3\" />}\n\n {/* Icon */}\n <div className={cn(\n \"p-1 rounded\",\n isSeqScan ? \"bg-amber-500/10\" : isIndexScan ? \"bg-emerald-500/10\" : \"bg-white/5\"\n )}>\n <NodeIcon type={nodeType} />\n </div>\n\n {/* Type & Table */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-zinc-200 truncate\">{nodeType}</span>\n {node['Relation Name'] && (\n <span className=\"text-xs text-zinc-500 font-mono truncate\">{node['Relation Name']}</span>\n )}\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"flex items-center gap-4 text-xs font-mono\">\n <span className=\"text-zinc-500 w-16 text-right\">{formatNumber(actualRows)} rows</span>\n <span className={cn(\n \"w-16 text-right\",\n timePercent > 50 ? \"text-red-400\" : timePercent > 20 ? \"text-amber-400\" : \"text-zinc-400\"\n )}>\n {formatTime(actualTime)}\n </span>\n {/* Time bar */}\n <div className=\"w-20 h-1.5 bg-white/5 rounded-full overflow-hidden\">\n <div\n className={cn(\n \"h-full rounded-full transition-all\",\n timePercent > 50 ? \"bg-red-500\" : timePercent > 20 ? \"bg-amber-500\" : \"bg-blue-500\"\n )}\n style={{ width: `${Math.min(timePercent, 100)}%` }}\n />\n </div>\n </div>\n </div>\n\n {/* Details on expand */}\n {expanded && (\n <div className=\"ml-8 pl-4 border-l border-white/5\" style={{ marginLeft: depth * 20 + 32 }}>\n {/* Filter info */}\n {node['Filter'] && (\n <div className=\"flex items-start gap-2 py-1 text-xs\">\n <span className=\"text-amber-500/70 font-medium shrink-0\">Filter:</span>\n <span className=\"text-zinc-500 font-mono break-all\">{node['Filter']}</span>\n </div>\n )}\n {/* Index info */}\n {node['Index Name'] && (\n <div className=\"flex items-center gap-2 py-1 text-xs\">\n <span className=\"text-emerald-500/70 font-medium\">Index:</span>\n <span className=\"text-emerald-400 font-mono\">{node['Index Name']}</span>\n </div>\n )}\n {/* Buffer stats */}\n {((node['Shared Hit Blocks'] ?? 0) > 0 || (node['Shared Read Blocks'] ?? 0) > 0) && (\n <div className=\"flex items-center gap-4 py-1 text-xs text-zinc-600\">\n {(node['Shared Hit Blocks'] ?? 0) > 0 && <span>Cache hits: {node['Shared Hit Blocks']}</span>}\n {(node['Shared Read Blocks'] ?? 0) > 0 && <span>Disk reads: {node['Shared Read Blocks']}</span>}\n </div>\n )}\n\n {/* Children */}\n {children.map((child, idx) => (\n <PlanNode key={idx} node={child} depth={depth + 1} maxTime={maxTime} />\n ))}\n </div>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// AI Explain Tab Component\n// ============================================================================\n\nfunction AIExplainTab({\n plan,\n query,\n schemaContext,\n databaseType,\n onLoadQuery,\n}: {\n plan: ExplainPlanResult[];\n query?: string;\n schemaContext?: string;\n databaseType?: string;\n onLoadQuery?: (query: string) => void;\n}) {\n const [aiResponse, setAiResponse] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasRun, setHasRun] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const analyzeWithAI = useCallback(async () => {\n if (!query && !plan) return;\n\n setIsLoading(true);\n setAiResponse('');\n setError(null);\n setHasRun(true);\n\n // Abort previous request if any\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n try {\n const response = await fetch('/api/ai/explain', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n query: query || 'Unknown query',\n explainPlan: plan,\n schemaContext: schemaContext || '',\n databaseType: databaseType || 'postgres',\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n const errData = await response.json().catch(() => ({}));\n throw new Error(errData.error || 'AI analysis failed');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No response body');\n\n const decoder = new TextDecoder();\n let accumulated = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n accumulated += chunk;\n setAiResponse(accumulated);\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') return;\n setError(err instanceof Error ? err.message : 'AI analysis failed');\n } finally {\n setIsLoading(false);\n }\n }, [query, plan, schemaContext, databaseType]);\n\n\n // Simple markdown renderer for the AI response\n const renderMarkdown = (text: string) => {\n const lines = text.split('\\n');\n const elements: React.ReactNode[] = [];\n let inCodeBlock = false;\n let codeBlockLang = '';\n let codeBlockContent = '';\n\n lines.forEach((line, idx) => {\n if (line.startsWith('```')) {\n if (inCodeBlock) {\n // End code block\n const content = codeBlockContent;\n const isSql = codeBlockLang === 'sql';\n elements.push(\n <div key={`code-${idx}`} className=\"my-3 relative group/code\">\n <pre className={cn(\n \"text-xs font-mono p-3 rounded-lg overflow-x-auto border\",\n isSql ? \"bg-blue-500/5 border-blue-500/10 text-blue-300\" : \"bg-white/[0.02] border-white/5 text-zinc-400\"\n )}>\n {content}\n </pre>\n {isSql && onLoadQuery && (\n <button\n onClick={() => onLoadQuery(content)}\n className=\"absolute top-2 right-2 opacity-0 group-hover/code:opacity-100 transition-opacity px-2 py-1 rounded bg-blue-600 hover:bg-blue-500 text-white text-xs font-medium flex items-center gap-1\"\n >\n <Play strokeWidth={1.5} className=\"w-3 h-3\" /> Try This\n </button>\n )}\n </div>\n );\n codeBlockContent = '';\n inCodeBlock = false;\n } else {\n // Start code block\n inCodeBlock = true;\n codeBlockLang = line.slice(3).trim();\n codeBlockContent = '';\n }\n return;\n }\n\n if (inCodeBlock) {\n codeBlockContent += (codeBlockContent ? '\\n' : '') + line;\n return;\n }\n\n // Headers\n if (line.startsWith('## ')) {\n elements.push(\n <h2 key={idx} className=\"text-xs font-medium text-zinc-200 mt-4 mb-2 flex items-center gap-2\">\n {line.slice(3)}\n </h2>\n );\n } else if (line.startsWith('### ')) {\n elements.push(\n <h3 key={idx} className=\"text-xs font-medium text-zinc-300 mt-3 mb-1\">\n {line.slice(4)}\n </h3>\n );\n } else if (line.startsWith('- ')) {\n elements.push(\n <div key={idx} className=\"flex items-start gap-2 text-xs text-zinc-400 leading-relaxed ml-2 my-0.5\">\n <span className=\"text-zinc-600 mt-1 shrink-0\">•</span>\n <span>{renderInlineFormatting(line.slice(2))}</span>\n </div>\n );\n } else if (/^\\d+\\.\\s/.test(line)) {\n const num = line.match(/^(\\d+)\\./)?.[1];\n elements.push(\n <div key={idx} className=\"flex items-start gap-2 text-xs text-zinc-400 leading-relaxed ml-2 my-0.5\">\n <span className=\"text-blue-400 font-medium mt-0 shrink-0 w-4\">{num}.</span>\n <span>{renderInlineFormatting(line.replace(/^\\d+\\.\\s*/, ''))}</span>\n </div>\n );\n } else if (line.trim() === '') {\n elements.push(<div key={idx} className=\"h-1\" />);\n } else {\n elements.push(\n <p key={idx} className=\"text-xs text-zinc-400 leading-relaxed my-0.5\">\n {renderInlineFormatting(line)}\n </p>\n );\n }\n });\n\n return elements;\n };\n\n const renderInlineFormatting = (text: string): React.ReactNode => {\n // Bold **text**\n const parts = text.split(/(\\*\\*[^*]+\\*\\*|`[^`]+`)/g);\n return parts.map((part, i) => {\n if (part.startsWith('**') && part.endsWith('**')) {\n return <strong key={i} className=\"text-zinc-200 font-medium\">{part.slice(2, -2)}</strong>;\n }\n if (part.startsWith('`') && part.endsWith('`')) {\n return <code key={i} className=\"text-blue-400 bg-blue-500/10 px-1 rounded text-xs font-mono\">{part.slice(1, -1)}</code>;\n }\n return part;\n });\n };\n\n // Not run yet state\n if (!hasRun) {\n return (\n <div className=\"h-full flex flex-col items-center justify-center p-8 text-center\">\n <div className=\"w-14 h-14 rounded-2xl bg-gradient-to-br from-purple-500/20 to-blue-500/10 flex items-center justify-center mb-4\">\n <Sparkles strokeWidth={1.5} className=\"w-7 h-7 text-purple-400\" />\n </div>\n <h3 className=\"text-xs font-medium text-zinc-200 mb-1\">AI Query Analysis</h3>\n <p className=\"text-xs text-zinc-500 max-w-[280px] leading-relaxed mb-4\">\n Get a plain-language explanation of your query's execution plan with concrete optimization suggestions.\n </p>\n <button\n onClick={analyzeWithAI}\n disabled={!query}\n className={cn(\n \"flex items-center gap-2 px-4 py-2 rounded-lg text-xs font-medium transition-all\",\n query\n ? \"bg-purple-600 hover:bg-purple-500 text-white shadow-lg shadow-purple-900/20\"\n : \"bg-white/5 text-zinc-600 cursor-not-allowed\"\n )}\n >\n <Sparkles strokeWidth={1.5} className=\"w-3 h-3\" />\n Analyze with AI\n </button>\n {!query && (\n <p className=\"text-xs text-zinc-600 mt-2\">Run a query first to enable AI analysis.</p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col\">\n {/* Re-analyze button */}\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-white/5 bg-[#0a0a0a]\">\n <div className=\"flex items-center gap-2\">\n <Sparkles strokeWidth={1.5} className=\"w-3 h-3 text-purple-400\" />\n <span className=\"text-xs font-medium text-purple-400r\">AI Analysis</span>\n </div>\n <button\n onClick={analyzeWithAI}\n disabled={isLoading}\n className=\"flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium text-zinc-400 hover:text-white hover:bg-white/5 transition-all\"\n >\n {isLoading ? <Loader2 strokeWidth={1.5} className=\"w-3 h-3 animate-spin\" /> : <Sparkles strokeWidth={1.5} className=\"w-3 h-3\" />}\n {isLoading ? 'Analyzing...' : 'Re-analyze'}\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-4\">\n {error && (\n <div className=\"flex items-center gap-2 p-3 rounded-lg bg-red-500/5 border border-red-500/10 text-red-400 text-xs mb-4\">\n <AlertTriangle strokeWidth={1.5} className=\"w-3.5 h-3.5 shrink-0\" />\n {error}\n </div>\n )}\n\n {aiResponse && (\n <div className=\"space-y-0\">\n {renderMarkdown(aiResponse)}\n </div>\n )}\n\n {isLoading && !aiResponse && (\n <div className=\"flex items-center gap-3 text-zinc-500 text-xs\">\n <Loader2 strokeWidth={1.5} className=\"w-3.5 h-3.5 animate-spin text-purple-400\" />\n <span>Analyzing execution plan...</span>\n </div>\n )}\n\n {isLoading && aiResponse && (\n <div className=\"flex items-center gap-2 mt-2 text-zinc-600 text-xs\">\n <Loader2 strokeWidth={1.5} className=\"w-3 h-3 animate-spin\" />\n <span>Still generating...</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport function VisualExplain({ plan, query, schemaContext, databaseType, onLoadQuery }: VisualExplainProps) {\n const [activeTab, setActiveTab] = useState<'insights' | 'tree' | 'raw' | 'ai'>('insights');\n\n const analysis = useMemo(() => {\n if (!plan || !Array.isArray(plan) || plan.length === 0) return null;\n return analyzePlan(plan);\n }, [plan]);\n\n // Empty state\n if (!plan || !Array.isArray(plan) || plan.length === 0) {\n return (\n <div className=\"h-full flex flex-col items-center justify-center text-zinc-500 bg-[#080808] p-12 text-center\">\n <div className=\"w-12 h-12 rounded-xl bg-white/5 flex items-center justify-center mb-4\">\n <Activity strokeWidth={1.5} className=\"w-6 h-6 text-zinc-600\" />\n </div>\n <h3 className=\"text-xs font-medium text-zinc-300 mb-1\">No execution plan</h3>\n <p className=\"text-xs text-zinc-600 max-w-[240px]\">\n Run a SELECT query to see its execution plan and performance insights.\n </p>\n </div>\n );\n }\n\n const rootPlan = plan[0]?.Plan;\n\n return (\n <div className=\"h-full flex flex-col bg-[#080808]\">\n {/* Header Stats */}\n <div className=\"px-4 py-3 border-b border-white/5 bg-[#0a0a0a]\">\n <div className=\"flex items-center justify-between\">\n {/* Quick stats */}\n <div className=\"flex items-center gap-6\">\n <div className=\"flex items-center gap-2\">\n <Clock strokeWidth={1.5} className=\"w-3 h-3 text-blue-400\" />\n <span className=\"text-xs font-medium text-zinc-200\">\n {formatTime(analysis?.executionTime || 0)}\n </span>\n <span className=\"text-xs text-zinc-600\">execution</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <TrendingUp className=\"w-3 h-3 text-zinc-500\" />\n <span className=\"text-xs font-medium text-zinc-400\">\n {formatNumber(analysis?.totalRows || 0)}\n </span>\n <span className=\"text-xs text-zinc-600\">rows</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <HardDrive strokeWidth={1.5} className=\"w-3 h-3 text-zinc-500\" />\n <span className=\"text-xs font-medium text-zinc-400\">\n {formatNumber(analysis?.totalCost || 0)}\n </span>\n <span className=\"text-xs text-zinc-600\">cost</span>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"flex items-center gap-1 bg-white/5 rounded-lg p-0.5\">\n {(['insights', 'ai', 'tree', 'raw'] as const).map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n className={cn(\n \"px-3 py-1 text-xs font-medium rounded-md transition-all\",\n activeTab === tab\n ? tab === 'ai' ? \"bg-purple-500/20 text-purple-300\" : \"bg-white/10 text-zinc-200\"\n : \"text-zinc-500 hover:text-zinc-300\"\n )}\n >\n {tab === 'insights' && <Zap strokeWidth={1.5} className=\"w-3 h-3 inline mr-1\" />}\n {tab === 'ai' && <Sparkles strokeWidth={1.5} className=\"w-3 h-3 inline mr-1\" />}\n {tab === 'tree' && <Layers strokeWidth={1.5} className=\"w-3 h-3 inline mr-1\" />}\n {tab === 'raw' && <FileJson strokeWidth={1.5} className=\"w-3 h-3 inline mr-1\" />}\n {tab === 'ai' ? 'AI Explain' : tab}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto\">\n {activeTab === 'ai' && (\n <AIExplainTab\n plan={plan}\n query={query}\n schemaContext={schemaContext}\n databaseType={databaseType}\n onLoadQuery={onLoadQuery}\n />\n )}\n\n {activeTab === 'insights' && (\n <div className=\"p-4 space-y-4\">\n {/* Warnings */}\n {analysis && analysis.warnings.length > 0 && (\n <div className=\"space-y-2\">\n <h3 className=\"text-xs font-medium text-zinc-500r mb-2\">\n Performance Issues\n </h3>\n {analysis.warnings.map((warning, idx) => (\n <div\n key={idx}\n className={cn(\n \"flex items-start gap-3 p-3 rounded-lg border\",\n warning.type === 'critical'\n ? \"bg-red-500/5 border-red-500/10\"\n : warning.type === 'warning'\n ? \"bg-amber-500/5 border-amber-500/10\"\n : \"bg-blue-500/5 border-blue-500/10\"\n )}\n >\n <div className={cn(\n \"p-1 rounded\",\n warning.type === 'critical'\n ? \"bg-red-500/10\"\n : warning.type === 'warning'\n ? \"bg-amber-500/10\"\n : \"bg-blue-500/10\"\n )}>\n {warning.type === 'critical' ? (\n <AlertTriangle strokeWidth={1.5} className=\"w-3 h-3 text-red-400\" />\n ) : warning.type === 'warning' ? (\n <AlertTriangle strokeWidth={1.5} className=\"w-3 h-3 text-amber-400\" />\n ) : (\n <Info strokeWidth={1.5} className=\"w-3 h-3 text-blue-400\" />\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <h4 className={cn(\n \"text-xs font-medium\",\n warning.type === 'critical'\n ? \"text-red-300\"\n : warning.type === 'warning'\n ? \"text-amber-300\"\n : \"text-blue-300\"\n )}>\n {warning.title}\n </h4>\n <p className=\"text-xs text-zinc-500 mt-0.5 leading-relaxed\">\n {warning.description}\n </p>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* No warnings */}\n {analysis && analysis.warnings.length === 0 && (\n <div className=\"flex items-center gap-3 p-3 rounded-lg bg-emerald-500/5 border border-emerald-500/10\">\n <div className=\"p-1 rounded bg-emerald-500/10\">\n <CheckCircle2 strokeWidth={1.5} className=\"w-3 h-3 text-emerald-400\" />\n </div>\n <div>\n <h4 className=\"text-xs font-medium text-emerald-300\">Query looks good</h4>\n <p className=\"text-xs text-zinc-500\">No obvious performance issues detected.</p>\n </div>\n </div>\n )}\n\n {/* Metrics Grid */}\n <div className=\"grid grid-cols-3 gap-2\">\n {analysis?.insights.map((insight, idx) => (\n <div key={idx} className=\"p-3 rounded-lg bg-white/[0.02] border border-white/5\">\n <div className=\"flex items-center gap-2 mb-1\">\n <StatusBadge status={insight.status} />\n <span className=\"text-[0.625rem] text-zinc-500r font-medium\">\n {insight.label}\n </span>\n </div>\n <span className=\"text-xs font-medium text-zinc-200\">{insight.value}</span>\n </div>\n ))}\n </div>\n\n {/* Plan tree preview */}\n <div>\n <h3 className=\"text-xs font-medium text-zinc-500r mb-2\">\n Execution Plan\n </h3>\n <div className=\"rounded-lg border border-white/5 bg-white/[0.01] p-2\">\n {rootPlan && analysis && (\n <PlanNode node={rootPlan} maxTime={analysis.executionTime || 1} />\n )}\n </div>\n </div>\n </div>\n )}\n\n {activeTab === 'tree' && (\n <div className=\"p-4\">\n <div className=\"rounded-lg border border-white/5 bg-white/[0.01] p-2\">\n {rootPlan && analysis && (\n <PlanNode node={rootPlan} maxTime={analysis.executionTime || 1} />\n )}\n </div>\n </div>\n )}\n\n {activeTab === 'raw' && (\n <div className=\"p-4\">\n <pre className=\"text-xs font-mono text-zinc-400 bg-white/[0.02] rounded-lg p-4 overflow-auto border border-white/5\">\n {JSON.stringify(plan, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useRef, useEffect, type FormEvent } from 'react';\nimport { Send, Loader2, Sparkles, X, Play, MessageSquare, Trash2 } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\ninterface ConversationMessage {\n role: 'user' | 'assistant';\n content: string;\n query?: string; // Extracted SQL/JSON query from assistant response\n}\n\ninterface NL2SQLPanelProps {\n isOpen: boolean;\n onClose: () => void;\n onExecuteQuery: (query: string) => void;\n onLoadQuery: (query: string) => void;\n schemaContext: string;\n databaseType?: string;\n queryLanguage?: string;\n /** Optional API adapter: when provided, bypasses the built-in /api/ai/nl2sql fetch. */\n onNL2SQL?: (params: { prompt: string; schemaContext: string; conversationHistory?: { role: string; content: string }[] }) => Promise<string>;\n}\n\nfunction extractCodeBlock(text: string): string | null {\n // Match ```sql ... ``` or ```json ... ``` or plain ``` ... ```\n const match = text.match(/```(?:sql|json|mongodb)?\\s*\\n?([\\s\\S]*?)```/);\n return match ? match[1].trim() : null;\n}\n\nexport function NL2SQLPanel({\n isOpen,\n onClose,\n onExecuteQuery,\n onLoadQuery,\n schemaContext,\n databaseType,\n queryLanguage,\n onNL2SQL,\n}: NL2SQLPanelProps) {\n const [question, setQuestion] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [messages, setMessages] = useState<ConversationMessage[]>([]);\n const [error, setError] = useState<string | null>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages]);\n\n useEffect(() => {\n if (isOpen) inputRef.current?.focus();\n }, [isOpen]);\n\n const handleSubmit = async (e?: FormEvent) => {\n if (e) e.preventDefault();\n if (!question.trim() || isLoading) return;\n\n const userMsg: ConversationMessage = { role: 'user', content: question.trim() };\n setMessages(prev => [...prev, userMsg]);\n setQuestion('');\n setIsLoading(true);\n setError(null);\n\n try {\n // Build filtered schema context (top 100 tables)\n let filteredSchema = '';\n if (schemaContext) {\n try {\n const tables = JSON.parse(schemaContext);\n const sorted = [...tables]\n .sort((a: { rowCount?: number }, b: { rowCount?: number }) => (b.rowCount || 0) - (a.rowCount || 0))\n .slice(0, 100);\n filteredSchema = sorted.map((t: { name: string; rowCount?: number; columns?: { name: string; type: string; isPrimary?: boolean }[] }) => {\n const cols = t.columns?.slice(0, 10).map(c => `${c.name} (${c.type}${c.isPrimary ? ', PK' : ''})`).join(', ') || '';\n return `Table: ${t.name} (${t.rowCount || 0} rows)\\nColumns: ${cols}`;\n }).join('\\n\\n');\n } catch {\n filteredSchema = schemaContext.substring(0, 3000);\n }\n }\n\n // Build conversation history (exclude current question)\n const history = messages.map(m => ({ role: m.role, content: m.content }));\n\n let fullResponse = '';\n\n if (onNL2SQL) {\n // Platform adapter: use callback instead of fetch\n fullResponse = await onNL2SQL({\n prompt: question.trim(),\n schemaContext: filteredSchema,\n conversationHistory: history,\n });\n } else {\n // Default: existing fetch behavior\n const response = await fetch('/api/ai/nl2sql', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n question: question.trim(),\n schemaContext: filteredSchema,\n databaseType,\n queryLanguage,\n conversationHistory: history,\n }),\n });\n\n if (!response.ok) {\n const errData = await response.json();\n throw new Error(errData.error || 'Request failed');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader');\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n fullResponse += new TextDecoder().decode(value);\n }\n }\n\n const extractedQuery = extractCodeBlock(fullResponse);\n const assistantMsg: ConversationMessage = {\n role: 'assistant',\n content: fullResponse,\n query: extractedQuery || undefined,\n };\n setMessages(prev => [...prev, assistantMsg]);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n setError(msg);\n } finally {\n setIsLoading(false);\n }\n };\n\n const clearConversation = () => {\n setMessages([]);\n setError(null);\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"h-full flex flex-col bg-[#080808]\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-white/5 bg-[#0a0a0a]\">\n <div className=\"flex items-center gap-2\">\n <div className=\"p-1 rounded bg-violet-500/10\">\n <MessageSquare strokeWidth={1.5} className=\"w-3 h-3 text-violet-400\" />\n </div>\n <span className=\"text-xs font-medium text-violet-400\">\n Natural Language Query\n </span>\n {messages.length > 0 && (\n <span className=\"text-[0.625rem] text-zinc-500 font-mono\">\n {messages.filter(m => m.role === 'user').length} questions\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n {messages.length > 0 && (\n <button\n onClick={clearConversation}\n className=\"p-1.5 rounded hover:bg-white/5 text-zinc-500 hover:text-zinc-300 transition-colors\"\n title=\"Clear conversation\"\n >\n <Trash2 strokeWidth={1.5} className=\"w-3 h-3\" />\n </button>\n )}\n <button\n onClick={onClose}\n className=\"p-1.5 rounded hover:bg-white/5 text-zinc-500 hover:text-zinc-300 transition-colors\"\n >\n <X strokeWidth={1.5} className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n {/* Messages */}\n <div className=\"flex-1 overflow-auto p-4 space-y-3\">\n {messages.length === 0 && (\n <div className=\"flex flex-col items-center justify-center h-full opacity-40\">\n <Sparkles strokeWidth={1.5} className=\"w-8 h-8 mb-3\" />\n <p className=\"text-xs font-medium\">Ask a question in plain English</p>\n <p className=\"text-xs text-zinc-500 mt-1\">\n e.g. "Show me the top 10 employees by salary"\n </p>\n </div>\n )}\n\n {messages.map((msg, i) => (\n <div key={i} className={cn(\"flex gap-2\", msg.role === 'user' ? \"justify-end\" : \"justify-start\")}>\n <div className={cn(\n \"max-w-[85%] rounded-lg px-3 py-2 text-xs\",\n msg.role === 'user'\n ? \"bg-violet-600/20 border border-violet-500/20 text-zinc-200\"\n : \"bg-[#111] border border-white/5 text-zinc-300\"\n )}>\n {msg.role === 'user' ? (\n <p>{msg.content}</p>\n ) : (\n <div>\n {/* Show extracted query with action buttons */}\n {msg.query && (\n <div className=\"mb-2\">\n <pre className=\"bg-[#050505] rounded p-2 text-xs font-mono text-blue-300 overflow-x-auto whitespace-pre-wrap border border-white/5\">\n {msg.query}\n </pre>\n <div className=\"flex gap-1.5 mt-1.5\">\n <button\n onClick={() => onExecuteQuery(msg.query!)}\n className=\"flex items-center gap-1 px-2 py-1 rounded bg-blue-600/20 border border-blue-500/20 text-blue-400 text-xs font-medium hover:bg-blue-600/30 transition-colors\"\n >\n <Play strokeWidth={1.5} className=\"w-3 h-3 fill-current\" /> Run\n </button>\n <button\n onClick={() => onLoadQuery(msg.query!)}\n className=\"flex items-center gap-1 px-2 py-1 rounded bg-white/5 border border-white/5 text-zinc-400 text-xs font-medium hover:bg-white/10 transition-colors\"\n >\n Load to Editor\n </button>\n </div>\n </div>\n )}\n {/* Show explanation text (non-code parts) */}\n {msg.content.replace(/```[\\s\\S]*?```/g, '').trim() && (\n <p className=\"text-zinc-400 text-xs leading-relaxed whitespace-pre-wrap\">\n {msg.content.replace(/```[\\s\\S]*?```/g, '').trim()}\n </p>\n )}\n </div>\n )}\n </div>\n </div>\n ))}\n\n {isLoading && (\n <div className=\"flex gap-2 justify-start\">\n <div className=\"bg-[#111] border border-white/5 rounded-lg px-3 py-2 flex items-center gap-2 text-zinc-500 text-xs\">\n <Loader2 strokeWidth={1.5} className=\"w-3 h-3 animate-spin\" />\n Generating query...\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2 text-xs text-red-400\">\n {error}\n </div>\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input */}\n <form onSubmit={handleSubmit} className=\"border-t border-white/5 p-3 bg-[#0a0a0a]\">\n <div className=\"flex items-center gap-2\">\n <input\n ref={inputRef}\n value={question}\n onChange={(e) => setQuestion(e.target.value)}\n placeholder=\"Ask in plain English... (e.g. 'How many employees were hired in 1986?')\"\n className=\"flex-1 bg-[#111] border border-white/10 rounded-lg px-3 py-2 text-xs text-zinc-200 placeholder:text-zinc-600 outline-none focus:border-violet-500/30\"\n disabled={isLoading}\n />\n <button\n type=\"submit\"\n disabled={isLoading || !question.trim()}\n className=\"bg-violet-600 hover:bg-violet-500 disabled:opacity-50 px-3 py-2 rounded-lg text-white text-xs font-medium transition-colors flex items-center gap-1.5\"\n >\n {isLoading ? <Loader2 strokeWidth={1.5} className=\"w-3 h-3 animate-spin\" /> : <Send strokeWidth={1.5} className=\"w-3 h-3\" />}\n </button>\n </div>\n </form>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { Loader2, BarChart3, X, Hash, AlertCircle, Sparkles, Lock } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { TableSchema, DatabaseConnection } from '@/lib/types';\nimport { detectSensitiveColumns, maskValue } from '@/lib/data-masking';\n\ninterface ColumnProfile {\n name: string;\n type?: string;\n totalRows: number;\n nullCount: number;\n nullPercent: number;\n distinctCount: number;\n minValue?: string;\n maxValue?: string;\n sampleValues?: string[];\n error?: string;\n}\n\ninterface ProfileData {\n tableName: string;\n totalRows: number;\n columns: ColumnProfile[];\n}\n\ninterface DataProfilerProps {\n isOpen: boolean;\n onClose: () => void;\n tableName: string;\n tableSchema: TableSchema | null;\n connection: DatabaseConnection | null;\n schemaContext?: string;\n databaseType?: string;\n /** Optional API adapter: when provided, bypasses the built-in /api/db/profile fetch. */\n onProfile?: (params: { connectionId: string; tableName: string }) => Promise<ProfileData>;\n /** Optional API adapter: when provided, bypasses the built-in /api/ai/describe-schema fetch. */\n onDescribeSchema?: (params: { tableName: string; schemaContext: string }) => Promise<string>;\n}\n\nexport function DataProfiler({\n isOpen,\n onClose,\n tableName,\n tableSchema,\n connection,\n schemaContext,\n databaseType,\n onProfile,\n onDescribeSchema,\n}: DataProfilerProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [profile, setProfile] = useState<ProfileData | null>(null);\n const [aiSummary, setAiSummary] = useState('');\n const [isAiLoading, setIsAiLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Detect sensitive columns for masking sample values in profiler\n const sensitiveColumnNames = useMemo(() => {\n if (!tableSchema?.columns) return new Map();\n return detectSensitiveColumns(tableSchema.columns.map(c => c.name));\n }, [tableSchema]);\n\n useEffect(() => {\n if (isOpen && tableName && connection) {\n fetchProfile();\n }\n return () => {\n setProfile(null);\n setAiSummary('');\n setError(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, tableName]);\n\n const fetchProfile = async () => {\n if (!connection || !tableSchema) return;\n setIsLoading(true);\n setError(null);\n\n try {\n let data: ProfileData;\n\n if (onProfile) {\n // Platform adapter: use callback instead of fetch\n data = await onProfile({ connectionId: connection.id, tableName });\n } else {\n // Default: existing fetch behavior\n const columns = tableSchema.columns?.map(c => c.name) || [];\n const response = await fetch('/api/db/profile', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ connection, tableName, columns }),\n });\n\n if (!response.ok) {\n const err = await response.json();\n throw new Error(err.error || 'Profile failed');\n }\n\n data = await response.json();\n }\n\n setProfile(data);\n\n // Trigger AI summary\n fetchAiSummary(data);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsLoading(false);\n }\n };\n\n const fetchAiSummary = async (data: ProfileData) => {\n setIsAiLoading(true);\n try {\n const profileSummary = data.columns.map(c =>\n `${c.name}: ${c.nullPercent}% null, ${c.distinctCount} distinct, min=${c.minValue || 'N/A'}, max=${c.maxValue || 'N/A'}`\n ).join('\\n');\n\n const fullSchemaContext = `Table: ${tableName} (${data.totalRows} rows)\\n\\nColumn Profiles:\\n${profileSummary}\\n\\nSchema:\\n${schemaContext || ''}`;\n\n if (onDescribeSchema) {\n // Platform adapter: use callback instead of fetch\n const result = await onDescribeSchema({ tableName, schemaContext: fullSchemaContext });\n setAiSummary(result);\n } else {\n // Default: existing fetch behavior\n const response = await fetch('/api/ai/describe-schema', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n schemaContext: fullSchemaContext,\n databaseType,\n mode: 'table',\n }),\n });\n\n if (!response.ok) return;\n\n const reader = response.body?.getReader();\n if (!reader) return;\n\n let full = '';\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n full += new TextDecoder().decode(value);\n setAiSummary(full);\n }\n }\n } catch {\n // AI summary is optional, don't show error\n } finally {\n setIsAiLoading(false);\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n <div className=\"bg-[#111] border border-white/10 rounded-xl shadow-2xl w-full max-w-2xl mx-4 max-h-[85vh] flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-3 border-b border-white/5\">\n <div className=\"flex items-center gap-2\">\n <BarChart3 strokeWidth={1.5} className=\"w-3.5 h-3.5 text-cyan-400\" />\n <span className=\"text-xs font-medium text-zinc-200\">Data Profiler</span>\n <span className=\"text-xs text-zinc-500 font-mono\">{tableName}</span>\n </div>\n <button onClick={onClose} className=\"p-1 rounded hover:bg-white/5 text-zinc-500\">\n <X strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-5 space-y-4\">\n {isLoading && (\n <div className=\"flex items-center justify-center gap-2 py-12 text-zinc-500\">\n <Loader2 strokeWidth={1.5} className=\"w-5 h-5 animate-spin\" />\n <span className=\"text-xs\">Profiling {tableName}...</span>\n </div>\n )}\n\n {error && (\n <div className=\"bg-red-500/10 border border-red-500/20 rounded-lg p-3 text-xs text-red-400 flex items-center gap-2\">\n <AlertCircle strokeWidth={1.5} className=\"w-3.5 h-3.5 shrink-0\" />\n {error}\n </div>\n )}\n\n {profile && (\n <>\n {/* Summary Stats */}\n <div className=\"grid grid-cols-3 gap-3\">\n <div className=\"bg-[#0a0a0a] rounded-lg p-3 border border-white/5\">\n <p className=\"text-xs font-medium text-zinc-500r\">Total Rows</p>\n <p className=\"text-xs font-medium text-zinc-200 mt-1\">{profile.totalRows.toLocaleString()}</p>\n </div>\n <div className=\"bg-[#0a0a0a] rounded-lg p-3 border border-white/5\">\n <p className=\"text-xs font-medium text-zinc-500r\">Columns</p>\n <p className=\"text-xs font-medium text-zinc-200 mt-1\">{profile.columns.length}</p>\n </div>\n <div className=\"bg-[#0a0a0a] rounded-lg p-3 border border-white/5\">\n <p className=\"text-xs font-medium text-zinc-500r\">Avg Null %</p>\n <p className=\"text-xs font-medium text-zinc-200 mt-1\">\n {profile.columns.length > 0\n ? Math.round(profile.columns.reduce((sum, c) => sum + c.nullPercent, 0) / profile.columns.length)\n : 0}%\n </p>\n </div>\n </div>\n\n {/* Column Profiles */}\n <div className=\"space-y-2\">\n <h3 className=\"text-xs font-medium text-zinc-400r\">Column Profiles</h3>\n {profile.columns.map((col) => (\n <div key={col.name} className=\"bg-[#0a0a0a] rounded-lg p-3 border border-white/5\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <Hash strokeWidth={1.5} className=\"w-3 h-3 text-blue-400\" />\n <span className=\"text-xs font-medium text-zinc-200\">{col.name}</span>\n {col.type && (\n <span className=\"text-xs text-zinc-500 font-mono\">{col.type}</span>\n )}\n {sensitiveColumnNames.has(col.name) && (\n <span title=\"Sensitive column - values masked\"><Lock strokeWidth={1.5} className=\"w-3 h-3 text-purple-400\" /></span>\n )}\n </div>\n <span className=\"text-xs text-zinc-500\">\n {col.distinctCount.toLocaleString()} distinct\n </span>\n </div>\n\n {col.error ? (\n <p className=\"text-xs text-amber-400\">{col.error}</p>\n ) : (\n <>\n {/* Null bar */}\n <div className=\"flex items-center gap-2 mb-1.5\">\n <div className=\"flex-1 h-1.5 bg-zinc-800 rounded-full overflow-hidden\">\n <div\n className={cn(\n \"h-full rounded-full transition-all\",\n col.nullPercent > 50 ? \"bg-red-500\" :\n col.nullPercent > 20 ? \"bg-amber-500\" :\n \"bg-emerald-500\"\n )}\n style={{ width: `${100 - col.nullPercent}%` }}\n />\n </div>\n <span className={cn(\n \"text-xs font-mono w-10 text-right\",\n col.nullPercent > 50 ? \"text-red-400\" :\n col.nullPercent > 20 ? \"text-amber-400\" :\n \"text-emerald-400\"\n )}>\n {col.nullPercent}% null\n </span>\n </div>\n\n {/* Min/Max */}\n <div className=\"flex gap-4 text-xs\">\n {col.minValue && (() => {\n const rule = sensitiveColumnNames.get(col.name);\n const display = rule\n ? maskValue(col.minValue, rule)\n : col.minValue.substring(0, 30);\n return (\n <span className=\"text-zinc-500\">\n min: <span className={cn(\"font-mono\", rule ? \"text-zinc-500 italic\" : \"text-zinc-400\")}>{display}</span>\n </span>\n );\n })()}\n {col.maxValue && (() => {\n const rule = sensitiveColumnNames.get(col.name);\n const display = rule\n ? maskValue(col.maxValue, rule)\n : col.maxValue.substring(0, 30);\n return (\n <span className=\"text-zinc-500\">\n max: <span className={cn(\"font-mono\", rule ? \"text-zinc-500 italic\" : \"text-zinc-400\")}>{display}</span>\n </span>\n );\n })()}\n </div>\n\n {/* Sample Values */}\n {col.sampleValues && col.sampleValues.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-1.5\">\n {col.sampleValues.map((val, i) => {\n const rule = sensitiveColumnNames.get(col.name);\n const display = rule\n ? maskValue(val, rule)\n : val.substring(0, 20);\n return (\n <span key={i} className={cn(\"text-xs px-1.5 py-0.5 bg-zinc-800 rounded font-mono\", rule ? \"text-zinc-500 italic\" : \"text-zinc-400\")}>\n {display}\n </span>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n ))}\n </div>\n\n {/* AI Summary */}\n {(aiSummary || isAiLoading) && (\n <div className=\"bg-cyan-500/5 border border-cyan-500/10 rounded-lg p-4\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Sparkles strokeWidth={1.5} className=\"w-3.5 h-3.5 text-cyan-400\" />\n <span className=\"text-xs font-medium text-cyan-400r\">\n AI Analysis\n </span>\n {isAiLoading && <Loader2 strokeWidth={1.5} className=\"w-3 h-3 animate-spin text-cyan-400\" />}\n </div>\n {aiSummary && (\n <div className=\"text-xs text-zinc-400 leading-relaxed whitespace-pre-wrap\">\n {aiSummary}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from 'react';\nimport { ShieldAlert, ShieldCheck, AlertTriangle, Loader2, Play, X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\ninterface SafetyAnalysis {\n riskLevel: 'safe' | 'low' | 'medium' | 'high' | 'critical';\n summary: string;\n warnings: {\n type: string;\n severity: string;\n message: string;\n detail: string;\n }[];\n affectedRows: string;\n cascadeEffects: string;\n recommendation: string;\n}\n\ninterface QuerySafetyDialogProps {\n isOpen: boolean;\n query: string;\n schemaContext: string;\n databaseType?: string;\n onClose: () => void;\n onProceed: () => void;\n /** Optional API adapter: when provided, bypasses the built-in /api/ai/query-safety fetch. */\n onAnalyzeSafety?: (params: { query: string; schemaContext: string }) => Promise<SafetyAnalysis>;\n}\n\nfunction parseSafetyResponse(text: string): SafetyAnalysis | null {\n try {\n const match = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)```/);\n if (match) {\n return JSON.parse(match[1].trim());\n }\n // Try parsing the entire text as JSON\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n}\n\nconst RISK_CONFIG = {\n safe: { color: 'text-emerald-400', bg: 'bg-emerald-500/10', border: 'border-emerald-500/20', icon: ShieldCheck, label: 'Safe' },\n low: { color: 'text-blue-400', bg: 'bg-blue-500/10', border: 'border-blue-500/20', icon: ShieldCheck, label: 'Low Risk' },\n medium: { color: 'text-amber-400', bg: 'bg-amber-500/10', border: 'border-amber-500/20', icon: AlertTriangle, label: 'Medium Risk' },\n high: { color: 'text-orange-400', bg: 'bg-orange-500/10', border: 'border-orange-500/20', icon: ShieldAlert, label: 'High Risk' },\n critical: { color: 'text-red-400', bg: 'bg-red-500/10', border: 'border-red-500/20', icon: ShieldAlert, label: 'Critical Risk' },\n};\n\nexport function QuerySafetyDialog({\n isOpen,\n query,\n schemaContext,\n databaseType,\n onClose,\n onProceed,\n onAnalyzeSafety,\n}: QuerySafetyDialogProps) {\n const [isAnalyzing, setIsAnalyzing] = useState(false);\n const [analysis, setAnalysis] = useState<SafetyAnalysis | null>(null);\n const [rawResponse, setRawResponse] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (isOpen && query) {\n analyzeQuery();\n }\n return () => {\n setAnalysis(null);\n setRawResponse('');\n setError(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, query]);\n\n const analyzeQuery = async () => {\n setIsAnalyzing(true);\n setError(null);\n\n try {\n let filteredSchema = '';\n if (schemaContext) {\n try {\n const tables = JSON.parse(schemaContext);\n filteredSchema = tables.slice(0, 30).map((t: { name: string; rowCount?: number; columns?: { name: string; type: string }[] }) => {\n const cols = t.columns?.slice(0, 8).map(c => `${c.name} (${c.type})`).join(', ') || '';\n return `${t.name} (${t.rowCount || 0} rows): ${cols}`;\n }).join('\\n');\n } catch {\n filteredSchema = schemaContext.substring(0, 2000);\n }\n }\n\n if (onAnalyzeSafety) {\n // Platform adapter: use callback instead of fetch\n const result = await onAnalyzeSafety({ query, schemaContext: filteredSchema });\n setAnalysis(result);\n } else {\n // Default: existing fetch behavior\n const response = await fetch('/api/ai/query-safety', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, schemaContext: filteredSchema, databaseType }),\n });\n\n if (!response.ok) {\n const errData = await response.json();\n throw new Error(errData.error || 'Analysis failed');\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No reader');\n\n let fullResponse = '';\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n fullResponse += new TextDecoder().decode(value);\n setRawResponse(fullResponse);\n }\n\n const parsed = parseSafetyResponse(fullResponse);\n if (parsed) {\n setAnalysis(parsed);\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setIsAnalyzing(false);\n }\n };\n\n if (!isOpen) return null;\n\n const risk = analysis ? RISK_CONFIG[analysis.riskLevel] || RISK_CONFIG.medium : null;\n const RiskIcon = risk?.icon || ShieldAlert;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n <div className=\"bg-[#111] border border-white/10 rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-3 border-b border-white/5\">\n <div className=\"flex items-center gap-2\">\n <ShieldAlert strokeWidth={1.5} className=\"w-3.5 h-3.5 text-amber-400\" />\n <span className=\"text-xs font-medium text-zinc-200\">Query Safety Check</span>\n </div>\n <button onClick={onClose} className=\"p-1 rounded hover:bg-white/5 text-zinc-500\">\n <X strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Query Preview */}\n <div className=\"px-5 py-3 bg-[#0a0a0a] border-b border-white/5\">\n <pre className=\"text-xs font-mono text-zinc-400 whitespace-pre-wrap max-h-24 overflow-auto\">\n {query.length > 300 ? query.substring(0, 300) + '...' : query}\n </pre>\n </div>\n\n {/* Analysis */}\n <div className=\"px-5 py-4 max-h-80 overflow-auto\">\n {isAnalyzing && (\n <div className=\"flex items-center justify-center gap-2 py-8 text-zinc-500\">\n <Loader2 strokeWidth={1.5} className=\"w-5 h-5 animate-spin\" />\n <span className=\"text-xs\">Analyzing query safety...</span>\n </div>\n )}\n\n {error && (\n <div className=\"bg-red-500/10 border border-red-500/20 rounded-lg p-3 text-xs text-red-400\">\n {error}\n </div>\n )}\n\n {analysis && risk && (\n <div className=\"space-y-3\">\n {/* Risk Badge */}\n <div className={cn(\"flex items-center gap-2 px-3 py-2 rounded-lg\", risk.bg, \"border\", risk.border)}>\n <RiskIcon className={cn(\"w-5 h-5\", risk.color)} />\n <div>\n <span className={cn(\"text-xs font-medium\", risk.color)}>{risk.label}</span>\n <p className=\"text-xs text-zinc-400 mt-0.5\">{analysis.summary}</p>\n </div>\n </div>\n\n {/* Warnings */}\n {analysis.warnings?.length > 0 && (\n <div className=\"space-y-2\">\n {analysis.warnings.map((w, i) => (\n <div key={i} className={cn(\n \"px-3 py-2 rounded-lg border text-xs\",\n w.severity === 'critical' ? 'bg-red-500/5 border-red-500/20' :\n w.severity === 'warning' ? 'bg-amber-500/5 border-amber-500/20' :\n 'bg-blue-500/5 border-blue-500/20'\n )}>\n <p className=\"font-medium text-zinc-300\">{w.message}</p>\n <p className=\"text-zinc-500 mt-0.5\">{w.detail}</p>\n </div>\n ))}\n </div>\n )}\n\n {/* Affected Rows */}\n {analysis.affectedRows && analysis.affectedRows !== 'none' && (\n <div className=\"text-xs\">\n <span className=\"text-zinc-500\">Affected rows: </span>\n <span className=\"text-zinc-300 font-mono\">{analysis.affectedRows}</span>\n </div>\n )}\n\n {/* Cascade */}\n {analysis.cascadeEffects && analysis.cascadeEffects !== 'none' && (\n <div className=\"text-xs\">\n <span className=\"text-zinc-500\">Cascade effects: </span>\n <span className=\"text-zinc-300\">{analysis.cascadeEffects}</span>\n </div>\n )}\n\n {/* Recommendation */}\n {analysis.recommendation && (\n <div className=\"bg-[#0a0a0a] rounded-lg p-3 border border-white/5\">\n <p className=\"text-xs font-medium text-zinc-500r mb-1\">Recommendation</p>\n <p className=\"text-xs text-zinc-300\">{analysis.recommendation}</p>\n </div>\n )}\n </div>\n )}\n\n {/* Show raw response if parsing failed */}\n {!isAnalyzing && !analysis && rawResponse && !error && (\n <div className=\"text-xs text-zinc-400 whitespace-pre-wrap\">{rawResponse}</div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-2 px-5 py-3 border-t border-white/5 bg-[#0a0a0a]\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 rounded-lg bg-white/5 text-zinc-400 text-xs font-medium hover:bg-white/10 transition-colors\"\n >\n Cancel\n </button>\n <button\n onClick={onProceed}\n disabled={isAnalyzing}\n className={cn(\n \"px-4 py-2 rounded-lg text-white text-xs font-medium transition-colors flex items-center gap-1.5\",\n analysis?.riskLevel === 'critical' || analysis?.riskLevel === 'high'\n ? \"bg-red-600 hover:bg-red-500\"\n : \"bg-blue-600 hover:bg-blue-500\",\n isAnalyzing && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <Play strokeWidth={1.5} className=\"w-3 h-3 fill-current\" />\n {analysis?.riskLevel === 'critical' ? 'Execute Anyway' :\n analysis?.riskLevel === 'high' ? 'Proceed with Caution' :\n 'Execute Query'}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * Detect if a query is potentially dangerous and should trigger safety analysis.\n */\nexport function isDangerousQuery(query: string): boolean {\n const normalized = query.trim().toUpperCase();\n\n // Dangerous patterns\n const patterns = [\n /^\\s*DELETE\\b/i,\n /^\\s*DROP\\b/i,\n /^\\s*TRUNCATE\\b/i,\n /^\\s*ALTER\\b/i,\n /\\bUPDATE\\b[\\s\\S]*?\\bSET\\b/i,\n /^\\s*GRANT\\b/i,\n /^\\s*REVOKE\\b/i,\n ];\n\n // Check for UPDATE/DELETE without WHERE (most dangerous)\n if (/^\\s*DELETE\\b/i.test(normalized) && !/\\bWHERE\\b/.test(normalized)) return true;\n if (/\\bUPDATE\\b[\\s\\S]*?\\bSET\\b/i.test(normalized) && !/\\bWHERE\\b/.test(normalized)) return true;\n\n return patterns.some(p => p.test(query));\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction ContextMenu({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuTrigger({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" {...props} />\n )\n}\n\nfunction ContextMenuGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return (\n <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n )\n}\n\nfunction ContextMenuPortal({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n )\n}\n\nfunction ContextMenuSub({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\n}\n\nfunction ContextMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n )\n}\n\nfunction ContextMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-context-menu-content-available-height) min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem>) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"text-foreground px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","import React from 'react';\nimport { TableSchema } from '@/lib/types';\nimport { Key, Hash } from 'lucide-react';\n\ninterface ColumnListProps {\n columns: TableSchema['columns'];\n indexes: TableSchema['indexes'];\n}\n\nexport const ColumnList = React.memo(function ColumnList({ columns, indexes }: ColumnListProps) {\n return (\n <div className=\"pl-6 pr-2 py-1 space-y-0.5 border-l border-border/30 ml-3.5 mt-0.5 mb-1\">\n {columns.map((column) => (\n <div\n key={column.name}\n className=\"flex items-center gap-2 py-1 px-2 rounded-sm group/col hover:bg-accent/20 cursor-default\"\n >\n {column.isPrimary ? (\n <Key strokeWidth={1.5} className=\"w-2.5 h-2.5 text-yellow-500/70\" />\n ) : (\n <div className=\"w-2.5 h-2.5 flex items-center justify-center\">\n <div className=\"w-1 h-1 rounded-full bg-muted-foreground/50\" />\n </div>\n )}\n\n <span className=\"text-xs text-muted-foreground flex-1 truncate group-hover/col:text-foreground\">\n {column.name}\n </span>\n\n <span className=\"text-xs font-mono text-muted-foreground/60 uppercase group-hover/col:text-muted-foreground\">\n {column.type.split('(')[0]}\n </span>\n </div>\n ))}\n {indexes.length > 0 && (\n <div className=\"pt-2 pb-1\">\n <div className=\"flex items-center gap-1.5 px-2 mb-1\">\n <Hash strokeWidth={1.5} className=\"w-2.5 h-2.5 text-purple-500/40\" />\n <span className=\"text-[0.625rem] font-medium text-muted-foreground\">Indexes</span>\n </div>\n {indexes.map(idx => (\n <div key={idx.name} className=\"flex items-center gap-2 py-0.5 px-2\">\n <div className=\"w-2.5 h-2.5\" />\n <span className=\"text-xs text-muted-foreground italic truncate\" title={Array.isArray(idx.columns) ? idx.columns.join(', ') : ''}>\n {idx.name}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n});\n","import React from 'react';\nimport { TableSchema } from '@/lib/types';\nimport type { ProviderMetadata } from '@/hooks/use-provider-metadata';\nimport {\n Search,\n Table as TableIcon,\n Play,\n ChevronRight,\n Filter,\n MoreVertical,\n Copy,\n Trash2,\n Code,\n BarChart3,\n Wand2,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n} from '@/components/ui/dropdown-menu';\nimport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n} from '@/components/ui/context-menu';\nimport { toast } from 'sonner';\nimport { ColumnList } from './ColumnList';\n\ninterface TableItemProps {\n table: TableSchema;\n isExpanded: boolean;\n onToggle: () => void;\n labels?: ProviderMetadata['labels'];\n isAdmin: boolean;\n onTableClick?: (tableName: string) => void;\n onGenerateSelect?: (tableName: string) => void;\n onProfileTable?: (tableName: string) => void;\n onGenerateCode?: (tableName: string) => void;\n onGenerateTestData?: (tableName: string) => void;\n onOpenMaintenance?: (tab?: 'global' | 'tables' | 'sessions', table?: string) => void;\n}\n\nfunction renderMenuItems(\n table: TableSchema,\n labels: TableItemProps['labels'],\n isAdmin: boolean,\n callbacks: {\n onTableClick?: (tableName: string) => void;\n onGenerateSelect?: (tableName: string) => void;\n onProfileTable?: (tableName: string) => void;\n onGenerateCode?: (tableName: string) => void;\n onGenerateTestData?: (tableName: string) => void;\n onOpenMaintenance?: (tab?: 'global' | 'tables' | 'sessions', table?: string) => void;\n },\n copyToClipboard: (text: string, label: string) => void,\n Item: React.ComponentType<{ onClick?: () => void; children: React.ReactNode }>,\n Separator: React.ComponentType,\n): React.ReactNode {\n return (\n <>\n <Item onClick={() => callbacks.onTableClick?.(table.name)}>\n <Play strokeWidth={1.5} className=\"w-3.5 h-3.5 mr-2 text-green-500\" />\n {labels?.selectAction || 'Select Top 100'}\n </Item>\n <Item onClick={() => callbacks.onGenerateSelect?.(table.name)}>\n <Filter strokeWidth={1.5} className=\"w-3.5 h-3.5 mr-2 text-blue-500\" />\n {labels?.generateAction || 'Generate Query'}\n </Item>\n <Item onClick={() => copyToClipboard(table.name, `${labels?.entityName || 'Table'} name`)}>\n <Copy strokeWidth={1.5} className=\"w-3.5 h-3.5 mr-2 text-muted-foreground\" />\n Copy Name\n </Item>\n <Separator />\n <Item onClick={() => callbacks.onProfileTable?.(table.name)}>\n <BarChart3 strokeWidth={1.5} className=\"w-3.5 h-3.5 mr-2 text-cyan-500\" />\n Profile Table\n </Item>\n <Item onClick={() => callbacks.onGenerateCode?.(table.name)}>\n <Code strokeWidth={1.5} className=\"w-3.5 h-3.5 mr-2 text-purple-500\" />\n Generate Code\n </Item>\n <Item onClick={() => callbacks.onGenerateTestData?.(table.name)}>\n <Wand2 strokeWidth={1.5} className=\"w-3.5 h-3.5 mr-2 text-amber-500\" />\n Generate Test Data\n </Item>\n {isAdmin && (\n <>\n <Separator />\n <Item onClick={() => callbacks.onOpenMaintenance?.('tables', table.name)}>\n <Search strokeWidth={1.5} className=\"w-3.5 h-3.5 mr-2 text-amber-500\" />\n {labels?.analyzeAction || 'Analyze Table'}\n </Item>\n <Item onClick={() => callbacks.onOpenMaintenance?.('tables', table.name)}>\n <Trash2 strokeWidth={1.5} className=\"w-3.5 h-3.5 mr-2 text-blue-400\" />\n {labels?.vacuumAction || 'Vacuum Table'}\n </Item>\n </>\n )}\n </>\n );\n}\n\nexport const TableItem = React.memo(function TableItem({\n table,\n isExpanded,\n onToggle,\n labels,\n isAdmin,\n onTableClick,\n onGenerateSelect,\n onProfileTable,\n onGenerateCode,\n onGenerateTestData,\n onOpenMaintenance,\n}: TableItemProps) {\n const copyToClipboard = (text: string, label: string) => {\n navigator.clipboard.writeText(text);\n toast.success(`${label} copied to clipboard`);\n };\n\n const callbacks = { onTableClick, onGenerateSelect, onProfileTable, onGenerateCode, onGenerateTestData, onOpenMaintenance };\n\n return (\n <div className=\"group flex flex-col\">\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <div\n className={cn(\n 'flex items-center gap-1.5 px-2 py-1.5 rounded-md cursor-pointer transition-all',\n isExpanded ? 'bg-accent/50' : 'hover:bg-accent/30'\n )}\n onClick={onToggle}\n >\n <motion.div\n animate={{ rotate: isExpanded ? 90 : 0 }}\n transition={{ duration: 0.2 }}\n className=\"shrink-0\"\n >\n <ChevronRight strokeWidth={1.5} className=\"w-3.5 h-3.5 text-muted-foreground\" />\n </motion.div>\n\n <TableIcon\n className={cn(\n 'w-3.5 h-3.5 shrink-0 transition-colors',\n isExpanded ? 'text-blue-400' : 'text-muted-foreground group-hover:text-foreground'\n )}\n />\n\n <span\n className={cn(\n 'truncate min-w-0 flex-1 text-xs font-medium transition-colors',\n isExpanded ? 'text-foreground' : 'text-muted-foreground group-hover:text-foreground'\n )}\n >\n {table.name}\n </span>\n\n <div className=\"shrink-0 relative w-8 h-6 flex items-center justify-center\">\n {table.rowCount !== undefined && (\n <span className=\"absolute inset-0 flex items-center justify-center text-[0.625rem] font-mono text-muted-foreground/70 whitespace-nowrap opacity-100 group-hover:opacity-0 transition-opacity pointer-events-none\">\n {table.rowCount >= 1000 ? `${(table.rowCount / 1000).toFixed(1)}k` : table.rowCount}\n </span>\n )}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className=\"absolute inset-0 w-full h-full opacity-0 group-hover:opacity-100 [@media(hover:none)]:opacity-100 focus-within:opacity-100 transition-opacity hover:bg-accent flex items-center justify-center\"\n onClick={(e) => e.stopPropagation()}\n >\n <MoreVertical strokeWidth={1.5} className=\"w-3.5 h-3.5 text-muted-foreground group-hover:text-foreground\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n {renderMenuItems(table, labels, isAdmin, callbacks, copyToClipboard, DropdownMenuItem, DropdownMenuSeparator)}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </ContextMenuTrigger>\n <ContextMenuContent className=\"w-48\">\n {renderMenuItems(table, labels, isAdmin, callbacks, copyToClipboard, ContextMenuItem, ContextMenuSeparator)}\n </ContextMenuContent>\n </ContextMenu>\n\n <AnimatePresence>\n {isExpanded && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"overflow-hidden\"\n >\n <ColumnList columns={table.columns} indexes={table.indexes} />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n});\n","\"use client\";\n\nimport React, { useState, useMemo, useCallback } from 'react';\nimport { TableSchema } from '@/lib/types';\nimport type { ProviderMetadata } from '@/hooks/use-provider-metadata';\nimport {\n Search,\n Hash,\n Loader2,\n AlertCircle,\n Database,\n Plus,\n Settings,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { AnimatePresence } from 'framer-motion';\nimport { TableItem } from './TableItem';\n\ninterface SchemaExplorerProps {\n schema: TableSchema[];\n isLoadingSchema: boolean;\n onTableClick?: (tableName: string) => void;\n onGenerateSelect?: (tableName: string) => void;\n onCreateTableClick?: () => void;\n isAdmin?: boolean;\n onOpenMaintenance?: (tab?: 'global' | 'tables' | 'sessions', table?: string) => void;\n databaseType?: string;\n metadata?: ProviderMetadata | null;\n onProfileTable?: (tableName: string) => void;\n onGenerateCode?: (tableName: string) => void;\n onGenerateTestData?: (tableName: string) => void;\n}\n\nexport function SchemaExplorer({\n schema,\n isLoadingSchema,\n onTableClick,\n onGenerateSelect,\n onCreateTableClick,\n isAdmin = false,\n onOpenMaintenance,\n metadata,\n onProfileTable,\n onGenerateCode,\n onGenerateTestData,\n}: SchemaExplorerProps) {\n const labels = metadata?.labels;\n const capabilities = metadata?.capabilities;\n const [searchQuery, setSearchQuery] = useState('');\n const [expandedTables, setExpandedTables] = useState<Set<string>>(new Set());\n\n const toggleTable = useCallback((tableName: string) => {\n setExpandedTables(prev => {\n const next = new Set(prev);\n if (next.has(tableName)) {\n next.delete(tableName);\n } else {\n next.add(tableName);\n }\n return next;\n });\n }, []);\n\n const filteredSchema = useMemo(() => {\n if (!searchQuery) return schema;\n const query = searchQuery.toLowerCase();\n\n return schema.filter(table => {\n const tableNameMatch = table.name.toLowerCase().includes(query);\n const columnMatch = table.columns.some(col => col.name.toLowerCase().includes(query));\n return tableNameMatch || columnMatch;\n });\n }, [schema, searchQuery]);\n\n if (isLoadingSchema) {\n return (\n <div className=\"flex flex-col items-center justify-center py-12 text-muted-foreground\">\n <div className=\"relative mb-4\">\n <Loader2 strokeWidth={1.5} className=\"w-8 h-8 animate-spin text-blue-500/20\" />\n <Database strokeWidth={1.5} className=\"w-3.5 h-3.5 absolute inset-0 m-auto text-blue-500 animate-pulse\" />\n </div>\n <span className=\"text-xs font-medium animate-pulse\">Scanning Schema...</span>\n </div>\n );\n }\n\n if (schema.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center py-12 px-6 text-center\">\n <div className=\"w-12 h-12 rounded-full bg-muted flex items-center justify-center mb-4 border border-border\">\n <AlertCircle strokeWidth={1.5} className=\"w-6 h-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-foreground text-xs font-medium mb-1\">No structures found</h3>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n We couldn't find any tables or views in this connection.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"sticky top-0 z-10 px-3 pb-3 pt-1 space-y-3 bg-background\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Database strokeWidth={1.5} className=\"w-3.5 h-3.5 text-blue-500/50\" />\n <span className=\"text-xs font-medium text-muted-foreground\">\n Explorer\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n {isAdmin && (\n <button\n className=\"p-1 rounded hover:bg-accent text-muted-foreground hover:text-amber-400 transition-colors\"\n onClick={() => onOpenMaintenance?.('global')}\n title=\"Database Maintenance\"\n >\n <Settings strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n )}\n {(capabilities?.supportsCreateTable !== false) && (\n <button\n className=\"p-1 rounded hover:bg-accent text-muted-foreground hover:text-blue-400 transition-colors\"\n onClick={onCreateTableClick}\n title={`Create ${labels?.entityName || 'Table'}`}\n >\n <Plus strokeWidth={1.5} className=\"w-3.5 h-3.5\" />\n </button>\n )}\n <span className=\"text-[0.625rem] bg-blue-500/10 text-blue-400 px-1.5 py-0.5 rounded-full font-mono border border-blue-500/10\">\n {schema.length}\n </span>\n </div>\n </div>\n\n <div className=\"relative group\">\n <Search strokeWidth={1.5} className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-muted-foreground group-focus-within:text-blue-500 transition-colors\" />\n <Input\n placeholder={labels?.searchPlaceholder || \"Search tables or columns...\"}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"h-8 pl-8 pr-8 text-xs bg-muted/50 border-border focus-visible:ring-1 focus-visible:ring-blue-500/50 placeholder:text-muted-foreground/50\"\n />\n {searchQuery && (\n <button\n onClick={() => setSearchQuery('')}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Hash strokeWidth={1.5} className=\"w-3.5 h-3.5 rotate-45\" />\n </button>\n )}\n </div>\n </div>\n\n <div className=\"px-2 space-y-1\">\n <AnimatePresence mode=\"popLayout\">\n {filteredSchema.map((table) => (\n <TableItem\n key={table.name}\n table={table}\n isExpanded={expandedTables.has(table.name)}\n onToggle={() => toggleTable(table.name)}\n labels={labels}\n isAdmin={isAdmin}\n onTableClick={onTableClick}\n onGenerateSelect={onGenerateSelect}\n onProfileTable={onProfileTable}\n onGenerateCode={onGenerateCode}\n onGenerateTestData={onGenerateTestData}\n onOpenMaintenance={onOpenMaintenance}\n />\n ))}\n </AnimatePresence>\n </div>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","export type DatabaseType = 'postgres' | 'mysql' | 'sqlite' | 'mongodb' | 'redis' | 'oracle' | 'mssql';\n\nexport type ConnectionEnvironment = 'production' | 'staging' | 'development' | 'local' | 'other';\n\nexport const ENVIRONMENT_COLORS: Record<ConnectionEnvironment, string> = {\n production: '#ef4444',\n staging: '#eab308',\n development: '#22c55e',\n local: '#3b82f6',\n other: '#6b7280',\n};\n\nexport const ENVIRONMENT_LABELS: Record<ConnectionEnvironment, string> = {\n production: 'PROD',\n staging: 'STAGING',\n development: 'DEV',\n local: 'LOCAL',\n other: '',\n};\n\nexport type SSLMode = 'disable' | 'require' | 'verify-ca' | 'verify-full';\n\nexport interface SSLConfig {\n mode: SSLMode;\n caCert?: string;\n clientCert?: string;\n clientKey?: string;\n rejectUnauthorized?: boolean;\n}\n\nexport interface SSHTunnelConfig {\n enabled: boolean;\n host: string;\n port: number;\n username: string;\n authMethod: 'password' | 'privateKey';\n password?: string;\n privateKey?: string;\n passphrase?: string;\n}\n\nexport interface DatabaseConnection {\n id: string;\n name: string;\n type: DatabaseType;\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n connectionString?: string;\n createdAt: Date;\n color?: string;\n environment?: ConnectionEnvironment;\n group?: string;\n ssl?: SSLConfig;\n sshTunnel?: SSHTunnelConfig;\n serviceName?: string; // Oracle: service name (e.g. ORCL, XEPDB1)\n instanceName?: string; // MSSQL: named instance (e.g. SQLEXPRESS)\n managed?: boolean; // true = admin-controlled, read-only in UI\n seedId?: string; // stable reference to seed config ID\n}\n\nexport interface TableSchema {\n name: string;\n columns: ColumnSchema[];\n indexes: IndexSchema[];\n foreignKeys?: ForeignKeySchema[];\n rowCount?: number;\n size?: string;\n}\n\nexport interface ForeignKeySchema {\n columnName: string;\n referencedTable: string;\n referencedColumn: string;\n}\n\nexport interface ColumnSchema {\n name: string;\n type: string;\n nullable: boolean;\n isPrimary: boolean;\n defaultValue?: string;\n}\n\nexport interface IndexSchema {\n name: string;\n columns: string[];\n unique: boolean;\n}\n\nexport interface QueryPagination {\n limit: number;\n offset: number;\n hasMore: boolean;\n totalReturned: number;\n wasLimited: boolean;\n}\n\nexport interface QueryResult {\n rows: Record<string, unknown>[];\n fields: string[];\n rowCount: number;\n executionTime: number;\n explainPlan?: unknown;\n pagination?: QueryPagination;\n}\n\nexport interface QueryTab {\n id: string;\n name: string;\n query: string;\n result: QueryResult | null;\n isExecuting: boolean;\n type: 'sql' | 'mongodb' | 'redis';\n viewMode?: 'results' | 'explain' | 'history' | 'saved';\n explainPlan?: unknown;\n // Pagination state\n currentOffset?: number;\n isLoadingMore?: boolean;\n allRows?: Record<string, unknown>[];\n}\n\nexport interface QueryHistoryItem {\n id: string;\n connectionId: string;\n connectionName?: string;\n tabName?: string;\n query: string;\n executionTime: number;\n status: 'success' | 'error';\n executedAt: Date;\n rowCount?: number;\n errorMessage?: string;\n}\n\nexport interface SavedQuery {\n id: string;\n name: string;\n query: string;\n description?: string;\n connectionType: DatabaseType;\n createdAt: Date;\n updatedAt: Date;\n tags?: string[];\n}\n\nexport interface SchemaSnapshot {\n id: string;\n connectionId: string;\n connectionName: string;\n databaseType: DatabaseType;\n schema: TableSchema[];\n createdAt: Date;\n label?: string;\n}\n\nexport type AggregationType = 'none' | 'sum' | 'avg' | 'count' | 'min' | 'max';\nexport type DateGrouping = 'hour' | 'day' | 'week' | 'month' | 'year';\n\nexport interface SavedChartConfig {\n id: string;\n name: string;\n chartType: string;\n xAxis: string;\n yAxis: string[];\n query?: string;\n connectionId?: string;\n createdAt: Date;\n aggregation?: AggregationType;\n dateGrouping?: DateGrouping;\n}","import React from 'react';\n\ninterface IconProps extends React.SVGAttributes<SVGSVGElement> {\n className?: string;\n}\n\n/** PostgreSQL elephant logo (simplified) */\nexport const PostgreSQLIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} {...props}>\n <path d=\"M12 2C7.58 2 4 5.58 4 10c0 2.05.78 3.92 2.05 5.33C5.38 16.46 5 18.15 5 20c0 .55.45 1 1 1h1c.55 0 1-.3 1.2-.75l.8-1.75c.9.32 1.95.5 3 .5s2.1-.18 3-.5l.8 1.75c.2.45.65.75 1.2.75h1c.55 0 1-.45 1-1 0-1.85-.38-3.54-1.05-4.67A7.97 7.97 0 0020 10c0-4.42-3.58-8-8-8z\" />\n <circle cx=\"9.5\" cy=\"9.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M14 13c-1 1-3 1-4 0\" />\n <path d=\"M15.5 7.5c.5-1 2-1.5 3-.5\" />\n <path d=\"M8.5 7.5c-.5-1-2-1.5-3-.5\" />\n </svg>\n);\n\n/** MySQL dolphin logo (simplified) */\nexport const MySQLIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} {...props}>\n <path d=\"M4.5 16c1-2 3-3 5.5-3s4.5 1 5.5 3\" />\n <path d=\"M19 8c-1-3-4-5-7-5S5.5 5 5 8c-.3 1.5.5 3 2 4s3.5 1.5 5 1.5 3.5-.5 5-1.5 2.3-2.5 2-4z\" />\n <path d=\"M16 6c1.5-.5 3.5 0 4 2s-.5 3.5-1.5 4\" />\n <path d=\"M12 8v3\" />\n <circle cx=\"9.5\" cy=\"9\" r=\"0.75\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M8 19l-2 3\" />\n <path d=\"M16 19l2 3\" />\n <path d=\"M12 19v3\" />\n </svg>\n);\n\n/** SQLite feather/document logo (simplified) */\nexport const SQLiteIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} {...props}>\n <path d=\"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <path d=\"M9 13h6\" />\n <path d=\"M9 17h3\" />\n <circle cx=\"12\" cy=\"11\" r=\"0\" />\n <path d=\"M8 10c1-2 3-3 4.5-2.5S14 10 13.5 12 11 15 9.5 14.5 7 12 8 10z\" fill=\"currentColor\" opacity=\"0.15\" stroke=\"none\" />\n </svg>\n);\n\n/** MongoDB leaf logo */\nexport const MongoDBIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} {...props}>\n <path d=\"M12 2C12 2 7 7 7 13c0 3.31 2.24 6 5 6s5-2.69 5-6c0-6-5-11-5-11z\" />\n <path d=\"M12 22v-3\" />\n <path d=\"M12 2v9\" />\n </svg>\n);\n\n/** Redis diamond/stack logo */\nexport const RedisIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} {...props}>\n <path d=\"M12 3L2 9l10 6 10-6-10-6z\" />\n <path d=\"M2 15l10 6 10-6\" />\n <path d=\"M2 9v6\" />\n <path d=\"M22 9v6\" />\n <path d=\"M12 15v6\" />\n <path d=\"M2 12l10 6 10-6\" />\n </svg>\n);\n\n/** Oracle arch/pillar logo (simplified) */\nexport const OracleIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} {...props}>\n <ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"5\" />\n <path d=\"M12 7v10\" />\n <path d=\"M7.5 9v6\" />\n <path d=\"M16.5 9v6\" />\n </svg>\n);\n\n/** MSSQL stacked cylinder/database logo (simplified) */\nexport const MSSQLIcon: React.FC<IconProps> = ({ className, ...props }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} {...props}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"8\" ry=\"3\" />\n <path d=\"M4 5v14c0 1.66 3.58 3 8 3s8-1.34 8-3V5\" />\n <path d=\"M4 12c0 1.66 3.58 3 8 3s8-1.34 8-3\" />\n <path d=\"M4 8.5c0 1.66 3.58 3 8 3s8-1.34 8-3\" />\n <path d=\"M4 15.5c0 1.66 3.58 3 8 3s8-1.34 8-3\" />\n </svg>\n);\n","import { type LucideIcon } from 'lucide-react';\nimport { PostgreSQLIcon, MySQLIcon, SQLiteIcon, MongoDBIcon, RedisIcon, OracleIcon, MSSQLIcon } from '@/components/icons/db-icons';\nimport type { DatabaseType } from '@/lib/types';\n\n// DB brand icons share the same interface as LucideIcon (className + SVG props)\ntype DBIcon = LucideIcon | React.FC<React.SVGAttributes<SVGSVGElement> & { className?: string }>;\n\nexport interface DatabaseUIConfig {\n icon: DBIcon;\n color: string;\n label: string;\n defaultPort: string;\n showConnectionStringToggle: boolean;\n connectionFields: ('host' | 'port' | 'user' | 'password' | 'database' | 'connectionString' | 'serviceName' | 'instanceName')[];\n}\n\nconst DB_UI_CONFIG: Record<DatabaseType, DatabaseUIConfig> = {\n postgres: {\n icon: PostgreSQLIcon,\n color: 'text-blue-400',\n label: 'PostgreSQL',\n defaultPort: '5432',\n showConnectionStringToggle: false,\n connectionFields: ['host', 'port', 'user', 'password', 'database'],\n },\n mysql: {\n icon: MySQLIcon,\n color: 'text-amber-400',\n label: 'MySQL',\n defaultPort: '3306',\n showConnectionStringToggle: false,\n connectionFields: ['host', 'port', 'user', 'password', 'database'],\n },\n sqlite: {\n icon: SQLiteIcon,\n color: 'text-cyan-400',\n label: 'SQLite',\n defaultPort: '',\n showConnectionStringToggle: false,\n connectionFields: ['database'],\n },\n mongodb: {\n icon: MongoDBIcon,\n color: 'text-emerald-400',\n label: 'MongoDB',\n defaultPort: '27017',\n showConnectionStringToggle: true,\n connectionFields: ['host', 'port', 'user', 'password', 'database', 'connectionString'],\n },\n redis: {\n icon: RedisIcon,\n color: 'text-rose-400',\n label: 'Redis',\n defaultPort: '6379',\n showConnectionStringToggle: false,\n connectionFields: ['host', 'port', 'password', 'database'],\n },\n oracle: {\n icon: OracleIcon,\n color: 'text-red-400',\n label: 'Oracle',\n defaultPort: '1521',\n showConnectionStringToggle: false,\n connectionFields: ['host', 'port', 'user', 'password', 'database', 'serviceName'],\n },\n mssql: {\n icon: MSSQLIcon,\n color: 'text-sky-400',\n label: 'SQL Server',\n defaultPort: '1433',\n showConnectionStringToggle: false,\n connectionFields: ['host', 'port', 'user', 'password', 'database', 'instanceName'],\n },\n};\n\nexport function getDBConfig(type: DatabaseType): DatabaseUIConfig {\n return DB_UI_CONFIG[type];\n}\n\nexport function getDBIcon(type: DatabaseType): DBIcon {\n return DB_UI_CONFIG[type].icon;\n}\n\nexport function getDBColor(type: DatabaseType): string {\n return DB_UI_CONFIG[type].color;\n}\n"]}
|