Perspective Viewer provides the <perspective-viewer> Custom Element, a framework-agnostic user interface component for interactive analytics and data visualization. Built with WebAssembly (compiled from Rust) for high performance, it serves as the frontend for Perspective.js - a streaming query engine optimized for large and/or streaming datasets.
npm install @finos/perspective-viewerimport "@finos/perspective-viewer";For manual initialization:
import { init_client } from "@finos/perspective-viewer";For manual initialization (alternative syntax):
import perspectiveViewer from "@finos/perspective-viewer";
// Use: await perspectiveViewer.init_client(wasmBinary);For plugin development:
import {
IPerspectiveViewerPlugin,
HTMLPerspectiveViewerPluginElement,
HTMLPerspectiveViewerElement
} from "@finos/perspective-viewer";For advanced type usage:
import {
ViewerConfigUpdate,
PerspectiveClickEventDetail,
PerspectiveSelectEventDetail,
ColumnConfigValues,
Filter,
Sort
} from "@finos/perspective-viewer";import "@finos/perspective-viewer";
import perspective from "@finos/perspective";
// Create perspective viewer element
const viewer = document.createElement("perspective-viewer");
document.body.appendChild(viewer);
// Load data
const table = await perspective.table({
name: ["Alice", "Bob", "Charlie"],
age: [25, 30, 35],
city: ["NY", "LA", "Chicago"]
});
await viewer.load(table);
// Configure the view
await viewer.restore({
plugin: "d3_y_bar",
group_by: ["city"],
columns: ["age"]
});Perspective Viewer is built around several key components:
<perspective-viewer> Web Component with async API methodsMain <perspective-viewer> custom element providing all data visualization and interaction functionality.
interface HTMLPerspectiveViewerElement extends HTMLElement {
// Data Management
load(table: Promise<Table> | Table): Promise<void>;
getTable(wait_for_table?: boolean): Promise<Table>;
getView(): Promise<View>;
// Configuration & State
save(format?: "json" | "string" | "arraybuffer"): Promise<ViewerConfig>;
restore(config: ViewerConfig): Promise<void>;
reset(reset_all?: boolean): Promise<void>;
// Rendering & Display
flush(): Promise<void>;
resize(force?: boolean): Promise<void>;
// Lifecycle
delete(): Promise<void>;
eject(): Promise<void>;
}Interface and base class for creating custom visualization plugins.
interface IPerspectiveViewerPlugin {
readonly name: string;
readonly select_mode?: string;
readonly min_config_columns?: number;
readonly priority?: number;
draw(view: View): Promise<void>;
update(view: View): Promise<void>;
clear(): Promise<void>;
resize(): Promise<void>;
save(): Promise<any>;
restore(config: any): Promise<void>;
delete(): Promise<void>;
}
class HTMLPerspectiveViewerPluginElement extends HTMLElement
implements IPerspectiveViewerPlugin {
// Base implementation with default behaviors
}Complete configuration interface for viewer state management.
interface ViewerConfigUpdate {
version?: string | null;
plugin?: string | null;
title?: string | null;
theme?: string | null;
settings?: boolean | null;
plugin_config?: any | null;
columns_config?: Record<string, ColumnConfigValues> | null;
// View configuration
group_by?: Array<string> | null;
split_by?: Array<string> | null;
columns?: Array<string | null> | null;
filter?: Array<Filter> | null;
sort?: Array<Sort> | null;
expressions?: Record<string, string> | null;
aggregates?: Record<string, Aggregate> | null;
}Custom events for user interactions and configuration changes.
// Event listener registration
viewer.addEventListener("perspective-config-update", (e: CustomEvent) => {
const config: ViewerConfigUpdate = e.detail;
});
viewer.addEventListener("perspective-select", (e: CustomEvent) => {
const selection: { view_window: ViewWindow } = e.detail;
});Manual WebAssembly initialization for advanced use cases.
function init_client(
wasm_binary: Promise<Response | ArrayBuffer | Uint8Array>
| Response
| ArrayBuffer
| Uint8Array
): Promise<void>;type Filter = [string, string, FilterTerm];
type FilterTerm = Array<Scalar> | Scalar;
type FilterReducer = "and" | "or";
type Scalar = number | string | boolean | null;
interface ColumnConfigValues {
symbols?: Record<string, string>;
datagrid_number_style?: NumberColumnStyleConfig;
datagrid_string_style?: StringColumnStyleConfig;
datagrid_datetime_style?: DatetimeColumnStyleConfig;
number_format?: CustomNumberFormatConfig | null;
aggregate_depth?: number;
}
interface ViewWindow {
start_row: number;
end_row: number;
start_col: number;
end_col: number;
}
interface PerspectiveClickEventDetail {
config: ViewerConfigUpdate;
row: Record<string, any>;
column_names: Array<string | Array<string>>;
}
interface PerspectiveSelectEventDetail {
view_window: ViewWindow;
}