Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
b8944d0
chore(apollo-vertex): Add Layout menu item
petervachon Mar 20, 2026
c57705c
chore(apollo-vertex): General layout
petervachon Mar 20, 2026
0aa56c1
chore(apollo-vertex): Base setup for glow
petervachon Mar 21, 2026
5f84fda
chore(apollo-vertex): Devtool setup for canvas
petervachon Mar 22, 2026
30b0803
chore(apollo-vertex): Insight card config
petervachon Mar 22, 2026
e89878d
chore(apollo-vertex): Prompt card
petervachon Mar 22, 2026
c9dfee6
chore(apollo-vertex): OverviewCard
petervachon Mar 23, 2026
b57ab9c
chore(apollo-vertex): branchupdate
petervachon Mar 23, 2026
56c4be3
chore(apollo-vertex): Overview card updates
petervachon Mar 23, 2026
ed47e25
chore(apollo-vertex): Initial interaction insights
petervachon Mar 23, 2026
6c88e81
chore(apollo-vertex): Card interaction
petervachon Mar 23, 2026
e3a5444
chore(apollo-vertex): Experiment badge
petervachon Mar 23, 2026
fd91ddb
chore(apollo-vertex): update interaction
petervachon Mar 23, 2026
a186352
chore(apollo-vertex): Small adjustments
petervachon Mar 23, 2026
6f26b65
chore(apollo-vertex): Card cleanup
petervachon Mar 23, 2026
6c4cc11
chore(apollo-vertex): Flex adjustment
petervachon Mar 23, 2026
204ba52
chore(apollo-vertex): name change
petervachon Mar 23, 2026
80a7ba2
chore(apollo-vertex): chart glow
petervachon Mar 23, 2026
f1ded6f
chore(apollo-vertex): Responsive container
petervachon Apr 1, 2026
ab4eb07
chore(apollo-vertex): Compact view adjustments
petervachon Apr 1, 2026
fa41e28
chore(apollo-vertex): Compact mode updates
petervachon Apr 1, 2026
32370ba
chore(apollo-vertex): Componentize card content
petervachon Apr 1, 2026
5531d96
chore(apollo-vertex): Compact view
petervachon Apr 1, 2026
645eb62
chore(apollo-vertex): scroll behavior
petervachon Apr 1, 2026
d98860d
chore(apollo-vertex): Autopilot surface initial
petervachon Apr 1, 2026
e15556b
chore(apollo-vertex): Utility
petervachon Apr 1, 2026
22e83c6
chore(apollo-vertex): Dev tool for data
petervachon Apr 2, 2026
8a6086b
chore(apollo-vertex): Expanded card content
petervachon Apr 2, 2026
6cb26cd
chore(apollo-vertex): Expanded content
petervachon Apr 2, 2026
95d5541
chore(apollo-vertex): Small styles adjustments
petervachon Apr 2, 2026
038c114
chore(apollo-vertex): Expand cleanup
petervachon Apr 2, 2026
79e3999
chore(apollo-vertex): Color updates
petervachon Apr 2, 2026
a8e2f0a
chore(apollo-vertex): Clean up
petervachon Apr 2, 2026
d0f28b8
chore(apollo-vertex): Default dataset
petervachon Apr 2, 2026
185e5dc
chore(apollo-vertex): comment
petervachon Apr 2, 2026
dd22aa7
chore(apollo-vertex): clean up
petervachon Apr 2, 2026
3c71efe
chore(apollo-vertex): quick fix
petervachon Apr 2, 2026
8391de5
chore(apollo-vertex): cleanup
petervachon Apr 3, 2026
95b563f
chore(apollo-vertex): Rebase and linting
petervachon Apr 3, 2026
5e77663
chore(apollo-vertex): KPI card styles
petervachon Apr 3, 2026
ae9991e
chore(apollo-vertex): Expand load
petervachon Apr 3, 2026
fd95649
chore(apollo-vertex): Initial autopilot promptbar
petervachon Apr 3, 2026
d8a7700
chore(apollo-vertex): Prompt bar expand
petervachon Apr 3, 2026
0c6b972
chore(apollo-vertex): Documentation initial
petervachon Apr 3, 2026
ce0660a
chore(apollo-vertex): AI Chat isolated
petervachon Apr 8, 2026
45c9b74
chore(apollo-vertex): Initial styling
petervachon Apr 8, 2026
f2d27e9
chore(apollo-vertex): Error message cleanup
petervachon Apr 8, 2026
c74f6ff
chore(apollo-vertex): suggestion chips
petervachon Apr 8, 2026
cf9e306
chore(apollo-vertex): Codeblocks and type
petervachon Apr 9, 2026
8561b06
chore(apollo-vertex): spacing cleanup
petervachon Apr 9, 2026
1e26836
chore(apollo-vertex): Typography
petervachon Apr 10, 2026
58349c0
chore(apollo-vertex): image handling
petervachon Apr 10, 2026
10a2013
chore(apollo-vertex): Typography updates
petervachon Apr 13, 2026
8880823
chore(apollo-vertex): name change and fade
petervachon Apr 13, 2026
1de8d8f
chore(apollo-vertex): Style updates
petervachon Apr 13, 2026
9437973
chore(apollo-vertex): Style changes
petervachon Apr 13, 2026
2c5e41e
chore(apollo-vertex): Minor alignment
petervachon Apr 13, 2026
f5d241d
chore(apollo-vertex): Rebase
petervachon Apr 13, 2026
a5526db
chore(apollo-vertex): Transitions and copy
petervachon Apr 13, 2026
4effbca
chore(apollo-vertex): Interaction nuances
petervachon Apr 13, 2026
4af8c2f
chore(apollo-vertex): menu setup
petervachon Apr 13, 2026
fd79c49
chore(apollo-vertex): Demo setup
petervachon Apr 14, 2026
1352d7b
chore(apollo-vertex): Line-height thinking state
petervachon Apr 14, 2026
7ca102d
chore(apollo-vertex): label change
petervachon Apr 14, 2026
143379f
chore(apollo-vertex): AI Chat UX polish and preview cleanup
petervachon Apr 14, 2026
7ea440b
chore(apollo-vertex): cleanup
petervachon Apr 14, 2026
80beffc
chore(apollo-vertex): spacing cleanup
petervachon Apr 14, 2026
62d4d16
chore(apollo-vertex): Small update
petervachon Apr 14, 2026
785be51
chore(apollo-vertex): recommended button styling
petervachon Apr 15, 2026
44abb38
chore(apollo-vertex): Paste image into input
petervachon Apr 15, 2026
b0481fb
chore(apollo-vertex): Context menu
petervachon Apr 15, 2026
f680522
chore(apollo-vertex): Initial wiring of multi-step
petervachon Apr 15, 2026
20338d2
chore(apollo-vertex): Multistep tuning
petervachon Apr 15, 2026
4aaedee
chore(apollo-vertex): Multi-step interaction
petervachon Apr 16, 2026
6cdb474
chore(apollo-vertex): Intentional inputs
petervachon Apr 16, 2026
698eb93
chore(apollo-vertex): Code clean up
petervachon Apr 16, 2026
3bcddf6
chore(apollo-vertex): contextual menu fix
petervachon Apr 16, 2026
6f00375
chore(apollo-vertex): image thumbnail and lightbox UX
petervachon Apr 16, 2026
f9f9965
fix(apollo-vertex): resolve all CI lint, type, and build errors
petervachon Apr 17, 2026
2084a43
chore(apollo-vertex): merge dashboardTemplates_032026 into productDem…
petervachon Apr 17, 2026
0c2bcb0
chore(apollo-vertex): merge chatUX_040826 into productDemo_v1
petervachon Apr 17, 2026
02e9ae9
chore(apollo-vertex): Initial merge
petervachon Apr 17, 2026
e26077e
chore(apollo-vertex): chat updates
petervachon Apr 20, 2026
40f4294
chore(apollo-vertex): new views
petervachon Apr 22, 2026
212e955
chore(apollo-vertex): Sample prompts
petervachon Apr 23, 2026
181acd5
chore(apollo-vertex): update name
petervachon Apr 23, 2026
17f71d6
chore(apollo-vertex): demo stuff
petervachon Apr 24, 2026
85a0394
chore(apollo-vertex): Prompt bar collide
petervachon Apr 24, 2026
ea2da5c
chore(apollo-vertex): fix double chat
petervachon Apr 24, 2026
722a83f
chore(apollo-vertex): Resolving issues
petervachon Apr 24, 2026
4e295ea
chore(apollo-vertex): Fixes
petervachon Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apps/apollo-vertex/app/experiment/_meta.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export default {
dashboard: "Dashboard",
"product-demo": "Product Demo",
};
149 changes: 149 additions & 0 deletions apps/apollo-vertex/app/experiment/dashboard/page.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
import { DashboardTemplate } from '@/templates/dashboard/DashboardTemplateDynamic';
import { PreviewFullScreen } from '@/app/_components/preview-full-screen';

# Dashboard

A configurable dashboard template for building AI-assisted operational views. The dashboard is composed of named card regions with defined interaction patterns, designed to be data-driven and adaptable across verticals.

## Previews

### Sidebar Shell

<PreviewFullScreen title="Dashboard layout - sidebar shell">
<DashboardTemplate />
</PreviewFullScreen>

<a href="/preview/dashboard" target="_blank" className="text-sm text-primary hover:underline">Open standalone preview →</a>

### Minimal Header Shell

<PreviewFullScreen title="Dashboard layout - minimal shell">
<DashboardTemplate shellVariant="minimal" />
</PreviewFullScreen>

<a href="/preview/dashboard-minimal" target="_blank" className="text-sm text-primary hover:underline">Open standalone preview →</a>

---

## Anatomy

The dashboard is built from four semantic regions, each with a distinct role:

| Region | Description |
|---|---|
| **Overview Card** | The primary narrative area. Displays a greeting, headline, and subhead that summarize the current state. Occupies the top-left of the layout. |
| **Prompt Bar** | The AI input surface. Supports text entry, recommendation chips, and an expand interaction that opens an inline chat view. Anchored below the overview card. |
| **Insight Cards** | A grid of data cards on the right side. Each card has a type, a chart visualization, and an interaction pattern. Cards are arranged in rows of two. |
| **Autopilot Panel** | A slide-in panel that provides AI-generated analysis for a specific insight card. Triggered from the card's autopilot icon. |

## Card Types

Every insight card has a `type` that determines what it displays:

| Type | Renders | Example |
|---|---|---|
| `kpi` | A large number, badge, and description | "97.1%" with "+2.4%" badge |
| `chart` | A data visualization determined by `chartType` | Horizontal bars, stacked bars |

## Chart Types

Cards with `type: "chart"` use a `chartType` to select the visualization:

| Chart Type | Description |
|---|---|
| `horizontal-bars` | Ranked list of items with proportional bars and percentages |
| `stacked-bar` | Grouped bars with color-coded segments and a legend |
| `donut` | Circular progress indicator with a center label |
| `sparkline` | Compact line chart for trend indication |
| `area` | Filled area chart for volume over time |

## Card Sizes

Each card has a `size` that controls its column weight in the grid:

| Size | Grid Weight | Use Case |
|---|---|---|
| `sm` | `1fr` | KPI cards, compact metrics |
| `md` | `2fr` | Chart cards, detailed visualizations |
| `lg` | `1fr` | Full-width cards |

## Interaction Patterns

Cards support three interaction modes:

### Static

No interactive behavior. The card displays its content without any hover or click affordance. Used for simple KPIs that don't need drill-down.

### Navigate

On hover, an **arrow-up-right** icon appears in the card header. Clicking the card navigates to a detail page. Used for KPIs or summaries that link to a deeper view.

### Expand

On hover, a **maximize** icon appears in the card header. Clicking expands the card to fill the grid with a multi-phase animation:

1. **Width phase** — Card expands horizontally, sibling card collapses
2. **Height phase** — Card expands vertically, other rows collapse
3. **Full phase** — Expanded content fades in (drilldown tabs, autopilot prompts)

Clicking the **minimize** icon or another card collapses back to the grid.

For `horizontal-bars` cards, the expanded state includes **drilldown tabs** below the title for switching between data views.

## Prompt Bar

The prompt bar supports three ways to expand into the inline chat view:

| Trigger | Behavior |
|---|---|
| **Type + Enter / Submit** | Expands and passes the user's typed query |
| **Click a recommendation chip** | Expands and passes the chip text as the query |
| **Click the chat icon** | Expands and shows the current session conversation |

When expanded, the overview card collapses and the prompt bar grows to fill the left column. A **minimize** icon in the header collapses back to the default layout.

## Autopilot Panel

Each expandable card includes an **autopilot** icon alongside the expand icon. Clicking it slides in a panel from the right that provides AI-generated context for that card. The dashboard content shifts left to make room. Clicking the autopilot icon again or the close button dismisses the panel.

## Data Configuration

The dashboard is driven by a `DashboardDataset` object that defines all text and card content:

```ts
interface DashboardDataset {
name: string; // Dataset identifier
brandName: string; // Company name in header
brandLine: string; // Tagline in header
dashboardTitle: string; // Page title
badgeText: string; // Badge next to title
greeting: string; // Overview card greeting
headline: string; // Overview card headline
subhead: string; // Overview card description
promptPlaceholder: string; // Prompt bar placeholder text
promptSuggestions: string[]; // Recommendation chips
insightCards: [ // Exactly 4 insight cards
InsightCardData,
InsightCardData,
InsightCardData,
InsightCardData,
];
}
```

Each `InsightCardData` specifies its title, type, chart type, size, interaction, and the data for its visualization (KPI values, bar data, stacked segments, etc.).

## Layout Modes

The dashboard responds to container width:

| Mode | Breakpoint | Behavior |
|---|---|---|
| **Desktop** | ≥ 1100px | Two-column layout, full card grid |
| **Compact** | 800–1099px | Two-column layout, condensed card content |
| **Stacked** | < 800px | Single-column, vertically stacked |

## Theming

Card backgrounds, glow effects, and gradients are configurable through `CardConfig` and `GlowConfig` objects. The dashboard supports light and dark modes with independent styling for each. Color tokens and theme values should be updated in `registry.json`, not directly in CSS files.
12 changes: 12 additions & 0 deletions apps/apollo-vertex/app/experiment/product-demo/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"use client";

import { DashboardTemplate } from "@/templates/dashboard/DashboardTemplateDynamic";
import { invoiceProcessingDataset } from "@/templates/dashboard/dashboard-data";

export default function ProductDemoPage() {
return (
<div className="fixed inset-0 z-50 bg-background not-prose">
<DashboardTemplate dataset={invoiceProcessingDataset} demoMode />
</div>
);
}
2 changes: 2 additions & 0 deletions apps/apollo-vertex/app/globals.css
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
@import 'tailwindcss';
@source "../registry";
@source "../templates";

/* Optional: import Nextra theme styles */
@import 'nextra-theme-docs/style.css';
Expand Down
9 changes: 6 additions & 3 deletions apps/apollo-vertex/app/patterns/ai-chat/page.mdx
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { AiChatTemplate } from '@/templates/AiChatTemplate';
import { PreviewFullScreen } from '@/app/_components/preview-full-screen';

# AI Chat

A composable AI chat UI component for Apollo Vertex. Built with React, TypeScript, and Tailwind CSS. Designed to work with [TanStack AI](https://tanstack.com/ai) — you bring `useChat` and a connection adapter, the component handles the chrome (scroll, input, loading, suggestions, errors) while you control how messages and tool calls render.

<div className="not-prose my-8">
<AiChatTemplate />
</div>
<PreviewFullScreen height={600} title="AI Chat">
<AiChatTemplate className="h-full flex w-full flex-col" />
</PreviewFullScreen>

> **All visual states and sub-components →** [Component Preview](/vertex-components/ai-chat/preview)

## Features

Expand Down
3 changes: 3 additions & 0 deletions apps/apollo-vertex/app/preview/_meta.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default {
"*": { display: "hidden" },
};
19 changes: 19 additions & 0 deletions apps/apollo-vertex/app/preview/dashboard-minimal/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"use client";

import dynamic from "next/dynamic";

const DashboardTemplate = dynamic(
() =>
import("@/templates/dashboard/DashboardTemplate").then(
(mod) => mod.DashboardTemplate,
),
{ ssr: false },
);

export default function DashboardMinimalPreviewPage() {
return (
<div className="fixed inset-0 z-50 bg-background not-prose">
<DashboardTemplate shellVariant="minimal" />
</div>
);
}
20 changes: 20 additions & 0 deletions apps/apollo-vertex/app/preview/dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use client";

import dynamic from "next/dynamic";
import { invoiceProcessingDataset } from "@/templates/dashboard/dashboard-data";

const DashboardTemplate = dynamic(
() =>
import("@/templates/dashboard/DashboardTemplate").then(
(mod) => mod.DashboardTemplate,
),
{ ssr: false },
);

export default function DashboardPreviewPage() {
return (
<div className="fixed inset-0 z-50 bg-background not-prose">
<DashboardTemplate dataset={invoiceProcessingDataset} demoMode />
</div>
);
}
Loading
Loading