+
-
- {currentNotebook.cells.map((cell, index) => (
- updateCellSql(cell.id, sql)}
- onExecute={() => executeCell(cell.id)}
- onDelete={() => deleteCell(cell.id)}
- canDelete={currentNotebook.cells.length > 1}
- isActive={cell.id === activeCellId}
- onSelect={() => setActiveCellId(cell.id)}
- onToggleCollapse={() => toggleCellSection(cell.id, 'collapsed')}
- onToggleEditor={() => toggleCellSection(cell.id, 'hideEditor')}
- onToggleResult={() => toggleCellSection(cell.id, 'hideResult')}
- onMoveUp={() => moveCellPosition(cell.id, 'up')}
- onMoveDown={() => moveCellPosition(cell.id, 'down')}
- dragState={{
- isDragging: draggingCellId === cell.id,
- isDragOver: dragOverCellId === cell.id,
- }}
- onDragStart={() => handleDragStart(cell.id)}
- onDragEnd={handleDragEnd}
- onDragOver={() => handleDragOverCell(cell.id)}
- onDrop={() => handleDropOnCell(cell.id)}
- />
- ))}
-
- {
- event.preventDefault();
- if (draggingCellId) {
- setDragOverTail(true);
- }
- }}
- onDragLeave={() => setDragOverTail(false)}
- onDrop={(event) => {
- event.preventDefault();
- handleDropAtEnd();
- }}
- className={`w-full rounded-2xl border-2 border-dashed py-4 text-sm font-semibold text-gray-500 transition ${
- dragOverTail
- ? 'border-indigo-300 text-indigo-600 bg-indigo-50/30'
- : 'border-gray-300 hover:border-indigo-300 hover:text-indigo-600'
- }`}
- >
- + Add Cell
-
-
- >
- ) : (
+
+ {!fullscreenCellId && renderAddControl('above', 0)}
+ {currentNotebook.cells.map((cell, index) => {
+ if (fullscreenCellId && cell.id !== fullscreenCellId) {
+ return null;
+ }
+ return (
+
+ updateCellSql(cell.id, sql)}
+ onExecute={() => executeCell(cell.id)}
+ onDelete={() => deleteCell(cell.id)}
+ canDelete={currentNotebook.cells.length > 1}
+ isActive={cell.id === activeCellId || fullscreenCellId === cell.id}
+ onSelect={() => setActiveCellId(cell.id)}
+ onToggleCollapse={() => toggleCellSection(cell.id, 'collapsed')}
+ onToggleEditor={() => toggleCellSection(cell.id, 'hideEditor')}
+ onToggleResult={() => toggleCellSection(cell.id, 'hideResult')}
+ onToggleFullscreen={() =>
+ setFullscreenCellId(prev => (prev === cell.id ? null : cell.id))
+ }
+ isFullscreen={fullscreenCellId === cell.id}
+ onMoveUp={() => moveCellPosition(cell.id, 'up')}
+ onMoveDown={() => moveCellPosition(cell.id, 'down')}
+ dragState={{
+ isDragging: draggingCellId === cell.id,
+ isDragOver: dragOverState.id === cell.id,
+ dragOverPosition:
+ dragOverState.id === cell.id
+ ? dragOverState.placeAfter
+ ? 'after'
+ : 'before'
+ : undefined,
+ }}
+ onDragStart={() => handleDragStart(cell.id)}
+ onDragEnd={handleDragEnd}
+ onDragOver={(placeAfter) => handleDragOverCell(cell.id, placeAfter)}
+ onDrop={(placeAfter) => handleDropOnCell(cell.id, placeAfter)}
+ onRunFromHere={() => { void runCellsFrom(index); }}
+ onRunToHere={() => { void runCellsTo(index); }}
+ />
+ {!fullscreenCellId && renderAddControl(
+ index === currentNotebook.cells.length - 1 ? 'below' : 'between',
+ index + 1
+ )}
+
+ );
+ })}
+ {!fullscreenCellId && renderAddControl('below', currentNotebook.cells.length)}
+
+ >
+ ) : (
No notebooks yet
@@ -680,13 +765,18 @@ const Notebooks: React.FC = () => {
)}
-
-
-
-
- {renderResultPanel()}
-
+
+ {fullscreenCellId && (
+
+
+ Exit fullscreen โ
+
+
+ )}
);
};
diff --git a/frontend/src/PerfQuery.tsx b/frontend/src/PerfQuery.tsx
index 0cb98bd10..f6ff532f6 100644
--- a/frontend/src/PerfQuery.tsx
+++ b/frontend/src/PerfQuery.tsx
@@ -1,8 +1,8 @@
-import React, { useState, useEffect, useCallback } from 'react';
+import React, { useState, useEffect, useCallback, useMemo } from 'react';
import { useRouter } from 'next/router';
import CodeMirror from '@uiw/react-codemirror';
import { sql } from '@codemirror/lang-sql';
-import { EditorView } from '@codemirror/view';
+import { EditorView, keymap, lineNumbers } from '@codemirror/view';
import { autocompletion } from '@codemirror/autocomplete';
import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels';
import { xcodeLight, xcodeLightPatch } from './components/CodeMirrorTheme';
@@ -30,9 +30,16 @@ interface QueryResponse {
queryId?: string;
}
-const DEFAULT_PERF_SQL = `SELECT * FROM system.tables LIMIT 10;`;
+const DEFAULT_PERF_SQL = `select number % 3 a, number % 4 b, number % 5 c from numbers(100000000) group by all limit 3;`;
const PerfQuery: React.FC = () => {
+ const isExecutionShortcut = (event: KeyboardEvent) => {
+ if (!(event.metaKey || event.ctrlKey)) {
+ return false;
+ }
+ return event.key === 'Enter' || event.key === 'NumpadEnter' || event.key === 'Return';
+ };
+
const router = useRouter();
// Get query ID from path parameters (for catch-all routes like [slug])
const pathQueryId = router.query.slug && Array.isArray(router.query.slug)
@@ -188,21 +195,24 @@ const PerfQuery: React.FC = () => {
}, [router.isReady, queryId, loadSharedPerfQuery]);
// Add global keyboard event listener for Cmd+Enter
- useEffect(() => {
- const handleKeyDown = (e: KeyboardEvent) => {
- if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {
- e.preventDefault();
+ const runKeymap = useMemo(() => keymap.of([
+ {
+ key: 'Mod-Enter',
+ run: () => {
executePerfQuery();
- }
- };
-
- window.addEventListener('keydown', handleKeyDown);
-
- // Cleanup event listener on component unmount
- return () => {
- window.removeEventListener('keydown', handleKeyDown);
- };
- }, [executePerfQuery]);
+ return true;
+ },
+ preventDefault: true,
+ },
+ {
+ key: 'Mod-NumpadEnter',
+ run: () => {
+ executePerfQuery();
+ return true;
+ },
+ preventDefault: true,
+ },
+ ]), [executePerfQuery]);
// Add resizeIframe function for HTML content
useEffect(() => {
@@ -303,18 +313,14 @@ const PerfQuery: React.FC = () => {
extensions={[
xcodeLightPatch,
EditorView.lineWrapping,
+ lineNumbers(),
autocompletion({
icons: false,
}),
sql(),
+ runKeymap,
]}
- basicSetup={{
- lineNumbers: true,
- foldGutter: false,
- indentOnInput: false,
- autocompletion: true,
- highlightActiveLine: false,
- }}
+ basicSetup={false}
onChange={(value) => setQuery(value)}
editable={!loading}
style={{
diff --git a/frontend/src/SQLQuery.tsx b/frontend/src/SQLQuery.tsx
index 796db8899..df4f25ce2 100644
--- a/frontend/src/SQLQuery.tsx
+++ b/frontend/src/SQLQuery.tsx
@@ -1,8 +1,8 @@
-import React, { useState, useEffect, useCallback } from 'react';
+import React, { useState, useEffect, useCallback, useMemo } from 'react';
import { useRouter } from 'next/router';
import CodeMirror from '@uiw/react-codemirror';
import { sql } from '@codemirror/lang-sql';
-import { EditorView } from '@codemirror/view';
+import { EditorView, keymap, lineNumbers } from '@codemirror/view';
import { autocompletion } from '@codemirror/autocomplete';
import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels';
import { xcodeLight, xcodeLightPatch } from './components/CodeMirrorTheme';
@@ -16,6 +16,13 @@ interface QueryResult {
}
const SQLQuery: React.FC = () => {
+ const isExecutionShortcut = (event: KeyboardEvent) => {
+ if (!(event.metaKey || event.ctrlKey)) {
+ return false;
+ }
+ return event.key === 'Enter' || event.key === 'NumpadEnter' || event.key === 'Return';
+ };
+
const router = useRouter();
// Get query ID from path parameters (for catch-all routes like [slug])
const pathQueryId = router.query.slug && Array.isArray(router.query.slug)
@@ -122,21 +129,24 @@ SELECT * FROM students;`);
}, [query, router]);
// Add global keyboard event listener for Cmd+Enter
- useEffect(() => {
- const handleKeyDown = (e: KeyboardEvent) => {
- if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {
- e.preventDefault();
+ const runKeymap = useMemo(() => keymap.of([
+ {
+ key: 'Mod-Enter',
+ run: () => {
executeQuery();
- }
- };
-
- window.addEventListener('keydown', handleKeyDown);
-
- // Cleanup event listener on component unmount
- return () => {
- window.removeEventListener('keydown', handleKeyDown);
- };
- }, [executeQuery]);
+ return true;
+ },
+ preventDefault: true,
+ },
+ {
+ key: 'Ctrl-Enter',
+ run: () => {
+ executeQuery();
+ return true;
+ },
+ preventDefault: true,
+ },
+ ]), [executeQuery]);
const renderTable = (result: QueryResult, index: number) => {
// Handle empty data
@@ -205,11 +215,7 @@ SELECT * FROM students;`);
return (
-
-
- SQL Query
- Press โโ to run
-
+
)}
+ Press โโ to run
setQuery(value)}
editable={!loading}
style={{
diff --git a/frontend/src/components/NotebookCell.tsx b/frontend/src/components/NotebookCell.tsx
index f80b40cba..6aa26ae79 100644
--- a/frontend/src/components/NotebookCell.tsx
+++ b/frontend/src/components/NotebookCell.tsx
@@ -1,7 +1,7 @@
import React, { useEffect, useMemo, useRef, useState } from 'react';
import CodeMirror from '@uiw/react-codemirror';
import { sql } from '@codemirror/lang-sql';
-import { EditorView } from '@codemirror/view';
+import { EditorView, keymap, lineNumbers } from '@codemirror/view';
import { autocompletion } from '@codemirror/autocomplete';
import { xcodeLight, xcodeLightPatch } from './CodeMirrorTheme';
import { NotebookCell, QueryResult } from '../types/notebook';
@@ -29,16 +29,21 @@ interface NotebookCellProps {
onToggleCollapse: () => void;
onToggleEditor: () => void;
onToggleResult: () => void;
+ onToggleFullscreen: () => void;
onMoveUp: () => void;
onMoveDown: () => void;
+ isFullscreen?: boolean;
dragState: {
isDragging: boolean;
isDragOver: boolean;
+ dragOverPosition?: 'before' | 'after';
};
onDragStart: () => void;
onDragEnd: () => void;
- onDragOver: () => void;
- onDrop: () => void;
+ onDragOver: (placeAfter?: boolean) => void;
+ onDrop: (placeAfter?: boolean) => void;
+ onRunFromHere?: () => void;
+ onRunToHere?: () => void;
}
const NotebookCellComponent: React.FC = ({
@@ -53,16 +58,29 @@ const NotebookCellComponent: React.FC = ({
onToggleCollapse,
onToggleEditor,
onToggleResult,
+ onToggleFullscreen,
onMoveUp,
onMoveDown,
+ isFullscreen = false,
dragState,
onDragStart,
onDragEnd,
onDragOver,
onDrop,
+ onRunFromHere = () => {},
+ onRunToHere = () => {},
}) => {
+ const cardRef = useRef(null);
+ const isExecutionShortcut = (event: KeyboardEvent) => {
+ if (!(event.metaKey || event.ctrlKey)) {
+ return false;
+ }
+ return event.key === 'Enter' || event.key === 'NumpadEnter' || event.key === 'Return';
+ };
const [menuOpen, setMenuOpen] = useState(false);
const menuRef = useRef(null);
+ const [runMenuOpen, setRunMenuOpen] = useState(false);
+ const runMenuRef = useRef(null);
useEffect(() => {
if (!menuOpen) return;
@@ -75,6 +93,17 @@ const NotebookCellComponent: React.FC = ({
return () => document.removeEventListener('mousedown', handleClick);
}, [menuOpen]);
+ useEffect(() => {
+ if (!runMenuOpen) return;
+ const handleClick = (event: MouseEvent) => {
+ if (runMenuRef.current && !runMenuRef.current.contains(event.target as Node)) {
+ setRunMenuOpen(false);
+ }
+ };
+ document.addEventListener('mousedown', handleClick);
+ return () => document.removeEventListener('mousedown', handleClick);
+ }, [runMenuOpen]);
+
const showEditor = !cell.hideEditor && !cell.collapsed;
const showResult = !cell.hideResult && !cell.collapsed;
@@ -89,15 +118,15 @@ const NotebookCellComponent: React.FC = ({
const renderTable = (result: QueryResult) => {
if (!result.data || result.data.length === 0) {
return (
-
+
No data returned
);
}
return (
-
-
+
+
@@ -128,288 +157,403 @@ const NotebookCellComponent: React.FC = ({
);
};
- const renderTypeInfo = (result: QueryResult) => {
- if (!result.types || result.types.length === 0) {
- return (
-
- No type information available
-
- );
- }
-
- return (
-
-
- Column types
-
-
- {result.columns.map((column, idx) => (
-
- {column}
- {result.types[idx]}
-
- ))}
-
-
- );
- };
const baseCardClasses = [
'flex',
- 'gap-4',
- 'rounded-2xl',
+ 'gap-3',
+ 'rounded-xl',
'border',
'bg-white',
- 'shadow-sm',
'transition-all',
- dragState.isDragOver ? 'ring-2 ring-indigo-300 border-indigo-300' : 'border-gray-200',
- isActive ? 'shadow-[0_0_0_2px_rgba(99,102,241,0.15)]' : 'hover:border-gray-300',
+ dragState.isDragOver ? 'ring-1 ring-indigo-300 border-indigo-300' : 'border-gray-200',
+ isFullscreen
+ ? 'shadow-[0_0_0_2px_rgba(99,102,241,0.35)] border-indigo-300'
+ : isActive
+ ? 'shadow-[0_0_0_1px_rgba(99,102,241,0.25)]'
+ : 'shadow-sm hover:border-gray-300',
+ cell.loading ? 'ring-1 ring-indigo-300 border-indigo-300 bg-blue-50/70' : '',
].join(' ');
+ // ๆพ็ฝฎๆ็คบๅจๆ ทๅผ
+ const dropIndicatorClass = [
+ 'absolute',
+ 'left-0',
+ 'right-0',
+ 'h-1',
+ 'bg-indigo-500/80',
+ 'rounded-full',
+ 'transition-opacity',
+ 'pointer-events-none',
+ 'opacity-0',
+ ].join(' ');
+
+ const dragTransformClass = dragState.isDragOver
+ ? dragState.dragOverPosition === 'after'
+ ? 'translate-y-1.5'
+ : '-translate-y-1.5'
+ : 'translate-y-0';
+ const showTopIndicator = dragState.isDragOver && dragState.dragOverPosition === 'before';
+ const showBottomIndicator = dragState.isDragOver && dragState.dragOverPosition === 'after';
+
+ const editorHeight = isFullscreen ? 'auto' : 'auto';
+ const editorMinHeight = isFullscreen ? '44px' : '44px';
+ const showSideControls = !isFullscreen;
+ const showMenu = !isFullscreen;
+
+ const runKeymap = useMemo(() => keymap.of([
+ {
+ key: 'Mod-Enter',
+ run: () => {
+ onExecute();
+ return true;
+ },
+ preventDefault: true,
+ },
+ {
+ key: 'Mod-NumpadEnter',
+ run: () => {
+ onExecute();
+ return true;
+ },
+ preventDefault: true,
+ },
+ {
+ key: 'Alt-Enter',
+ run: () => {
+ onRunFromHere?.();
+ return true;
+ },
+ preventDefault: true,
+ },
+ {
+ key: 'Shift-Enter',
+ run: () => {
+ onRunToHere?.();
+ return true;
+ },
+ preventDefault: true,
+ },
+ ]), [onExecute, onRunFromHere, onRunToHere]);
+
+ const getPlaceAfter = (event: React.DragEvent) => {
+ if (!cardRef.current) {
+ return false;
+ }
+ const rect = cardRef.current.getBoundingClientRect();
+ return event.clientY - rect.top > rect.height / 2;
+ };
+
const handleDragOver = (event: React.DragEvent) => {
event.preventDefault();
- onDragOver();
+ onDragOver(getPlaceAfter(event));
};
const handleDrop = (event: React.DragEvent) => {
event.preventDefault();
- onDrop();
+ onDrop(getPlaceAfter(event));
+ };
+
+ const handleDragStartWrapper = (event: React.DragEvent) => {
+ event.dataTransfer.effectAllowed = 'move';
+ event.dataTransfer.setData('text/plain', cell.id);
+ if (cardRef.current) {
+ const rect = cardRef.current.getBoundingClientRect();
+ event.dataTransfer.setDragImage(
+ cardRef.current,
+ event.clientX - rect.left,
+ event.clientY - rect.top,
+ );
+ }
+ onDragStart();
+ };
+
+ const handleDragEndWrapper = (event: React.DragEvent) => {
+ event.preventDefault();
+ onDragEnd();
};
return (
-
-
-
{
- event.dataTransfer.effectAllowed = 'move';
- event.dataTransfer.setData('text/plain', cell.id);
- onDragStart();
- }}
- onDragEnd={(event) => {
- event.preventDefault();
- onDragEnd();
- }}
- >
-
-
-
- {
- e.stopPropagation();
- onToggleCollapse();
- }}
- className={`rounded-md border px-1.5 py-1 text-xs ${cell.collapsed ? 'border-indigo-300 text-indigo-500' : 'border-gray-200 hover:text-gray-600'}`}
- title={cell.collapsed ? 'Expand cell' : 'Collapse cell'}
- >
- {cell.collapsed ? : }
-
- {
- e.stopPropagation();
- onToggleEditor();
- }}
- className={`rounded-md border px-1.5 py-1 text-xs ${cell.hideEditor ? 'border-indigo-300 text-indigo-500' : 'border-gray-200 hover:text-gray-600'}`}
- title={cell.hideEditor ? 'Show SQL editor' : 'Collapse SQL editor'}
- >
-
-
- {
- e.stopPropagation();
- onToggleResult();
- }}
- className={`rounded-md border px-1.5 py-1 text-xs ${cell.hideResult ? 'border-indigo-300 text-indigo-500' : 'border-gray-200 hover:text-gray-600'}`}
- title={cell.hideResult ? 'Show results' : 'Collapse results'}
- >
-
-
-
-
+
+ {showTopIndicator && (
+
+ )}
-
-
-
-
{
- e.stopPropagation();
- onExecute();
- }}
- disabled={cell.loading || !cell.sql.trim()}
- className={`inline-flex items-center rounded-full border px-3 py-1 text-sm font-semibold ${
- cell.loading || !cell.sql.trim()
- ? 'border-gray-200 text-gray-400 cursor-not-allowed'
- : 'border-indigo-200 text-indigo-600 hover:bg-indigo-50'
+
+ {showSideControls && (
+
+
-
- Run
-
-
-
Cell {index + 1}
-
{statusLabel}
+
-
-
-
-
{
- e.stopPropagation();
- onSelect();
- }}
- className="rounded-full border border-gray-200 p-1.5 text-gray-400 hover:border-gray-300 hover:text-gray-600"
- title="Expand cell"
- >
-
-
-
+
{
e.stopPropagation();
- setMenuOpen((prev) => !prev);
+ onToggleCollapse();
}}
- className="rounded-full border border-gray-200 p-1.5 text-gray-400 hover:border-gray-300 hover:text-gray-600"
- title="Cell options"
+ className={`rounded-md border px-1.5 py-1 text-xs ${cell.collapsed ? 'border-indigo-300 text-indigo-500' : 'border-gray-200 hover:text-gray-600'}`}
+ title={cell.collapsed ? 'Expand cell' : 'Collapse cell'}
>
-
+ {cell.collapsed ? : }
- {menuOpen && (
-
+ {!cell.collapsed && (
+ <>
{
e.stopPropagation();
- onMoveUp();
- setMenuOpen(false);
+ onToggleEditor();
}}
+ className={`rounded-md border px-1.5 py-1 text-xs ${cell.hideEditor ? 'border-indigo-300 text-indigo-500' : 'border-gray-200 hover:text-gray-600'}`}
+ title={cell.hideEditor ? 'Show SQL editor' : 'Collapse SQL editor'}
>
- Move cell up
- โโ
+
{
e.stopPropagation();
- onMoveDown();
- setMenuOpen(false);
+ onToggleResult();
}}
+ className={`rounded-md border px-1.5 py-1 text-xs ${cell.hideResult ? 'border-indigo-300 text-indigo-500' : 'border-gray-200 hover:text-gray-600'}`}
+ title={cell.hideResult ? 'Show results' : 'Collapse results'}
>
- Move cell down
- โโ
+
- {canDelete && (
+ >
+ )}
+
+
+ )}
+
+
+
+
+
{
+ if (!cell.loading && cell.sql.trim()) {
+ setRunMenuOpen(true);
+ }
+ }}
+ onMouseLeave={() => setRunMenuOpen(false)}
+ >
+
{
+ e.stopPropagation();
+ if (cell.loading || !cell.sql.trim()) {
+ return;
+ }
+ onExecute();
+ setRunMenuOpen(false);
+ }}
+ disabled={cell.loading || !cell.sql.trim()}
+ className={`flex h-8 w-8 items-center justify-center rounded-full border text-sm font-semibold transition ${
+ cell.loading || !cell.sql.trim()
+ ? 'border-gray-200 text-gray-400 cursor-not-allowed'
+ : runMenuOpen
+ ? 'border-indigo-400 text-indigo-600 bg-indigo-50'
+ : 'border-gray-300 text-gray-600 hover:border-indigo-300 hover:text-indigo-600'
+ }`}
+ title="Run cell"
+ >
+
+
+ {runMenuOpen && !cell.loading && cell.sql.trim() && (
+
{
e.stopPropagation();
- onDelete();
- setMenuOpen(false);
+ onExecute();
+ setRunMenuOpen(false);
}}
>
- Delete
+ Run cell
+ โโ
- )}
-
- )}
+
{
+ e.stopPropagation();
+ onRunFromHere();
+ setRunMenuOpen(false);
+ }}
+ >
+ Run from here
+ โฅโ
+
+
{
+ e.stopPropagation();
+ onRunToHere();
+ setRunMenuOpen(false);
+ }}
+ >
+ Run to here
+ โงโ
+
+
+ )}
+
+
{statusLabel}
-
-
- {!cell.collapsed && (
-
- {showEditor ? (
-
-
-
- ) : (
+
{
e.stopPropagation();
- onToggleEditor();
+ onToggleFullscreen();
}}
+ className={`rounded-full border p-1.5 text-gray-500 hover:text-gray-700 ${
+ isFullscreen ? 'border-indigo-300 text-indigo-500' : 'border-gray-200 hover:border-gray-300'
+ }`}
+ title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen cell'}
>
- SQL editor collapsed โ tap to expand
+
- )}
+ {showMenu && (
+
+
{
+ e.stopPropagation();
+ setMenuOpen((prev) => !prev);
+ }}
+ className="rounded-full border border-gray-200 p-1.5 text-gray-400 hover:border-gray-300 hover:text-gray-600"
+ title="Cell options"
+ >
+
+
+ {menuOpen && (
+
+ {
+ e.stopPropagation();
+ onMoveUp();
+ setMenuOpen(false);
+ }}
+ >
+ Move cell up
+ โโ
+
+ {
+ e.stopPropagation();
+ onMoveDown();
+ setMenuOpen(false);
+ }}
+ >
+ Move cell down
+ โโ
+
+ {canDelete && (
+ {
+ e.stopPropagation();
+ onDelete();
+ setMenuOpen(false);
+ }}
+ >
+ Delete
+
+ )}
+
+ )}
+
+ )}
+
+
- {cell.error && showResult && (
-
- {cell.error}
-
- )}
+ {!cell.collapsed && (
+
+ {showEditor ? (
+
+
+
+ ) : (
+
{
+ e.stopPropagation();
+ onToggleEditor();
+ }}
+ >
+
+ {cell.sql || 'SQL editor collapsed'}
+
+
Show editor
+
+ )}
- {!cell.error && showResult && cell.result && (
-
-
- {cell.result.rowCount} row{cell.result.rowCount === 1 ? '' : 's'} returned in {cell.result.duration}
+ {cell.error && showResult && (
+
+ {cell.error}
- {renderTable(cell.result)}
- {renderTypeInfo(cell.result)}
-
- )}
+ )}
- {!cell.error && showResult && !cell.result && (
-
- Execute the query to see results and schema details.
-
- )}
+ {!cell.error && showResult && cell.result && (
+
+
+ {cell.result.rowCount} row{cell.result.rowCount === 1 ? '' : 's'} returned {cell.result.duration ? `in ${cell.result.duration}` : ''}
+
+
+ {renderTable(cell.result)}
+
+
+ )}
- {!showResult && (
-
{
- e.stopPropagation();
- onToggleResult();
- }}
- >
- Result set hidden โ tap to expand
-
- )}
-
- )}
+ {!cell.error && !showResult && !cell.collapsed}
+
+ )}
+
+
+ {/* ไธๆนๆพ็ฝฎๆ็คบๅจ */}
+ {showBottomIndicator && (
+
+ )}
);
};
From ca14ca1128af655e2736cb17de6b6f09536afa00 Mon Sep 17 00:00:00 2001
From: sundyli <543950155@qq.com>
Date: Sat, 8 Nov 2025 12:22:10 +0800
Subject: [PATCH 3/3] update
---
cli/frontend/build/404.html | 2 +-
cli/frontend/build/[...slug].html | 2 +-
.../_next/static/css/0b9c66583f0a06c5.css | 3 ++
.../_next/static/css/3ef53bb80ac16129.css | 3 --
cli/frontend/build/_next/static/js/77.js | 2 +-
cli/frontend/build/index.html | 2 +-
cli/frontend/build/notebooks.html | 2 +-
cli/frontend/build/perf/[...slug].html | 2 +-
frontend/src/Notebooks.tsx | 2 +-
frontend/src/components/NotebookCell.tsx | 29 ++++++++++---------
10 files changed, 26 insertions(+), 23 deletions(-)
create mode 100644 cli/frontend/build/_next/static/css/0b9c66583f0a06c5.css
delete mode 100644 cli/frontend/build/_next/static/css/3ef53bb80ac16129.css
diff --git a/cli/frontend/build/404.html b/cli/frontend/build/404.html
index 4e05d4d01..3993212ac 100644
--- a/cli/frontend/build/404.html
+++ b/cli/frontend/build/404.html
@@ -1 +1 @@
-404: This page could not be found 404
This page could not be found.
\ No newline at end of file
+404: This page could not be found 404
This page could not be found.
\ No newline at end of file
diff --git a/cli/frontend/build/[...slug].html b/cli/frontend/build/[...slug].html
index 667c378c1..6922cdccf 100644
--- a/cli/frontend/build/[...slug].html
+++ b/cli/frontend/build/[...slug].html
@@ -1 +1 @@
-Databend โถ Run queryPress โโ to run
Execute a query to see results
\ No newline at end of file
+Databend โถ Run queryPress โโ to run
Execute a query to see results
\ No newline at end of file
diff --git a/cli/frontend/build/_next/static/css/0b9c66583f0a06c5.css b/cli/frontend/build/_next/static/css/0b9c66583f0a06c5.css
new file mode 100644
index 000000000..973afb09b
--- /dev/null
+++ b/cli/frontend/build/_next/static/css/0b9c66583f0a06c5.css
@@ -0,0 +1,3 @@
+*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*
+! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com
+*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:.75rem}.right-0{right:0}.top-0{top:0}.top-\[68px\]{top:68px}.z-10{z-index:10}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-5{margin-top:1.25rem}.box-border{box-sizing:border-box}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.hidden{display:none}.h-1{height:.25rem}.h-10{height:2.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-8{height:2rem}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-72{max-height:18rem}.min-h-0{min-height:0}.min-h-\[calc\(100vh-180px\)\]{min-height:calc(100vh - 180px)}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-8{width:2rem}.w-\[100px\]{width:100px}.w-full{width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-full{max-width:100%}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\.5{--tw-translate-y:-0.375rem}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.translate-y-1\.5{--tw-translate-y:0.375rem}.transform,.translate-y-1\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity,1))}.border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity,1))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.bg-\[\#f4f6fb\]{--tw-bg-opacity:1;background-color:rgb(244 246 251/var(--tw-bg-opacity,1))}.bg-\[\#f9fbff\]{--tw-bg-opacity:1;background-color:rgb(249 251 255/var(--tw-bg-opacity,1))}.bg-\[\#ffe895\]{--tw-bg-opacity:1;background-color:rgb(255 232 149/var(--tw-bg-opacity,1))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-50\/80{background-color:rgba(239,246,255,.8)}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.bg-indigo-50\/70{background-color:rgba(238,242,255,.7)}.bg-indigo-500\/80{background-color:rgba(99,102,241,.8)}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/95{background-color:hsla(0,0%,100%,.95)}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-3{padding-bottom:.75rem}.pl-8{padding-left:2rem}.pr-3{padding-right:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-gray-900\/70{color:rgba(17,24,39,.7)}.text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-\[0_0_0_2px_rgba\(99\2c 102\2c 241\2c 0\.35\)\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_2px_rgba\(99\2c 102\2c 241\2c 0\.35\)\]{--tw-shadow:0 0 0 2px rgba(99,102,241,.35);--tw-shadow-colored:0 0 0 2px var(--tw-shadow-color)}.shadow-\[0_15px_35px_-20px_rgba\(79\2c 70\2c 229\2c 0\.45\)\]{--tw-shadow:0 15px 35px -20px rgba(79,70,229,.45);--tw-shadow-colored:0 15px 35px -20px var(--tw-shadow-color)}.shadow-\[0_15px_35px_-20px_rgba\(79\2c 70\2c 229\2c 0\.45\)\],.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline{outline-style:solid}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}.ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgb(165 180 252/var(--tw-ring-opacity,1))}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}.drop-shadow,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}#__next,body,html{height:100%}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity,1))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity,1))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity,1))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.group:hover .group-hover\:-translate-y-1{--tw-translate-y:-0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity,1))}.group:hover .group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity,1))}.group:hover .group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity,1))}.group:hover .group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width:640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:p-3{padding:.75rem}}@media (min-width:768px){.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}}.expensive-nodes-card{margin-top:20px;background-color:#fff;box-shadow:0 3px 6px #010e291f;width:308px;box-sizing:border-box;border-radius:8px;padding:24px;border:1px solid rgba(1,14,41,.08)}.expensive-nodes-card-header{margin-bottom:8px}.expensive-nodes-card-header h2{margin:0;font-size:14px;color:#2c3e50}.expensive-nodes-card-header span{font-weight:400;color:#bdc3c7}.expensive-nodes-node{font-size:12px;display:flex;justify-content:space-between;align-items:center;padding:8px 6px;border-bottom:1px solid #ecf0f1}.expensive-nodes-node.selected{border:2px solid #0175f6!important;border-radius:8px}.expensive-nodes-node-name{font-size:12px;color:#0c162b99;font-weight:600}.block{display:block}.expensive-nodes-node-percentage{font-size:12px;color:rgba(12,22,43,.8);font-weight:700}.expensive-nodes-progress{display:flex;align-items:center;margin-bottom:16px}.expensive-nodes-progress .ant-progress-line{flex:1}.expensive-nodes-percentage{font-size:14px;color:#2c3e50;font-weight:700;margin-left:8px}.expensive-nodes-node-attributes{display:block}.expensive-nodes-node-title{color:#0c162bcc;font-weight:600;font-size:12px;padding:8px 6px}.custom-statistic{display:flex;align-items:center;margin-bottom:8px}.custom-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:8px}.statistic-title{font-size:14px;color:#595959}
\ No newline at end of file
diff --git a/cli/frontend/build/_next/static/css/3ef53bb80ac16129.css b/cli/frontend/build/_next/static/css/3ef53bb80ac16129.css
deleted file mode 100644
index 1a141f6ea..000000000
--- a/cli/frontend/build/_next/static/css/3ef53bb80ac16129.css
+++ /dev/null
@@ -1,3 +0,0 @@
-*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*
-! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com
-*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:.75rem}.right-0{right:0}.top-0{top:0}.top-\[68px\]{top:68px}.z-10{z-index:10}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-5{margin-top:1.25rem}.box-border{box-sizing:border-box}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.hidden{display:none}.h-1{height:.25rem}.h-10{height:2.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-8{height:2rem}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-72{max-height:18rem}.min-h-0{min-height:0}.min-h-\[calc\(100vh-180px\)\]{min-height:calc(100vh - 180px)}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-8{width:2rem}.w-\[100px\]{width:100px}.w-full{width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-full{max-width:100%}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\.5{--tw-translate-y:-0.375rem}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.translate-y-1\.5{--tw-translate-y:0.375rem}.transform,.translate-y-1\.5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity,1))}.border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity,1))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.bg-\[\#f9fbff\]{--tw-bg-opacity:1;background-color:rgb(249 251 255/var(--tw-bg-opacity,1))}.bg-\[\#ffe895\]{--tw-bg-opacity:1;background-color:rgb(255 232 149/var(--tw-bg-opacity,1))}.bg-blue-50\/70{background-color:rgba(239,246,255,.7)}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.bg-indigo-50\/70{background-color:rgba(238,242,255,.7)}.bg-indigo-500\/80{background-color:rgba(99,102,241,.8)}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-3{padding-bottom:.75rem}.pl-8{padding-left:2rem}.pr-3{padding-right:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-gray-900\/70{color:rgba(17,24,39,.7)}.text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-\[0_0_0_1px_rgba\(99\2c 102\2c 241\2c 0\.25\)\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(99\2c 102\2c 241\2c 0\.25\)\]{--tw-shadow:0 0 0 1px rgba(99,102,241,.25);--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color)}.shadow-\[0_0_0_2px_rgba\(99\2c 102\2c 241\2c 0\.35\)\]{--tw-shadow:0 0 0 2px rgba(99,102,241,.35);--tw-shadow-colored:0 0 0 2px var(--tw-shadow-color)}.shadow-\[0_0_0_2px_rgba\(99\2c 102\2c 241\2c 0\.35\)\],.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline{outline-style:solid}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgb(165 180 252/var(--tw-ring-opacity,1))}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}.drop-shadow,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}#__next,body,html{height:100%}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity,1))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity,1))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity,1))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.group:hover .group-hover\:-translate-y-1{--tw-translate-y:-0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity,1))}.group:hover .group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity,1))}.group:hover .group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity,1))}.group:hover .group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width:640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:p-3{padding:.75rem}}@media (min-width:768px){.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}}.expensive-nodes-card{margin-top:20px;background-color:#fff;box-shadow:0 3px 6px #010e291f;width:308px;box-sizing:border-box;border-radius:8px;padding:24px;border:1px solid rgba(1,14,41,.08)}.expensive-nodes-card-header{margin-bottom:8px}.expensive-nodes-card-header h2{margin:0;font-size:14px;color:#2c3e50}.expensive-nodes-card-header span{font-weight:400;color:#bdc3c7}.expensive-nodes-node{font-size:12px;display:flex;justify-content:space-between;align-items:center;padding:8px 6px;border-bottom:1px solid #ecf0f1}.expensive-nodes-node.selected{border:2px solid #0175f6!important;border-radius:8px}.expensive-nodes-node-name{font-size:12px;color:#0c162b99;font-weight:600}.block{display:block}.expensive-nodes-node-percentage{font-size:12px;color:rgba(12,22,43,.8);font-weight:700}.expensive-nodes-progress{display:flex;align-items:center;margin-bottom:16px}.expensive-nodes-progress .ant-progress-line{flex:1}.expensive-nodes-percentage{font-size:14px;color:#2c3e50;font-weight:700;margin-left:8px}.expensive-nodes-node-attributes{display:block}.expensive-nodes-node-title{color:#0c162bcc;font-weight:600;font-size:12px;padding:8px 6px}.custom-statistic{display:flex;align-items:center;margin-bottom:8px}.custom-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:8px}.statistic-title{font-size:14px;color:#595959}
\ No newline at end of file
diff --git a/cli/frontend/build/_next/static/js/77.js b/cli/frontend/build/_next/static/js/77.js
index 1d471ee2a..1076556ac 100644
--- a/cli/frontend/build/_next/static/js/77.js
+++ b/cli/frontend/build/_next/static/js/77.js
@@ -1 +1 @@
-"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[77],{6077:function(e,t,r){r.r(t),r.d(t,{default:function(){return N}});var l=r(2676),o=r(5271),n=r(9822),s=r(9675),a=r(2327),i=r(987),d=r(9619),c=r(5122);function u(e){if(!e)return"";let t=e instanceof Date?e:new Date(e);if(isNaN(t.getTime()))return"";let r=Date.now()-t.getTime();return r<6e4?"just now":r<36e5?"".concat(Math.floor(r/6e4),"m ago"):r<864e5?"".concat(Math.floor(r/36e5),"h ago"):r<6048e5?"".concat(Math.floor(r/864e5),"d ago"):t.toLocaleDateString()}let x=e=>(0,l.jsx)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:(0,l.jsx)("path",{d:"M7 5v10l7-5-7-5z",fill:"currentColor",stroke:"none"})}),g=e=>(0,l.jsx)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:(0,l.jsx)("path",{d:"M6 8l4 4 4-4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})}),p=e=>(0,l.jsx)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:(0,l.jsx)("path",{d:"M6 12l4-4 4 4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})}),h=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:[(0,l.jsx)("rect",{x:"4",y:"4",width:"5",height:"12",rx:"1.5"}),(0,l.jsx)("rect",{x:"11",y:"4",width:"5",height:"12",rx:"1.5"})]}),m=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:[(0,l.jsx)("path",{d:"M7 6 4 10l3 4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("path",{d:"m13 6 3 4-3 4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})]}),b=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:[(0,l.jsx)("circle",{cx:"7",cy:"6",r:"1"}),(0,l.jsx)("circle",{cx:"13",cy:"6",r:"1"}),(0,l.jsx)("circle",{cx:"7",cy:"10",r:"1"}),(0,l.jsx)("circle",{cx:"13",cy:"10",r:"1"}),(0,l.jsx)("circle",{cx:"7",cy:"14",r:"1"}),(0,l.jsx)("circle",{cx:"13",cy:"14",r:"1"})]}),f=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:[(0,l.jsx)("path",{d:"M8 4H4v4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("path",{d:"M12 4h4v4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("path",{d:"M8 16H4v-4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("path",{d:"M12 16h4v-4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})]}),v=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"currentColor",stroke:"none",...e,children:[(0,l.jsx)("circle",{cx:"5",cy:"10",r:"1.5"}),(0,l.jsx)("circle",{cx:"10",cy:"10",r:"1.5"}),(0,l.jsx)("circle",{cx:"15",cy:"10",r:"1.5"})]});var y=e=>{var t;let{cell:r,index:n,isActive:y,canDelete:j,onSqlChange:w,onExecute:k,onDelete:N,onSelect:C,onToggleCollapse:D,onToggleEditor:E,onToggleResult:S,onToggleFullscreen:A,onMoveUp:L,onMoveDown:M,isFullscreen:R=!1,dragState:F,onDragStart:P,onDragEnd:q,onDragOver:B,onDrop:J,onRunFromHere:O=()=>{},onRunToHere:T=()=>{}}=e,z=(0,o.useRef)(null),[_,I]=(0,o.useState)(!1),W=(0,o.useRef)(null),[H,Q]=(0,o.useState)(!1),U=(0,o.useRef)(null);(0,o.useEffect)(()=>{if(!_)return;let e=e=>{W.current&&!W.current.contains(e.target)&&I(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[_]),(0,o.useEffect)(()=>{if(!H)return;let e=e=>{U.current&&!U.current.contains(e.target)&&Q(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[H]);let Y=!r.hideEditor&&!r.collapsed,X=!r.hideResult&&!r.collapsed,Z=(0,o.useMemo)(()=>r.loading?"Running query":r.lastExecutedAt?"Ran ".concat(u(r.lastExecutedAt)):"Ready to run",[r.loading,r.lastExecutedAt]),$=["flex","gap-3","rounded-xl","border","bg-white","transition-all",F.isDragOver?"ring-1 ring-indigo-300 border-indigo-300":"border-gray-200",R?"shadow-[0_0_0_2px_rgba(99,102,241,0.35)] border-indigo-300":y?"shadow-[0_0_0_1px_rgba(99,102,241,0.25)]":"shadow-sm hover:border-gray-300",r.loading?"ring-1 ring-indigo-300 border-indigo-300 bg-blue-50/70":""].join(" "),G="absolute left-0 right-0 h-1 bg-indigo-500/80 rounded-full transition-opacity pointer-events-none opacity-0",K=F.isDragOver?"after"===F.dragOverPosition?"translate-y-1.5":"-translate-y-1.5":"translate-y-0",V=F.isDragOver&&"before"===F.dragOverPosition,ee=F.isDragOver&&"after"===F.dragOverPosition,et="auto",er=!R,el=(0,o.useMemo)(()=>i.$f.of([{key:"Mod-Enter",run:()=>(k(),!0),preventDefault:!0},{key:"Mod-NumpadEnter",run:()=>(k(),!0),preventDefault:!0},{key:"Alt-Enter",run:()=>(null==O||O(),!0),preventDefault:!0},{key:"Shift-Enter",run:()=>(null==T||T(),!0),preventDefault:!0}]),[k,O,T]),eo=e=>{if(!z.current)return!1;let t=z.current.getBoundingClientRect();return e.clientY-t.top>t.height/2};return(0,l.jsxs)("div",{className:"relative",children:[V&&(0,l.jsx)("div",{className:"".concat(G," top-0 opacity-100")}),(0,l.jsxs)("div",{ref:z,className:"".concat($," ").concat(R?"h-full min-h-[calc(100vh-180px)]":""," ").concat(F.isDragging?"opacity-50 cursor-grabbing":""," transform transition-transform duration-150 ").concat(K),onClick:C,draggable:!R,onDragStart:e=>{if(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",r.id),z.current){let t=z.current.getBoundingClientRect();e.dataTransfer.setDragImage(z.current,e.clientX-t.left,e.clientY-t.top)}P()},onDragEnd:e=>{e.preventDefault(),q()},onDragOver:e=>{e.preventDefault(),B(eo(e))},onDrop:e=>{e.preventDefault(),J(eo(e))},children:[er&&(0,l.jsxs)("div",{className:"flex flex-col items-center gap-2 border-r border-gray-100 px-2 py-3",children:[(0,l.jsx)("div",{className:"cursor-grab rounded-full border bg-white p-2 text-gray-400 hover:text-gray-600 ".concat(F.isDragging?"border-indigo-300 text-indigo-500 cursor-grabbing":"border-gray-200"),children:(0,l.jsx)(b,{className:"h-4 w-4"})}),(0,l.jsxs)("div",{className:"flex flex-col gap-1 text-gray-400",children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),D()},className:"rounded-md border px-1.5 py-1 text-xs ".concat(r.collapsed?"border-indigo-300 text-indigo-500":"border-gray-200 hover:text-gray-600"),title:r.collapsed?"Expand cell":"Collapse cell",children:r.collapsed?(0,l.jsx)(g,{className:"h-3 w-3"}):(0,l.jsx)(p,{className:"h-3 w-3"})}),!r.collapsed&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),E()},className:"rounded-md border px-1.5 py-1 text-xs ".concat(r.hideEditor?"border-indigo-300 text-indigo-500":"border-gray-200 hover:text-gray-600"),title:r.hideEditor?"Show SQL editor":"Collapse SQL editor",children:(0,l.jsx)(m,{className:"h-3.5 w-3.5"})}),(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),S()},className:"rounded-md border px-1.5 py-1 text-xs ".concat(r.hideResult?"border-indigo-300 text-indigo-500":"border-gray-200 hover:text-gray-600"),title:r.hideResult?"Show results":"Collapse results",children:(0,l.jsx)(h,{className:"h-3.5 w-3.5"})})]})]})]}),(0,l.jsxs)("div",{className:"flex-1 ".concat(er?"p-3":"p-1 sm:p-3"," ").concat(er?"":"md:px-6"),draggable:!1,children:[(0,l.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2 text-xs text-gray-500",children:[(0,l.jsxs)("div",{className:"relative",ref:U,onMouseEnter:()=>{!r.loading&&r.sql.trim()&&Q(!0)},onMouseLeave:()=>Q(!1),children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),!r.loading&&r.sql.trim()&&(k(),Q(!1))},disabled:r.loading||!r.sql.trim(),className:"flex h-8 w-8 items-center justify-center rounded-full border text-sm font-semibold transition ".concat(r.loading||!r.sql.trim()?"border-gray-200 text-gray-400 cursor-not-allowed":H?"border-indigo-400 text-indigo-600 bg-indigo-50":"border-gray-300 text-gray-600 hover:border-indigo-300 hover:text-indigo-600"),title:"Run cell",children:(0,l.jsx)(x,{className:"h-4 w-4"})}),H&&!r.loading&&r.sql.trim()&&(0,l.jsxs)("div",{className:"absolute left-0 mt-2 w-44 rounded-xl border border-gray-200 bg-white shadow-lg z-10",children:[(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),k(),Q(!1)},children:["Run cell",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โโ"})]}),(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),O(),Q(!1)},children:["Run from here",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โฅโ"})]}),(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),T(),Q(!1)},children:["Run to here",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โงโ"})]})]})]}),(0,l.jsx)("span",{children:Z})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),A()},className:"rounded-full border p-1.5 text-gray-500 hover:text-gray-700 ".concat(R?"border-indigo-300 text-indigo-500":"border-gray-200 hover:border-gray-300"),title:R?"Exit fullscreen":"Fullscreen cell",children:(0,l.jsx)(f,{className:"h-4 w-4"})}),!R&&(0,l.jsxs)("div",{className:"relative",ref:W,children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),I(e=>!e)},className:"rounded-full border border-gray-200 p-1.5 text-gray-400 hover:border-gray-300 hover:text-gray-600",title:"Cell options",children:(0,l.jsx)(v,{className:"h-4 w-4"})}),_&&(0,l.jsxs)("div",{className:"absolute right-0 mt-2 w-40 rounded-xl border border-gray-200 bg-white shadow-lg z-10",children:[(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),L(),I(!1)},children:["Move cell up",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โโ"})]}),(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),M(),I(!1)},children:["Move cell down",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โโ"})]}),j&&(0,l.jsx)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-red-600 hover:bg-red-50",onClick:e=>{e.stopPropagation(),N(),I(!1)},children:"Delete"})]})]})]})]}),!r.collapsed&&(0,l.jsxs)("div",{className:"mt-2 space-y-3 ".concat(R?"flex-1 flex flex-col overflow-hidden":""),onClick:C,children:[Y?(0,l.jsx)("div",{className:"rounded-xl bg-white",children:(0,l.jsx)(s.ZP,{value:r.sql,theme:c.tR,height:et,extensions:[c.MH,i.tk.lineWrapping,(0,i.Eu)(),(0,d.ys)({icons:!1}),(0,a.i6)(),el],basicSetup:!1,onChange:w,editable:!r.loading,onFocus:C,style:{fontSize:"14px",height:et,minHeight:"44px"}})}):(0,l.jsxs)("div",{className:"w-full rounded-xl border border-dashed border-gray-200 px-3 py-2 text-left text-sm text-gray-600 bg-white cursor-pointer hover:border-indigo-300 hover:text-indigo-600",onClick:e=>{e.stopPropagation(),E()},children:[(0,l.jsx)("div",{className:"font-mono whitespace-pre-wrap overflow-hidden",style:{maxHeight:"48px"},children:r.sql||"SQL editor collapsed"}),(0,l.jsx)("div",{className:"text-xs text-indigo-500 font-semibold mt-1",children:"Show editor"})]}),r.error&&X&&(0,l.jsx)("div",{className:"rounded-xl border border-red-200 bg-red-50 p-3 text-sm text-red-700",children:r.error}),!r.error&&X&&r.result&&(0,l.jsxs)("div",{className:"".concat(R?"flex-1 flex flex-col":""),children:[(0,l.jsxs)("div",{className:"text-xs font-semibold uppercase tracking-wide text-gray-400",children:[r.result.rowCount," row",1===r.result.rowCount?"":"s"," returned ",r.result.duration?"in ".concat(r.result.duration):""]}),(0,l.jsx)("div",{className:"".concat(R?"flex-1 overflow-auto rounded-xl bg-white mt-2":"space-y-3"),children:(t=r.result).data&&0!==t.data.length?(0,l.jsx)("div",{className:"rounded-lg border border-gray-200 overflow-hidden",children:(0,l.jsx)("div",{className:"overflow-auto max-h-72",children:(0,l.jsxs)("table",{className:"min-w-full text-sm",children:[(0,l.jsx)("thead",{className:"bg-gray-50",children:(0,l.jsx)("tr",{children:t.columns.map((e,r)=>(0,l.jsxs)("th",{className:"px-4 py-3 text-left font-semibold text-gray-700",children:[(0,l.jsx)("div",{children:e}),t.types&&t.types[r]&&(0,l.jsx)("div",{className:"text-xs text-gray-400",children:t.types[r]})]},e+r))})}),(0,l.jsx)("tbody",{children:t.data.map((e,t)=>(0,l.jsx)("tr",{className:t%2==0?"bg-white":"bg-gray-50",children:e.map((e,t)=>(0,l.jsx)("td",{className:"px-4 py-2 text-gray-800 font-mono text-xs",children:e},t))},t))})]})})}):(0,l.jsx)("div",{className:"rounded-lg border border-gray-200 bg-gray-50 p-3 text-center text-sm text-gray-500",children:"No data returned"})})]}),!r.error&&!X&&!r.collapsed]})]})]}),ee&&(0,l.jsx)("div",{className:"".concat(G," bottom-0 opacity-100")})]})};let j="bendsql-notebooks",w={getNotebooks(){try{let e=localStorage.getItem(j);if(e){let t=JSON.parse(e);return{notebooks:t.notebooks.map(e=>({...e,createdAt:new Date(e.createdAt),updatedAt:new Date(e.updatedAt),cells:e.cells.map(e=>{var t,r,l;return{...e,collapsed:null!==(t=e.collapsed)&&void 0!==t&&t,hideEditor:null!==(r=e.hideEditor)&&void 0!==r&&r,hideResult:null!==(l=e.hideResult)&&void 0!==l&&l,lastExecutedAt:e.lastExecutedAt?new Date(e.lastExecutedAt):void 0}})})),currentNotebookId:t.currentNotebookId}}}catch(e){console.error("Failed to load notebooks from storage:",e)}return{notebooks:[]}},saveNotebooks(e){try{localStorage.setItem(j,JSON.stringify(e))}catch(e){console.error("Failed to save notebooks to storage:",e)}},createNotebook(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Untitled Notebook",t=new Date;return{id:k(),name:e,cells:[{id:k(),sql:"",loading:!1,collapsed:!1,hideEditor:!1,hideResult:!1}],createdAt:t,updatedAt:t}},createCell:()=>({id:k(),sql:"",loading:!1,collapsed:!1,hideEditor:!1,hideResult:!1})};function k(){return Date.now().toString(36)+Math.random().toString(36).substr(2)}var N=()=>{let[e,t]=(0,o.useState)([]),[r,s]=(0,o.useState)(null),[a,i]=(0,o.useState)(null),[d,c]=(0,o.useState)(""),[x,g]=(0,o.useState)(null),[p,h]=(0,o.useState)({id:null,placeAfter:!1}),[m,b]=(0,o.useState)(null),[f,j]=(0,o.useState)(!1),[k,N]=(0,o.useState)(null),C=(0,o.useRef)(null),D=(0,o.useRef)(null),[E,S]=(0,o.useState)(!1),A=(0,o.useRef)(null);(0,o.useEffect)(()=>{A.current=r},[r]),(0,o.useEffect)(()=>{let e=w.getNotebooks();t(e.notebooks);let r=e.notebooks[0];if(e.currentNotebookId){let t=e.notebooks.find(t=>t.id===e.currentNotebookId);t&&(r=t)}if(r){var l,o;s(r),i(null!==(o=null===(l=r.cells[0])||void 0===l?void 0:l.id)&&void 0!==o?o:null)}},[]),(0,o.useEffect)(()=>{e.length>0&&w.saveNotebooks({notebooks:e,currentNotebookId:null==r?void 0:r.id})},[e,r]),(0,o.useEffect)(()=>{if(!r){i(null);return}if(!r.cells.some(e=>e.id===a)){var e,t;i(null!==(t=null===(e=r.cells[0])||void 0===e?void 0:e.id)&&void 0!==t?t:null)}},[r,a]),(0,o.useEffect)(()=>{if(!f)return;let e=e=>{D.current&&!D.current.contains(e.target)&&j(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[f]),(0,o.useEffect)(()=>{if(!k)return;let e=e=>{e.target.closest("[data-notebook-menu]")||N(null)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[k]);let L=(0,o.useMemo)(()=>{if(!d.trim())return e;let t=d.toLowerCase();return e.filter(e=>e.name.toLowerCase().includes(t))},[e,d]),M=(0,o.useCallback)(()=>{var e,r;let l=w.createNotebook();t(e=>[...e,l]),s(l),i(null!==(r=null===(e=l.cells[0])||void 0===e?void 0:e.id)&&void 0!==r?r:null)},[]),R=(0,o.useCallback)(t=>{var r,l;let o=e.find(e=>e.id===t);o&&(s(o),i(null!==(l=null===(r=o.cells[0])||void 0===r?void 0:r.id)&&void 0!==l?l:null))},[e]),F=(0,o.useCallback)((e,l)=>{t(t=>t.map(t=>t.id===e?{...t,name:l,updatedAt:new Date}:t)),(null==r?void 0:r.id)===e&&s(e=>e?{...e,name:l,updatedAt:new Date}:null)},[r]),P=(0,o.useCallback)(e=>{if(!r)return;let l=w.createCell(),o=[...r.cells],n=Math.max(0,Math.min(e,o.length));o.splice(n,0,l);let a={...r,cells:o,updatedAt:new Date};i(l.id),s(a),t(e=>e.map(e=>e.id===a.id?a:e))},[r]),q=(0,o.useCallback)(()=>{var e;null===(e=C.current)||void 0===e||e.focus()},[]),B=(0,o.useCallback)(()=>{s(null),i(null),b(null)},[]),J=(0,o.useCallback)(()=>{if(!r)return;let e=w.createCell(),l={...r,cells:[e],updatedAt:new Date};s(l),t(e=>e.map(e=>e.id===l.id?l:e)),i(e.id),b(null)},[r]),O=(0,o.useCallback)(e=>{t(t=>{if(-1===t.findIndex(t=>t.id===e))return t;let l=t.filter(t=>t.id!==e);if((null==r?void 0:r.id)===e){var o,n;let e=l.length>0?l[0]:null;s(e),i(null!==(n=null==e?void 0:null===(o=e.cells[0])||void 0===o?void 0:o.id)&&void 0!==n?n:null),b(null)}return l}),N(null)},[r]),T=(0,o.useCallback)(()=>{b(null)},[]),z=(0,o.useCallback)((e,l)=>{if(!r)return;let o={...r,cells:r.cells.map(t=>t.id===e?{...t,sql:l}:t),updatedAt:new Date};s(o),t(e=>e.map(e=>e.id===o.id?o:e))},[r]),_=(0,o.useCallback)((e,l)=>{if(!r)return;let o={...r,cells:r.cells.map(t=>t.id===e?{...t,[l]:!t[l]}:t),updatedAt:new Date};s(o),t(e=>e.map(e=>e.id===o.id?o:e))},[r]),I=(0,o.useCallback)(function(e,l){let o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!r||e===l)return!1;let n=[...r.cells],a=n.findIndex(t=>t.id===e),d=n.findIndex(e=>e.id===l);if(-1===a||-1===d)return!1;let[c]=n.splice(a,1);n.splice(o?d+1:d,0,c);let u={...r,cells:n,updatedAt:new Date};return s(u),t(e=>e.map(e=>e.id===u.id?u:e)),i(c.id),!0},[r]),W=(0,o.useCallback)((e,t)=>{if(!r)return;let l=r.cells,o=l.findIndex(t=>t.id===e);if(-1===o)return;let n="up"===t?o-1:o+1;n<0||n>=l.length||I(e,l[n].id,"down"===t)},[r,I]),H=(0,o.useCallback)(e=>{g(e),h({id:null,placeAfter:!1})},[]),Q=(0,o.useCallback)(()=>{g(null),h({id:null,placeAfter:!1})},[]),U=(0,o.useCallback)(function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];x&&x!==e&&I(x,e,t)&&h({id:e,placeAfter:t})},[x,I]),Y=(0,o.useCallback)(function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];x&&x!==e&&I(x,e,t),g(null),h({id:null,placeAfter:!1})},[x,I]),X=(0,o.useCallback)(async e=>{let r=A.current;if(!r)return{success:!1};let l=r.cells.find(t=>t.id===e);if(!l||!l.sql.trim())return{success:!1};i(e);let o={...r,cells:r.cells.map(t=>t.id===e?{...t,loading:!0,error:void 0,result:void 0}:t)};s(o),A.current=o;try{let r=await fetch("/api/query",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sql:l.sql,kind:0})});if(!r.ok){let e="HTTP error! status: ".concat(r.status);try{let t=await r.json();t.error&&(e=t.error)}catch(e){}throw Error(e)}let n=(await r.json()).results||[],a=n.length>0?n[n.length-1]:void 0,i={...o,cells:o.cells.map(t=>t.id===e?{...t,loading:!1,result:a,error:void 0,lastExecutedAt:new Date}:t),updatedAt:new Date};return s(i),A.current=i,t(e=>e.map(e=>e.id===i.id?i:e)),{success:!0}}catch(n){console.error("Cell execution failed:",n);let r=n.message.replace(/\\n/g,"\n"),l={...o,cells:o.cells.map(t=>t.id===e?{...t,loading:!1,error:"Query execution failed: "+r,result:void 0}:t),updatedAt:new Date};return s(l),A.current=l,t(e=>e.map(e=>e.id===l.id?l:e)),{success:!1,error:r}}},[]),Z=(0,o.useCallback)(async e=>{let t=A.current;if(t)for(let r of t.cells.slice(e).map(e=>e.id)){let e=await X(r);if(!(null==e?void 0:e.success))break}},[X]),$=(0,o.useCallback)(async e=>{let t=A.current;if(t)for(let r of t.cells.slice(0,Math.min(e+1,t.cells.length)).map(e=>e.id)){let e=await X(r);if(!(null==e?void 0:e.success))break}},[X]);(0,o.useEffect)(()=>{if(!m)return;let e=e=>{"Escape"===e.key&&(e.preventDefault(),T())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[m,T]);let G=(0,o.useCallback)(e=>{if(!r||r.cells.length<=1)return;let l=r.cells.findIndex(t=>t.id===e),o=r.cells[l+1]||r.cells[l-1],n={...r,cells:r.cells.filter(t=>t.id!==e),updatedAt:new Date};i(t=>{var r;return t===e?null!==(r=null==o?void 0:o.id)&&void 0!==r?r:null:t}),s(n),t(e=>e.map(e=>e.id===n.id?n:e)),b(t=>t===e?null:t)},[r]),K=(e,t)=>{if(m)return null;let r="between"===e?"Add cell between":"above"===e?"Add cell above":"Add cell below";return(0,l.jsxs)("button",{type:"button",onClick:()=>P(t),className:"group relative flex w-full items-center justify-center py-1 focus:outline-none",title:r,children:[(0,l.jsx)("span",{className:"pointer-events-none h-px w-full bg-gray-200 transition-colors group-hover:bg-indigo-300"}),(0,l.jsxs)("span",{className:"pointer-events-none absolute left-1/2 -translate-x-1/2 -translate-y-1/2 whitespace-nowrap rounded-full border border-gray-200 bg-white px-3 py-1 text-xs font-semibold text-gray-600 opacity-0 shadow group-hover:-translate-y-1 group-hover:opacity-100 group-hover:border-indigo-300 group-hover:text-indigo-600",children:["+ ",r]})]},"add-control-".concat(t))};return(0,l.jsxs)("div",{className:"relative flex h-full flex-1 flex-col bg-[#f9fbff]",children:[(0,l.jsxs)(n.eh,{direction:"horizontal",className:"flex-1 overflow-hidden",children:[(0,l.jsx)(n.s_,{defaultSize:15,minSize:15,maxSize:30,className:"h-full",children:(0,l.jsxs)("div",{className:"flex h-full flex-col border-r border-gray-200 bg-white",children:[(0,l.jsxs)("div",{className:"p-3 border-b border-gray-100",children:[(0,l.jsx)("label",{className:"text-xs font-semibold uppercase tracking-wide text-gray-400 mb-2 block",children:"Search"}),(0,l.jsxs)("div",{className:"relative",children:[(0,l.jsx)("span",{className:"absolute inset-y-0 left-3 flex items-center text-gray-400",children:(0,l.jsxs)("svg",{className:"h-4 w-4",viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",children:[(0,l.jsx)("path",{d:"m13.5 13.5 3 3",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("circle",{cx:"9",cy:"9",r:"5.5",strokeWidth:"1.6"})]})}),(0,l.jsx)("input",{value:d,onChange:e=>c(e.target.value),placeholder:"Find notebook",className:"w-full rounded-lg border border-gray-200 bg-gray-50 pl-8 pr-3 py-2 text-sm text-gray-700 focus:border-indigo-400 focus:bg-white focus:outline-none"})]})]}),(0,l.jsxs)("div",{className:"flex-1 overflow-y-auto",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between px-3 py-2 text-xs font-semibold uppercase tracking-wide text-gray-500",children:[(0,l.jsxs)("button",{type:"button",className:"inline-flex items-center gap-2 rounded-full border border-transparent px-2 py-1 text-xs font-semibold text-gray-500 hover:text-gray-700",onClick:()=>S(e=>!e),children:[(0,l.jsx)("span",{children:E?"โถ":"โผ"}),(0,l.jsx)("span",{children:"Notebooks"})]}),(0,l.jsx)("button",{type:"button",onClick:M,className:"rounded-full border border-gray-200 px-2 py-1 text-sm font-semibold text-gray-600 hover:border-indigo-300 hover:text-indigo-600",title:"Add notebook",children:"+"})]}),!E&&(0,l.jsxs)("div",{className:"px-2 pb-3 space-y-1",children:[0===L.length&&(0,l.jsx)("div",{className:"text-center text-sm text-gray-500 px-2 py-4",children:"No notebooks found"}),L.map(e=>{let t=(null==r?void 0:r.id)===e.id,o=k===e.id;return(0,l.jsx)("div",{className:"space-y-1","data-notebook-menu":o?"true":void 0,children:(0,l.jsxs)("button",{onClick:()=>R(e.id),className:"w-full text-left px-3 py-2 rounded-lg border transition-all ".concat(t?"border-indigo-300 bg-indigo-50/70 text-indigo-700":"border-transparent hover:border-gray-200 hover:bg-gray-50"),children:[(0,l.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,l.jsx)("span",{className:"font-semibold text-sm truncate",children:e.name||"Untitled Notebook"}),(0,l.jsxs)("div",{className:"flex items-center gap-2 text-[10px] text-gray-400",children:[(0,l.jsx)("span",{className:"uppercase",children:u(e.updatedAt)||"new"}),(0,l.jsxs)("div",{className:"relative","data-notebook-menu-button":!0,children:[(0,l.jsx)("button",{type:"button",onClick:t=>{t.stopPropagation(),N(t=>t===e.id?null:e.id)},className:"rounded-full border p-1 transition ".concat(o?"border-indigo-300 text-indigo-600":"border-gray-200 text-gray-500 hover:border-gray-300"),title:"Notebook options",children:(0,l.jsx)(v,{className:"h-3.5 w-3.5"})}),o&&(0,l.jsx)("div",{className:"absolute right-0 mt-2 w-40 rounded-xl border border-gray-200 bg-white shadow-lg z-10",children:(0,l.jsx)("button",{type:"button",onClick:()=>{O(e.id),N(null)},className:"flex w-full items-center gap-2 px-3 py-2 text-sm text-red-600 hover:bg-red-50",children:"Delete notebook"})})]})]})]}),(0,l.jsxs)("div",{className:"text-xs text-gray-500 mt-1",children:[e.cells.length," cell",1===e.cells.length?"":"s"]})]})},e.id)})]})]})]})}),(0,l.jsx)(n.OT,{className:"group flex w-3 cursor-col-resize items-center justify-center",children:(0,l.jsx)("span",{className:"h-10 w-0.5 rounded-full bg-gray-200 group-hover:bg-indigo-400"})}),(0,l.jsx)(n.s_,{defaultSize:60,minSize:40,className:"h-full",children:(0,l.jsx)("div",{className:"flex h-full flex-col overflow-hidden",children:r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("header",{className:"border-b border-gray-200 bg-white px-4 py-3 flex items-center justify-between gap-3",children:[(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsx)("input",{ref:C,type:"text",value:r.name,onChange:e=>F(r.id,e.target.value),className:"w-full border-none bg-transparent text-xl font-semibold text-gray-900 focus:outline-none",placeholder:"Notebook name"}),(0,l.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:["Updated ",u(r.updatedAt)||"just now"," \xb7 ",r.cells.length," cell",1===r.cells.length?"":"s"]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 text-xs text-gray-500",children:[(0,l.jsx)("span",{className:"hidden sm:inline",children:"โโ to run cell"}),(0,l.jsxs)("div",{className:"relative",ref:D,children:[(0,l.jsx)("button",{type:"button",onClick:()=>j(e=>!e),className:"rounded-full border p-1.5 transition ".concat(f?"border-indigo-300 text-indigo-600":"border-gray-200 text-gray-500 hover:border-gray-300"),title:"Notebook options",children:(0,l.jsx)(v,{className:"h-4 w-4"})}),f&&(0,l.jsxs)("div",{className:"absolute right-0 mt-2 w-44 rounded-xl border border-gray-200 bg-white shadow-lg z-10",children:[(0,l.jsx)("button",{className:"flex w-full items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>{q(),j(!1)},children:"Rename"}),(0,l.jsx)("button",{className:"flex w-full items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>{B(),j(!1)},children:"Close"}),(0,l.jsx)("button",{className:"flex w-full items-center gap-2 px-3 py-2 text-sm text-red-600 hover:bg-red-50",onClick:()=>{J(),j(!1)},children:"Delete all cells"})]})]})]})]}),(0,l.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 py-4 ".concat(m?"space-y-0":"space-y-3"),children:[!m&&K("above",0),r.cells.map((e,t)=>m&&e.id!==m?null:(0,l.jsxs)(o.Fragment,{children:[(0,l.jsx)(y,{cell:e,index:t,onSqlChange:t=>z(e.id,t),onExecute:()=>X(e.id),onDelete:()=>G(e.id),canDelete:r.cells.length>1,isActive:e.id===a||m===e.id,onSelect:()=>i(e.id),onToggleCollapse:()=>_(e.id,"collapsed"),onToggleEditor:()=>_(e.id,"hideEditor"),onToggleResult:()=>_(e.id,"hideResult"),onToggleFullscreen:()=>b(t=>t===e.id?null:e.id),isFullscreen:m===e.id,onMoveUp:()=>W(e.id,"up"),onMoveDown:()=>W(e.id,"down"),dragState:{isDragging:x===e.id,isDragOver:p.id===e.id,dragOverPosition:p.id===e.id?p.placeAfter?"after":"before":void 0},onDragStart:()=>H(e.id),onDragEnd:Q,onDragOver:t=>U(e.id,t),onDrop:t=>Y(e.id,t),onRunFromHere:()=>{Z(t)},onRunToHere:()=>{$(t)}}),!m&&K(t===r.cells.length-1?"below":"between",t+1)]},e.id)),!m&&K("below",r.cells.length)]})]}):(0,l.jsx)("div",{className:"flex-1 flex items-center justify-center",children:(0,l.jsxs)("div",{className:"text-center max-w-xs",children:[(0,l.jsx)("p",{className:"text-lg font-semibold text-gray-800 mb-2",children:"No notebooks yet"}),(0,l.jsx)("p",{className:"text-sm text-gray-500 mb-4",children:"Create your first notebook to start experimenting with queries."}),(0,l.jsx)("button",{onClick:M,className:"rounded-xl bg-indigo-600 px-5 py-2 text-sm font-medium text-white hover:bg-indigo-500",children:"Create Notebook"})]})})})})]}),m&&(0,l.jsx)("div",{className:"absolute inset-x-0 top-[68px] z-10 flex justify-end px-6",children:(0,l.jsx)("button",{onClick:T,className:"rounded-full border border-gray-300 bg-white px-3 py-1 text-xs font-semibold text-gray-600 shadow-sm hover:border-gray-400",children:"Exit fullscreen โ"})})]})}},5122:function(e,t,r){r.d(t,{MH:function(){return i},tR:function(){return a}});var l=r(1861),o=r(3233),n=r(987);let s={background:"#fff",foreground:"#3D3D3D",selection:"#BBDFFF",selectionMatch:"#BBDFFF",gutterBackground:"#fff",gutterForeground:"#AFAFAF",lineHighlight:"#EDF4FF"},a=function(e){let{theme:t="light",settings:r={},styles:n=[]}={};return(0,o.j)({theme:t,settings:{...s,...r},styles:[{tag:[l.pJ.comment,l.pJ.quote],color:"#707F8D"},{tag:[l.pJ.typeName,l.pJ.typeOperator],color:"#aa0d91"},{tag:[l.pJ.keyword],color:"#aa0d91",fontWeight:"bold"},{tag:[l.pJ.string,l.pJ.meta],color:"#D23423"},{tag:[l.pJ.name],color:"#032f62"},{tag:[l.pJ.typeName],color:"#522BB2"},{tag:[l.pJ.variableName],color:"#23575C"},{tag:[l.pJ.definition(l.pJ.variableName)],color:"#327A9E"},{tag:[l.pJ.regexp,l.pJ.link],color:"#0e0eff"},...n]})}(),i=n.tk.theme({"&":{fontSize:"12pt",border:"1px solid #556cd6","border-radius":"3px",padding:"3px"},"&.cm-editor.cm-focused":{outline:"none","border-width":"2px","border-color":"#fcd004"},".cm-tooltip-autocomplete":{border:"1px solid #556cd6","border-radius":"3px",margin:"3px",padding:"3px",background:"white",color:"black"},".cm-completionMatchedText":{"text-decoration":"none"},".cm-tooltip-autocomplete ul li[aria-selected]":{background:"white",color:"black","font-weight":"bold"}})}}]);
\ No newline at end of file
+"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[77],{6077:function(e,t,r){r.r(t),r.d(t,{default:function(){return N}});var l=r(2676),o=r(5271),n=r(9822),s=r(9675),a=r(2327),i=r(987),d=r(9619),c=r(5122);function u(e){if(!e)return"";let t=e instanceof Date?e:new Date(e);if(isNaN(t.getTime()))return"";let r=Date.now()-t.getTime();return r<6e4?"just now":r<36e5?"".concat(Math.floor(r/6e4),"m ago"):r<864e5?"".concat(Math.floor(r/36e5),"h ago"):r<6048e5?"".concat(Math.floor(r/864e5),"d ago"):t.toLocaleDateString()}let x=e=>(0,l.jsx)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:(0,l.jsx)("path",{d:"M7 5v10l7-5-7-5z",fill:"currentColor",stroke:"none"})}),g=e=>(0,l.jsx)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:(0,l.jsx)("path",{d:"M6 8l4 4 4-4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})}),p=e=>(0,l.jsx)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:(0,l.jsx)("path",{d:"M6 12l4-4 4 4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})}),h=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:[(0,l.jsx)("rect",{x:"4",y:"4",width:"5",height:"12",rx:"1.5"}),(0,l.jsx)("rect",{x:"11",y:"4",width:"5",height:"12",rx:"1.5"})]}),b=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:[(0,l.jsx)("path",{d:"M7 6 4 10l3 4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("path",{d:"m13 6 3 4-3 4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})]}),m=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:[(0,l.jsx)("circle",{cx:"7",cy:"6",r:"1"}),(0,l.jsx)("circle",{cx:"13",cy:"6",r:"1"}),(0,l.jsx)("circle",{cx:"7",cy:"10",r:"1"}),(0,l.jsx)("circle",{cx:"13",cy:"10",r:"1"}),(0,l.jsx)("circle",{cx:"7",cy:"14",r:"1"}),(0,l.jsx)("circle",{cx:"13",cy:"14",r:"1"})]}),f=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",...e,children:[(0,l.jsx)("path",{d:"M8 4H4v4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("path",{d:"M12 4h4v4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("path",{d:"M8 16H4v-4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("path",{d:"M12 16h4v-4",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})]}),v=e=>(0,l.jsxs)("svg",{viewBox:"0 0 20 20",fill:"currentColor",stroke:"none",...e,children:[(0,l.jsx)("circle",{cx:"5",cy:"10",r:"1.5"}),(0,l.jsx)("circle",{cx:"10",cy:"10",r:"1.5"}),(0,l.jsx)("circle",{cx:"15",cy:"10",r:"1.5"})]});var y=e=>{var t;let{cell:r,index:n,isActive:y,canDelete:j,onSqlChange:w,onExecute:k,onDelete:N,onSelect:C,onToggleCollapse:D,onToggleEditor:E,onToggleResult:S,onToggleFullscreen:A,onMoveUp:L,onMoveDown:M,isFullscreen:R=!1,dragState:F,onDragStart:P,onDragEnd:q,onDragOver:B,onDrop:J,onRunFromHere:O=()=>{},onRunToHere:T=()=>{}}=e,z=(0,o.useRef)(null),[_,I]=(0,o.useState)(!1),W=(0,o.useRef)(null),[H,Q]=(0,o.useState)(!1),U=(0,o.useRef)(null);(0,o.useEffect)(()=>{if(!_)return;let e=e=>{W.current&&!W.current.contains(e.target)&&I(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[_]),(0,o.useEffect)(()=>{if(!H)return;let e=e=>{U.current&&!U.current.contains(e.target)&&Q(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[H]);let Y=!r.hideEditor&&!r.collapsed,X=!r.hideResult&&!r.collapsed,Z=(0,o.useMemo)(()=>r.loading?"Running query":r.lastExecutedAt?"Ran ".concat(u(r.lastExecutedAt)):"Ready to run",[r.loading,r.lastExecutedAt]),$=["flex","gap-3","rounded-2xl","border","bg-white/95","backdrop-blur-[2px]","transition-all",F.isDragOver?"ring-1 ring-indigo-300 border-indigo-300":"border-gray-100",R?"shadow-[0_0_0_2px_rgba(99,102,241,0.35)] border-indigo-300":y?"shadow-[0_15px_35px_-20px_rgba(79,70,229,0.45)]":"shadow-sm hover:shadow-md hover:border-gray-200",r.loading?"ring-1 ring-blue-300 border-blue-200 bg-blue-50/80":""].join(" "),G="absolute left-0 right-0 h-1 bg-indigo-500/80 rounded-full transition-opacity pointer-events-none opacity-0",K=F.isDragOver?"after"===F.dragOverPosition?"translate-y-1.5":"-translate-y-1.5":"translate-y-0",V=F.isDragOver&&"before"===F.dragOverPosition,ee=F.isDragOver&&"after"===F.dragOverPosition,et="auto",er=!R,el=(0,o.useMemo)(()=>i.$f.of([{key:"Mod-Enter",run:()=>(k(),!0),preventDefault:!0},{key:"Mod-NumpadEnter",run:()=>(k(),!0),preventDefault:!0},{key:"Alt-Enter",run:()=>(null==O||O(),!0),preventDefault:!0},{key:"Shift-Enter",run:()=>(null==T||T(),!0),preventDefault:!0}]),[k,O,T]),eo=e=>{if(!z.current)return!1;let t=z.current.getBoundingClientRect();return e.clientY-t.top>t.height/2};return(0,l.jsxs)("div",{className:"relative",children:[V&&(0,l.jsx)("div",{className:"".concat(G," top-0 opacity-100")}),(0,l.jsxs)("div",{ref:z,className:"".concat($," ").concat(R?"h-full min-h-[calc(100vh-180px)]":""," ").concat(F.isDragging?"opacity-50 cursor-grabbing":""," transform transition-transform duration-150 ").concat(K),onClick:C,draggable:!R,onDragStart:e=>{if(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",r.id),z.current){let t=z.current.getBoundingClientRect();e.dataTransfer.setDragImage(z.current,e.clientX-t.left,e.clientY-t.top)}P()},onDragEnd:e=>{e.preventDefault(),q()},onDragOver:e=>{e.preventDefault(),B(eo(e))},onDrop:e=>{e.preventDefault(),J(eo(e))},children:[er&&(0,l.jsxs)("div",{className:"flex flex-col items-center gap-2 border-r border-gray-100 px-2 py-3",children:[(0,l.jsx)("div",{className:"cursor-grab rounded-full border bg-white p-2 text-gray-400 hover:text-gray-600 ".concat(F.isDragging?"border-indigo-300 text-indigo-500 cursor-grabbing":"border-gray-200"),children:(0,l.jsx)(m,{className:"h-4 w-4"})}),(0,l.jsxs)("div",{className:"flex flex-col gap-1 text-gray-400",children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),D()},className:"rounded-md border px-1.5 py-1 text-xs ".concat(r.collapsed?"border-indigo-300 text-indigo-500":"border-gray-200 hover:text-gray-600"),title:r.collapsed?"Expand cell":"Collapse cell",children:r.collapsed?(0,l.jsx)(g,{className:"h-3 w-3"}):(0,l.jsx)(p,{className:"h-3 w-3"})}),!r.collapsed&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),E()},className:"rounded-md border px-1.5 py-1 text-xs ".concat(r.hideEditor?"border-indigo-300 text-indigo-500":"border-gray-200 hover:text-gray-600"),title:r.hideEditor?"Show SQL editor":"Collapse SQL editor",children:(0,l.jsx)(b,{className:"h-3.5 w-3.5"})}),(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),S()},className:"rounded-md border px-1.5 py-1 text-xs ".concat(r.hideResult?"border-indigo-300 text-indigo-500":"border-gray-200 hover:text-gray-600"),title:r.hideResult?"Show results":"Collapse results",children:(0,l.jsx)(h,{className:"h-3.5 w-3.5"})})]})]})]}),(0,l.jsxs)("div",{className:"flex-1 ".concat(er?"p-3":"p-1 sm:p-3"," ").concat(er?"":"md:px-6"),draggable:!1,children:[(0,l.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,l.jsxs)("div",{className:"flex items-center gap-2 text-xs text-gray-500",children:[(0,l.jsxs)("div",{className:"relative",ref:U,onMouseEnter:()=>{!r.loading&&r.sql.trim()&&Q(!0)},onMouseLeave:()=>Q(!1),children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),!r.loading&&r.sql.trim()&&(k(),Q(!1))},disabled:r.loading||!r.sql.trim(),className:"flex h-8 w-8 items-center justify-center rounded-full border text-sm font-semibold transition ".concat(r.loading||!r.sql.trim()?"border-gray-200 text-gray-400 cursor-not-allowed":H?"border-indigo-400 text-indigo-600 bg-indigo-50":"border-gray-300 text-gray-600 hover:border-indigo-300 hover:text-indigo-600"),title:"Run cell",children:(0,l.jsx)(x,{className:"h-4 w-4"})}),H&&!r.loading&&r.sql.trim()&&(0,l.jsxs)("div",{className:"absolute left-0 mt-2 w-44 rounded-xl border border-gray-200 bg-white shadow-lg z-10",children:[(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),k(),Q(!1)},children:["Run cell",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โโ"})]}),(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),O(),Q(!1)},children:["Run from here",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โฅโ"})]}),(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),T(),Q(!1)},children:["Run to here",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โงโ"})]})]})]}),(0,l.jsx)("span",{className:"inline-flex items-center rounded-full px-2 py-0.5 text-[11px] font-semibold ".concat(r.loading?"bg-blue-100 text-blue-700":"bg-gray-100 text-gray-600"),children:Z})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),A()},className:"rounded-full border p-1.5 text-gray-500 hover:text-gray-700 ".concat(R?"border-indigo-300 text-indigo-500":"border-gray-200 hover:border-gray-300"),title:R?"Exit fullscreen":"Fullscreen cell",children:(0,l.jsx)(f,{className:"h-4 w-4"})}),!R&&(0,l.jsxs)("div",{className:"relative",ref:W,children:[(0,l.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),I(e=>!e)},className:"rounded-full border border-gray-200 p-1.5 text-gray-400 hover:border-gray-300 hover:text-gray-600",title:"Cell options",children:(0,l.jsx)(v,{className:"h-4 w-4"})}),_&&(0,l.jsxs)("div",{className:"absolute right-0 mt-2 w-40 rounded-xl border border-gray-200 bg-white shadow-lg z-10",children:[(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),L(),I(!1)},children:["Move cell up",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โโ"})]}),(0,l.jsxs)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:e=>{e.stopPropagation(),M(),I(!1)},children:["Move cell down",(0,l.jsx)("span",{className:"text-xs text-gray-400",children:"โโ"})]}),j&&(0,l.jsx)("button",{className:"flex w-full items-center justify-between px-3 py-2 text-sm text-red-600 hover:bg-red-50",onClick:e=>{e.stopPropagation(),N(),I(!1)},children:"Delete"})]})]})]})]}),!r.collapsed&&(0,l.jsxs)("div",{className:"mt-2 space-y-3 ".concat(R?"flex-1 flex flex-col overflow-hidden":""),onClick:C,children:[Y?(0,l.jsx)("div",{className:"rounded-xl bg-white",children:(0,l.jsx)(s.ZP,{value:r.sql,theme:c.tR,height:et,extensions:[c.MH,i.tk.lineWrapping,(0,i.Eu)(),(0,d.ys)({icons:!1}),(0,a.i6)(),el],basicSetup:!1,onChange:w,editable:!r.loading,onFocus:C,style:{fontSize:"14px",height:et,minHeight:"44px"}})}):(0,l.jsxs)("div",{className:"w-full rounded-xl border border-dashed border-gray-200 px-3 py-2 text-left text-sm text-gray-600 bg-white cursor-pointer hover:border-indigo-300 hover:text-indigo-600",onClick:e=>{e.stopPropagation(),E()},children:[(0,l.jsx)("div",{className:"font-mono whitespace-pre-wrap overflow-hidden",style:{maxHeight:"48px"},children:r.sql||"SQL editor collapsed"}),(0,l.jsx)("div",{className:"text-xs text-indigo-500 font-semibold mt-1",children:"Show editor"})]}),r.error&&X&&(0,l.jsx)("div",{className:"rounded-xl border border-red-200 bg-red-50 p-3 text-sm text-red-700",children:r.error}),!r.error&&X&&r.result&&(0,l.jsxs)("div",{className:"".concat(R?"flex-1 flex flex-col":""),children:[(0,l.jsxs)("div",{className:"text-xs font-semibold uppercase tracking-wide text-gray-400",children:[r.result.rowCount," row",1===r.result.rowCount?"":"s"," returned ",r.result.duration?"in ".concat(r.result.duration):""]}),(0,l.jsx)("div",{className:"".concat(R?"flex-1 overflow-auto rounded-xl border border-gray-100 bg-white mt-2":"space-y-3"),children:(t=r.result).data&&0!==t.data.length?(0,l.jsx)("div",{className:"rounded-lg border border-gray-200 overflow-hidden",children:(0,l.jsx)("div",{className:"overflow-auto max-h-72",children:(0,l.jsxs)("table",{className:"min-w-full text-sm",children:[(0,l.jsx)("thead",{className:"bg-gray-50",children:(0,l.jsx)("tr",{children:t.columns.map((e,r)=>(0,l.jsxs)("th",{className:"px-4 py-3 text-left font-semibold text-gray-700",children:[(0,l.jsx)("div",{children:e}),t.types&&t.types[r]&&(0,l.jsx)("div",{className:"text-xs text-gray-400",children:t.types[r]})]},e+r))})}),(0,l.jsx)("tbody",{children:t.data.map((e,t)=>(0,l.jsx)("tr",{className:t%2==0?"bg-white":"bg-gray-50",children:e.map((e,t)=>(0,l.jsx)("td",{className:"px-4 py-2 text-gray-800 font-mono text-xs",children:e},t))},t))})]})})}):(0,l.jsx)("div",{className:"rounded-lg border border-gray-200 bg-gray-50 p-3 text-center text-sm text-gray-500",children:"No data returned"})})]}),!r.error&&!X&&!r.collapsed]})]})]}),ee&&(0,l.jsx)("div",{className:"".concat(G," bottom-0 opacity-100")})]})};let j="bendsql-notebooks",w={getNotebooks(){try{let e=localStorage.getItem(j);if(e){let t=JSON.parse(e);return{notebooks:t.notebooks.map(e=>({...e,createdAt:new Date(e.createdAt),updatedAt:new Date(e.updatedAt),cells:e.cells.map(e=>{var t,r,l;return{...e,collapsed:null!==(t=e.collapsed)&&void 0!==t&&t,hideEditor:null!==(r=e.hideEditor)&&void 0!==r&&r,hideResult:null!==(l=e.hideResult)&&void 0!==l&&l,lastExecutedAt:e.lastExecutedAt?new Date(e.lastExecutedAt):void 0}})})),currentNotebookId:t.currentNotebookId}}}catch(e){console.error("Failed to load notebooks from storage:",e)}return{notebooks:[]}},saveNotebooks(e){try{localStorage.setItem(j,JSON.stringify(e))}catch(e){console.error("Failed to save notebooks to storage:",e)}},createNotebook(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Untitled Notebook",t=new Date;return{id:k(),name:e,cells:[{id:k(),sql:"",loading:!1,collapsed:!1,hideEditor:!1,hideResult:!1}],createdAt:t,updatedAt:t}},createCell:()=>({id:k(),sql:"",loading:!1,collapsed:!1,hideEditor:!1,hideResult:!1})};function k(){return Date.now().toString(36)+Math.random().toString(36).substr(2)}var N=()=>{let[e,t]=(0,o.useState)([]),[r,s]=(0,o.useState)(null),[a,i]=(0,o.useState)(null),[d,c]=(0,o.useState)(""),[x,g]=(0,o.useState)(null),[p,h]=(0,o.useState)({id:null,placeAfter:!1}),[b,m]=(0,o.useState)(null),[f,j]=(0,o.useState)(!1),[k,N]=(0,o.useState)(null),C=(0,o.useRef)(null),D=(0,o.useRef)(null),[E,S]=(0,o.useState)(!1),A=(0,o.useRef)(null);(0,o.useEffect)(()=>{A.current=r},[r]),(0,o.useEffect)(()=>{let e=w.getNotebooks();t(e.notebooks);let r=e.notebooks[0];if(e.currentNotebookId){let t=e.notebooks.find(t=>t.id===e.currentNotebookId);t&&(r=t)}if(r){var l,o;s(r),i(null!==(o=null===(l=r.cells[0])||void 0===l?void 0:l.id)&&void 0!==o?o:null)}},[]),(0,o.useEffect)(()=>{e.length>0&&w.saveNotebooks({notebooks:e,currentNotebookId:null==r?void 0:r.id})},[e,r]),(0,o.useEffect)(()=>{if(!r){i(null);return}if(!r.cells.some(e=>e.id===a)){var e,t;i(null!==(t=null===(e=r.cells[0])||void 0===e?void 0:e.id)&&void 0!==t?t:null)}},[r,a]),(0,o.useEffect)(()=>{if(!f)return;let e=e=>{D.current&&!D.current.contains(e.target)&&j(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[f]),(0,o.useEffect)(()=>{if(!k)return;let e=e=>{e.target.closest("[data-notebook-menu]")||N(null)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[k]);let L=(0,o.useMemo)(()=>{if(!d.trim())return e;let t=d.toLowerCase();return e.filter(e=>e.name.toLowerCase().includes(t))},[e,d]),M=(0,o.useCallback)(()=>{var e,r;let l=w.createNotebook();t(e=>[...e,l]),s(l),i(null!==(r=null===(e=l.cells[0])||void 0===e?void 0:e.id)&&void 0!==r?r:null)},[]),R=(0,o.useCallback)(t=>{var r,l;let o=e.find(e=>e.id===t);o&&(s(o),i(null!==(l=null===(r=o.cells[0])||void 0===r?void 0:r.id)&&void 0!==l?l:null))},[e]),F=(0,o.useCallback)((e,l)=>{t(t=>t.map(t=>t.id===e?{...t,name:l,updatedAt:new Date}:t)),(null==r?void 0:r.id)===e&&s(e=>e?{...e,name:l,updatedAt:new Date}:null)},[r]),P=(0,o.useCallback)(e=>{if(!r)return;let l=w.createCell(),o=[...r.cells],n=Math.max(0,Math.min(e,o.length));o.splice(n,0,l);let a={...r,cells:o,updatedAt:new Date};i(l.id),s(a),t(e=>e.map(e=>e.id===a.id?a:e))},[r]),q=(0,o.useCallback)(()=>{var e;null===(e=C.current)||void 0===e||e.focus()},[]),B=(0,o.useCallback)(()=>{s(null),i(null),m(null)},[]),J=(0,o.useCallback)(()=>{if(!r)return;let e=w.createCell(),l={...r,cells:[e],updatedAt:new Date};s(l),t(e=>e.map(e=>e.id===l.id?l:e)),i(e.id),m(null)},[r]),O=(0,o.useCallback)(e=>{t(t=>{if(-1===t.findIndex(t=>t.id===e))return t;let l=t.filter(t=>t.id!==e);if((null==r?void 0:r.id)===e){var o,n;let e=l.length>0?l[0]:null;s(e),i(null!==(n=null==e?void 0:null===(o=e.cells[0])||void 0===o?void 0:o.id)&&void 0!==n?n:null),m(null)}return l}),N(null)},[r]),T=(0,o.useCallback)(()=>{m(null)},[]),z=(0,o.useCallback)((e,l)=>{if(!r)return;let o={...r,cells:r.cells.map(t=>t.id===e?{...t,sql:l}:t),updatedAt:new Date};s(o),t(e=>e.map(e=>e.id===o.id?o:e))},[r]),_=(0,o.useCallback)((e,l)=>{if(!r)return;let o={...r,cells:r.cells.map(t=>t.id===e?{...t,[l]:!t[l]}:t),updatedAt:new Date};s(o),t(e=>e.map(e=>e.id===o.id?o:e))},[r]),I=(0,o.useCallback)(function(e,l){let o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!r||e===l)return!1;let n=[...r.cells],a=n.findIndex(t=>t.id===e),d=n.findIndex(e=>e.id===l);if(-1===a||-1===d)return!1;let[c]=n.splice(a,1);n.splice(o?d+1:d,0,c);let u={...r,cells:n,updatedAt:new Date};return s(u),t(e=>e.map(e=>e.id===u.id?u:e)),i(c.id),!0},[r]),W=(0,o.useCallback)((e,t)=>{if(!r)return;let l=r.cells,o=l.findIndex(t=>t.id===e);if(-1===o)return;let n="up"===t?o-1:o+1;n<0||n>=l.length||I(e,l[n].id,"down"===t)},[r,I]),H=(0,o.useCallback)(e=>{g(e),h({id:null,placeAfter:!1})},[]),Q=(0,o.useCallback)(()=>{g(null),h({id:null,placeAfter:!1})},[]),U=(0,o.useCallback)(function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];x&&x!==e&&I(x,e,t)&&h({id:e,placeAfter:t})},[x,I]),Y=(0,o.useCallback)(function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];x&&x!==e&&I(x,e,t),g(null),h({id:null,placeAfter:!1})},[x,I]),X=(0,o.useCallback)(async e=>{let r=A.current;if(!r)return{success:!1};let l=r.cells.find(t=>t.id===e);if(!l||!l.sql.trim())return{success:!1};i(e);let o={...r,cells:r.cells.map(t=>t.id===e?{...t,loading:!0,error:void 0,result:void 0}:t)};s(o),A.current=o;try{let r=await fetch("/api/query",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sql:l.sql,kind:0})});if(!r.ok){let e="HTTP error! status: ".concat(r.status);try{let t=await r.json();t.error&&(e=t.error)}catch(e){}throw Error(e)}let n=(await r.json()).results||[],a=n.length>0?n[n.length-1]:void 0,i={...o,cells:o.cells.map(t=>t.id===e?{...t,loading:!1,result:a,error:void 0,lastExecutedAt:new Date}:t),updatedAt:new Date};return s(i),A.current=i,t(e=>e.map(e=>e.id===i.id?i:e)),{success:!0}}catch(n){console.error("Cell execution failed:",n);let r=n.message.replace(/\\n/g,"\n"),l={...o,cells:o.cells.map(t=>t.id===e?{...t,loading:!1,error:"Query execution failed: "+r,result:void 0}:t),updatedAt:new Date};return s(l),A.current=l,t(e=>e.map(e=>e.id===l.id?l:e)),{success:!1,error:r}}},[]),Z=(0,o.useCallback)(async e=>{let t=A.current;if(t)for(let r of t.cells.slice(e).map(e=>e.id)){let e=await X(r);if(!(null==e?void 0:e.success))break}},[X]),$=(0,o.useCallback)(async e=>{let t=A.current;if(t)for(let r of t.cells.slice(0,Math.min(e+1,t.cells.length)).map(e=>e.id)){let e=await X(r);if(!(null==e?void 0:e.success))break}},[X]);(0,o.useEffect)(()=>{if(!b)return;let e=e=>{"Escape"===e.key&&(e.preventDefault(),T())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[b,T]);let G=(0,o.useCallback)(e=>{if(!r||r.cells.length<=1)return;let l=r.cells.findIndex(t=>t.id===e),o=r.cells[l+1]||r.cells[l-1],n={...r,cells:r.cells.filter(t=>t.id!==e),updatedAt:new Date};i(t=>{var r;return t===e?null!==(r=null==o?void 0:o.id)&&void 0!==r?r:null:t}),s(n),t(e=>e.map(e=>e.id===n.id?n:e)),m(t=>t===e?null:t)},[r]),K=(e,t)=>{if(b)return null;let r="between"===e?"Add cell between":"above"===e?"Add cell above":"Add cell below";return(0,l.jsxs)("button",{type:"button",onClick:()=>P(t),className:"group relative flex w-full items-center justify-center py-1 focus:outline-none",title:r,children:[(0,l.jsx)("span",{className:"pointer-events-none h-px w-full bg-gray-200 transition-colors group-hover:bg-indigo-300"}),(0,l.jsxs)("span",{className:"pointer-events-none absolute left-1/2 -translate-x-1/2 -translate-y-1/2 whitespace-nowrap rounded-full border border-gray-200 bg-white px-3 py-1 text-xs font-semibold text-gray-600 opacity-0 shadow group-hover:-translate-y-1 group-hover:opacity-100 group-hover:border-indigo-300 group-hover:text-indigo-600",children:["+ ",r]})]},"add-control-".concat(t))};return(0,l.jsxs)("div",{className:"relative flex h-full flex-1 flex-col bg-[#f4f6fb]",children:[(0,l.jsxs)(n.eh,{direction:"horizontal",className:"flex-1 overflow-hidden",children:[(0,l.jsx)(n.s_,{defaultSize:15,minSize:15,maxSize:30,className:"h-full",children:(0,l.jsxs)("div",{className:"flex h-full flex-col border-r border-gray-200 bg-white",children:[(0,l.jsxs)("div",{className:"p-3 border-b border-gray-100",children:[(0,l.jsx)("label",{className:"text-xs font-semibold uppercase tracking-wide text-gray-400 mb-2 block",children:"Search"}),(0,l.jsxs)("div",{className:"relative",children:[(0,l.jsx)("span",{className:"absolute inset-y-0 left-3 flex items-center text-gray-400",children:(0,l.jsxs)("svg",{className:"h-4 w-4",viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",children:[(0,l.jsx)("path",{d:"m13.5 13.5 3 3",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"}),(0,l.jsx)("circle",{cx:"9",cy:"9",r:"5.5",strokeWidth:"1.6"})]})}),(0,l.jsx)("input",{value:d,onChange:e=>c(e.target.value),placeholder:"Find notebook",className:"w-full rounded-lg border border-gray-200 bg-gray-50 pl-8 pr-3 py-2 text-sm text-gray-700 focus:border-indigo-400 focus:bg-white focus:outline-none"})]})]}),(0,l.jsxs)("div",{className:"flex-1 overflow-y-auto",children:[(0,l.jsxs)("div",{className:"flex items-center justify-between px-3 py-2 text-xs font-semibold uppercase tracking-wide text-gray-500",children:[(0,l.jsxs)("button",{type:"button",className:"inline-flex items-center gap-2 rounded-full border border-transparent px-2 py-1 text-xs font-semibold text-gray-500 hover:text-gray-700",onClick:()=>S(e=>!e),children:[(0,l.jsx)("span",{children:E?"โถ":"โผ"}),(0,l.jsx)("span",{children:"Notebooks"})]}),(0,l.jsx)("button",{type:"button",onClick:M,className:"rounded-full border border-gray-200 px-2 py-1 text-sm font-semibold text-gray-600 hover:border-indigo-300 hover:text-indigo-600",title:"Add notebook",children:"+"})]}),!E&&(0,l.jsxs)("div",{className:"px-2 pb-3 space-y-1",children:[0===L.length&&(0,l.jsx)("div",{className:"text-center text-sm text-gray-500 px-2 py-4",children:"No notebooks found"}),L.map(e=>{let t=(null==r?void 0:r.id)===e.id,o=k===e.id;return(0,l.jsx)("div",{className:"space-y-1","data-notebook-menu":o?"true":void 0,children:(0,l.jsxs)("button",{onClick:()=>R(e.id),className:"w-full text-left px-3 py-2 rounded-lg border transition-all ".concat(t?"border-indigo-300 bg-indigo-50/70 text-indigo-700":"border-transparent hover:border-gray-200 hover:bg-gray-50"),children:[(0,l.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,l.jsx)("span",{className:"font-semibold text-sm truncate",children:e.name||"Untitled Notebook"}),(0,l.jsxs)("div",{className:"flex items-center gap-2 text-[10px] text-gray-400",children:[(0,l.jsx)("span",{className:"uppercase",children:u(e.updatedAt)||"new"}),(0,l.jsxs)("div",{className:"relative","data-notebook-menu-button":!0,children:[(0,l.jsx)("button",{type:"button",onClick:t=>{t.stopPropagation(),N(t=>t===e.id?null:e.id)},className:"rounded-full border p-1 transition ".concat(o?"border-indigo-300 text-indigo-600":"border-gray-200 text-gray-500 hover:border-gray-300"),title:"Notebook options",children:(0,l.jsx)(v,{className:"h-3.5 w-3.5"})}),o&&(0,l.jsx)("div",{className:"absolute right-0 mt-2 w-40 rounded-xl border border-gray-200 bg-white shadow-lg z-10",children:(0,l.jsx)("button",{type:"button",onClick:()=>{O(e.id),N(null)},className:"flex w-full items-center gap-2 px-3 py-2 text-sm text-red-600 hover:bg-red-50",children:"Delete notebook"})})]})]})]}),(0,l.jsxs)("div",{className:"text-xs text-gray-500 mt-1",children:[e.cells.length," cell",1===e.cells.length?"":"s"]})]})},e.id)})]})]})]})}),(0,l.jsx)(n.OT,{className:"group flex w-3 cursor-col-resize items-center justify-center",children:(0,l.jsx)("span",{className:"h-10 w-0.5 rounded-full bg-gray-200 group-hover:bg-indigo-400"})}),(0,l.jsx)(n.s_,{defaultSize:60,minSize:40,className:"h-full",children:(0,l.jsx)("div",{className:"flex h-full flex-col overflow-hidden",children:r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)("header",{className:"border-b border-gray-200 bg-white px-4 py-3 flex items-center justify-between gap-3",children:[(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsx)("input",{ref:C,type:"text",value:r.name,onChange:e=>F(r.id,e.target.value),className:"w-full border-none bg-transparent text-xl font-semibold text-gray-900 focus:outline-none",placeholder:"Notebook name"}),(0,l.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:["Updated ",u(r.updatedAt)||"just now"," \xb7 ",r.cells.length," cell",1===r.cells.length?"":"s"]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2 text-xs text-gray-500",children:[(0,l.jsx)("span",{className:"hidden sm:inline",children:"โโ to run cell"}),(0,l.jsxs)("div",{className:"relative",ref:D,children:[(0,l.jsx)("button",{type:"button",onClick:()=>j(e=>!e),className:"rounded-full border p-1.5 transition ".concat(f?"border-indigo-300 text-indigo-600":"border-gray-200 text-gray-500 hover:border-gray-300"),title:"Notebook options",children:(0,l.jsx)(v,{className:"h-4 w-4"})}),f&&(0,l.jsxs)("div",{className:"absolute right-0 mt-2 w-44 rounded-xl border border-gray-200 bg-white shadow-lg z-10",children:[(0,l.jsx)("button",{className:"flex w-full items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>{q(),j(!1)},children:"Rename"}),(0,l.jsx)("button",{className:"flex w-full items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-50",onClick:()=>{B(),j(!1)},children:"Close"}),(0,l.jsx)("button",{className:"flex w-full items-center gap-2 px-3 py-2 text-sm text-red-600 hover:bg-red-50",onClick:()=>{J(),j(!1)},children:"Delete all cells"})]})]})]})]}),(0,l.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 py-4 ".concat(b?"space-y-0":"space-y-3"),children:[!b&&K("above",0),r.cells.map((e,t)=>b&&e.id!==b?null:(0,l.jsxs)(o.Fragment,{children:[(0,l.jsx)(y,{cell:e,index:t,onSqlChange:t=>z(e.id,t),onExecute:()=>X(e.id),onDelete:()=>G(e.id),canDelete:r.cells.length>1,isActive:e.id===a||b===e.id,onSelect:()=>i(e.id),onToggleCollapse:()=>_(e.id,"collapsed"),onToggleEditor:()=>_(e.id,"hideEditor"),onToggleResult:()=>_(e.id,"hideResult"),onToggleFullscreen:()=>m(t=>t===e.id?null:e.id),isFullscreen:b===e.id,onMoveUp:()=>W(e.id,"up"),onMoveDown:()=>W(e.id,"down"),dragState:{isDragging:x===e.id,isDragOver:p.id===e.id,dragOverPosition:p.id===e.id?p.placeAfter?"after":"before":void 0},onDragStart:()=>H(e.id),onDragEnd:Q,onDragOver:t=>U(e.id,t),onDrop:t=>Y(e.id,t),onRunFromHere:()=>{Z(t)},onRunToHere:()=>{$(t)}}),!b&&K(t===r.cells.length-1?"below":"between",t+1)]},e.id)),!b&&K("below",r.cells.length)]})]}):(0,l.jsx)("div",{className:"flex-1 flex items-center justify-center",children:(0,l.jsxs)("div",{className:"text-center max-w-xs",children:[(0,l.jsx)("p",{className:"text-lg font-semibold text-gray-800 mb-2",children:"No notebooks yet"}),(0,l.jsx)("p",{className:"text-sm text-gray-500 mb-4",children:"Create your first notebook to start experimenting with queries."}),(0,l.jsx)("button",{onClick:M,className:"rounded-xl bg-indigo-600 px-5 py-2 text-sm font-medium text-white hover:bg-indigo-500",children:"Create Notebook"})]})})})})]}),b&&(0,l.jsx)("div",{className:"absolute inset-x-0 top-[68px] z-10 flex justify-end px-6",children:(0,l.jsx)("button",{onClick:T,className:"rounded-full border border-gray-300 bg-white px-3 py-1 text-xs font-semibold text-gray-600 shadow-sm hover:border-gray-400",children:"Exit fullscreen โ"})})]})}},5122:function(e,t,r){r.d(t,{MH:function(){return i},tR:function(){return a}});var l=r(1861),o=r(3233),n=r(987);let s={background:"#fff",foreground:"#3D3D3D",selection:"#BBDFFF",selectionMatch:"#BBDFFF",gutterBackground:"#fff",gutterForeground:"#AFAFAF",lineHighlight:"#EDF4FF"},a=function(e){let{theme:t="light",settings:r={},styles:n=[]}={};return(0,o.j)({theme:t,settings:{...s,...r},styles:[{tag:[l.pJ.comment,l.pJ.quote],color:"#707F8D"},{tag:[l.pJ.typeName,l.pJ.typeOperator],color:"#aa0d91"},{tag:[l.pJ.keyword],color:"#aa0d91",fontWeight:"bold"},{tag:[l.pJ.string,l.pJ.meta],color:"#D23423"},{tag:[l.pJ.name],color:"#032f62"},{tag:[l.pJ.typeName],color:"#522BB2"},{tag:[l.pJ.variableName],color:"#23575C"},{tag:[l.pJ.definition(l.pJ.variableName)],color:"#327A9E"},{tag:[l.pJ.regexp,l.pJ.link],color:"#0e0eff"},...n]})}(),i=n.tk.theme({"&":{fontSize:"12pt",border:"1px solid #556cd6","border-radius":"3px",padding:"3px"},"&.cm-editor.cm-focused":{outline:"none","border-width":"2px","border-color":"#fcd004"},".cm-tooltip-autocomplete":{border:"1px solid #556cd6","border-radius":"3px",margin:"3px",padding:"3px",background:"white",color:"black"},".cm-completionMatchedText":{"text-decoration":"none"},".cm-tooltip-autocomplete ul li[aria-selected]":{background:"white",color:"black","font-weight":"bold"}})}}]);
\ No newline at end of file
diff --git a/cli/frontend/build/index.html b/cli/frontend/build/index.html
index 995a2a1da..3523c4e20 100644
--- a/cli/frontend/build/index.html
+++ b/cli/frontend/build/index.html
@@ -1 +1 @@
-Databend โถ Run queryPress โโ to run
Execute a query to see results
\ No newline at end of file
+Databend โถ Run queryPress โโ to run
Execute a query to see results
\ No newline at end of file
diff --git a/cli/frontend/build/notebooks.html b/cli/frontend/build/notebooks.html
index ef466aa73..0d5f82ea0 100644
--- a/cli/frontend/build/notebooks.html
+++ b/cli/frontend/build/notebooks.html
@@ -1 +1 @@
-Databend - Notebooks
\ No newline at end of file
+Databend - Notebooks
\ No newline at end of file
diff --git a/cli/frontend/build/perf/[...slug].html b/cli/frontend/build/perf/[...slug].html
index 6114420ef..97237f3d6 100644
--- a/cli/frontend/build/perf/[...slug].html
+++ b/cli/frontend/build/perf/[...slug].html
@@ -1 +1 @@
-Databend - Performance Analysis
\ No newline at end of file
+Databend - Performance Analysis
\ No newline at end of file
diff --git a/frontend/src/Notebooks.tsx b/frontend/src/Notebooks.tsx
index b75f40e1a..c85371736 100644
--- a/frontend/src/Notebooks.tsx
+++ b/frontend/src/Notebooks.tsx
@@ -620,7 +620,7 @@ const Notebooks: React.FC = () => {
);
return (
-
+
{renderSidebar()}
diff --git a/frontend/src/components/NotebookCell.tsx b/frontend/src/components/NotebookCell.tsx
index 6aa26ae79..16a081432 100644
--- a/frontend/src/components/NotebookCell.tsx
+++ b/frontend/src/components/NotebookCell.tsx
@@ -161,17 +161,18 @@ const NotebookCellComponent: React.FC = ({
const baseCardClasses = [
'flex',
'gap-3',
- 'rounded-xl',
+ 'rounded-2xl',
'border',
- 'bg-white',
+ 'bg-white/95',
+ 'backdrop-blur-[2px]',
'transition-all',
- dragState.isDragOver ? 'ring-1 ring-indigo-300 border-indigo-300' : 'border-gray-200',
+ dragState.isDragOver ? 'ring-1 ring-indigo-300 border-indigo-300' : 'border-gray-100',
isFullscreen
? 'shadow-[0_0_0_2px_rgba(99,102,241,0.35)] border-indigo-300'
: isActive
- ? 'shadow-[0_0_0_1px_rgba(99,102,241,0.25)]'
- : 'shadow-sm hover:border-gray-300',
- cell.loading ? 'ring-1 ring-indigo-300 border-indigo-300 bg-blue-50/70' : '',
+ ? 'shadow-[0_15px_35px_-20px_rgba(79,70,229,0.45)]'
+ : 'shadow-sm hover:shadow-md hover:border-gray-200',
+ cell.loading ? 'ring-1 ring-blue-300 border-blue-200 bg-blue-50/80' : '',
].join(' ');
// ๆพ็ฝฎๆ็คบๅจๆ ทๅผ
@@ -412,7 +413,9 @@ const NotebookCellComponent: React.FC = ({
)}
- {statusLabel}
+
+ {statusLabel}
+
@@ -535,13 +538,13 @@ const NotebookCellComponent: React.FC
= ({
{!cell.error && showResult && cell.result && (
-
- {cell.result.rowCount} row{cell.result.rowCount === 1 ? '' : 's'} returned {cell.result.duration ? `in ${cell.result.duration}` : ''}
-
-
- {renderTable(cell.result)}
-
+
+ {cell.result.rowCount} row{cell.result.rowCount === 1 ? '' : 's'} returned {cell.result.duration ? `in ${cell.result.duration}` : ''}
+
+ {renderTable(cell.result)}
+
+
)}
{!cell.error && !showResult && !cell.collapsed}