Display an interactive data explorer in the Lux window with filterable tables, search inputs, and detail panels. Use when the user asks to "explore data", "browse results", "filter a table", "search through records", "show me the data", or wants to interactively navigate tabular data. Also triggered by "data viewer", "record browser", "filterable table", or "drill into the data".
From lux-devnpx claudepluginhub punt-labs/claude-plugins --plugin luxThis skill is limited to using the following tools:
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Optimizes cloud costs on AWS, Azure, GCP via rightsizing, tagging strategies, reserved instances, spot usage, and spending analysis. Use for expense reduction and governance.
You are composing an interactive data explorer in the Lux display window. A data explorer lets the user filter, search, and drill into tabular data. The layout is: filter controls at the top, data table in the middle, detail panel at the bottom. Interaction is the core — the user changes filters, the table updates.
Determine what to explore. Look at $ARGUMENTS and conversation context:
You need:
Prefer built-in table filters (DES-018) — these run at 60fps in the display server with zero round trips. Use separate filter elements + recv()/update() only when you need custom logic that built-in filters can't handle (e.g., numeric ranges, cross-field filters, external lookups).
Add a filters array to the table element. Two types are available:
| Data pattern | Filter type | Config |
|---|---|---|
| Free-text search (name, title, description) | search | column: [0, 1] — which columns to search |
| Categorical field (status, type, category) | combo | column: 2, items: ["All", "open", "closed"] |
Rules:
Add a detail object to the table for drill-down. This renders a list/detail view with fields and body text, driven entirely by data — no round trips.
For filters that built-in types can't handle (numeric ranges, sliders, cross-field logic), use separate elements and the recv()/update() loop:
| Data pattern | Element kind |
|---|---|
| Boolean field (active, archived) | checkbox |
| Numeric range (score, price) | slider |
| Custom compound filter | input_text + custom logic |
Build the element tree following the data explorer pattern.
A single table element with filters and detail gives you a complete data explorer with zero round trips — search, filter, row selection, and detail panel all run at 60fps in the display server.
This is the canonical form — a searchable, filterable list of issues with drill-down detail. Adapt freely to any tabular data: search results, log entries, test cases, inventory, API responses.
{
"scene_id": "data-explorer",
"title": "Issue Explorer",
"elements": [
{
"kind": "table", "id": "data-table",
"columns": ["ID", "Title", "Status", "Priority", "Assignee"],
"rows": [
["ISS-001", "Fix login timeout", "Open", "P1", "alice"],
["ISS-002", "Add dark mode", "In Progress", "P2", "bob"],
["ISS-003", "Update API docs", "Open", "P3", "carol"],
["ISS-004", "Memory leak in worker", "Open", "P0", "alice"],
["ISS-005", "Refactor auth module", "Closed", "P2", "bob"]
],
"filters": [
{"type": "search", "column": [0, 1], "hint": "Filter by ID or title..."},
{"type": "combo", "column": 2, "items": ["All", "Open", "In Progress", "Closed"], "label": "Status"},
{"type": "combo", "column": 3, "items": ["All", "P0", "P1", "P2", "P3"], "label": "Priority"}
],
"detail": {
"fields": ["ID", "Status", "Priority", "Assignee", "Created"],
"rows": [
["ISS-001", "Open", "P1", "alice", "2026-03-01"],
["ISS-002", "In Progress", "P2", "bob", "2026-03-02"],
["ISS-003", "Open", "P3", "carol", "2026-03-03"],
["ISS-004", "Open", "P0", "alice", "2026-03-04"],
["ISS-005", "Closed", "P2", "bob", "2026-03-05"]
],
"body": [
"The login flow times out after 30s on slow connections...",
"Add system-wide dark mode toggle with persistent preference.",
"API docs are outdated after the v2 migration.",
"Worker process leaks ~10MB/hour under sustained load.",
"Auth module has accumulated tech debt — extract into clean service."
]
},
"flags": ["borders", "row_bg"]
}
]
}
tab_bar with one tab per major category instead of a combo filtertree elements instead of a flat tablegroup with layout: "columns" to place the table and detail panel next to each other instead of stackedCall set_theme("imgui_colors_light") before showing — light themes work best for data-dense views. Then call show() with the composed element tree.
With built-in filters and detail, the data explorer is fully interactive without any recv()/update() loop. Tell the user:
Use the recv()/update() loop only for operations that require LLM orchestration:
{
"scene_id": "data-explorer",
"patches": [
{"id": "data-table", "set": {"rows": [/* refreshed data */]}}
]
}
If the underlying data can change (live logs, query results), add a button with id: "refresh" in the filters row. When clicked, re-read the data source and recompute the filtered view.