React components for QueryPanel - AI-powered data visualization.
npm install @querypanel/react-sdk
# or
yarn add @querypanel/react-sdk
# or
pnpm add @querypanel/react-sdkimport {
QueryPanelProvider,
QueryInput,
QueryResult,
LoadingState,
EmptyState,
ErrorState,
useQueryPanel,
} from "@querypanel/react-sdk";
function App() {
return (
<QueryPanelProvider
config={{
askEndpoint: "/api/demo/ask",
modifyEndpoint: "/api/demo/modify",
colorPreset: "default",
}}
>
<Dashboard />
</QueryPanelProvider>
);
}
function Dashboard() {
const { query, result, isLoading, error, ask, modify, colorPreset } = useQueryPanel();
return (
<div>
<QueryInput
value={query}
onSubmit={ask}
isLoading={isLoading}
chips={[
{ key: "sales", text: "Show sales by month", emoji: "π" },
{ key: "top", text: "Top 10 products", emoji: "π" },
]}
/>
{isLoading && !result && <LoadingState />}
{error && <ErrorState message={error} />}
{!isLoading && !error && !result && <EmptyState />}
{result && (
<QueryResult
result={result}
query={query}
isLoading={isLoading}
colorPreset={colorPreset}
onModify={modify}
/>
)}
</div>
);
}import { VegaChart, DataTable, ChartControls } from "@querypanel/react-sdk";
import { getColorsByPreset } from "@querypanel/react-sdk/themes";
function MyChart({ spec, data, fields }) {
const colors = getColorsByPreset("ocean");
return (
<div>
<ChartControls
fields={fields}
onApply={(options) => console.log(options)}
/>
<VegaChart spec={spec} colors={colors} />
<DataTable rows={data} fields={fields} />
</div>
);
}Search input with prompt chips for quick queries.
Renders Vega-Lite specifications with automatic theming.
Displays query results in a styled table.
Controls for modifying chart type, axes, time granularity, and colors.
Combined display of chart, SQL, and data table.
UI states for loading, errors, and empty results.
Built-in presets: default, sunset, emerald, ocean
import { getColorsByPreset } from "@querypanel/react-sdk/themes";
const colors = getColorsByPreset("sunset");import { createTheme } from "@querypanel/react-sdk/themes";
const customTheme = createTheme({
colors: {
primary: "#FF6B6B",
secondary: "#4ECDC4",
// ... other colors
},
borderRadius: "1rem",
fontFamily: "Inter, sans-serif",
});All components accept a colors prop for custom styling:
<VegaChart
spec={spec}
colors={{
primary: "#YOUR_BRAND_COLOR",
range: ["#color1", "#color2", "#color3"],
text: "#ffffff",
muted: "#888888",
// ...
}}
/>interface ThemeColors {
primary: string;
secondary: string;
tertiary: string;
accent: string;
range: string[];
text: string;
muted: string;
grid: string;
background: string;
surface: string;
border: string;
error: string;
}
interface QueryResult {
success: boolean;
sql?: string;
rows?: Array<Record<string, unknown>>;
fields?: string[];
chart?: {
vegaLiteSpec?: Record<string, unknown>;
specType: "vega-lite" | "vizspec";
};
}MIT