registry:block
Context Cards
Retrieved knowledge chunks with source attribution chips.
Rendered example
All chunks32
Cold-chain certification must be verified before a new dairy can be added to the reorder workflow.
PDFDairy Onboarding SOP.pdf
Q4 velocity table: pistachio +18%, vanilla +6%, rocky road -11%; retire flavors below 40 scoops weekly.
CSVSales Velocity Export.csv
Install
orion-theme
Open registry JSON registry/ui/context-cards.tsx
"use client"
import * as React from "react"
/**
* CONTEXT CARDS
* Retrieved chunks enter once, then remain available.
*/
const CHUNKS = [
{
title: "Vendor onboarding rule",
chars: "290 characters",
body: "Cold-chain certification must be verified before a new dairy can be added to the reorder workflow.",
source: "Dairy Onboarding SOP.pdf",
badge: "PDF",
tone: "bg-red",
},
{
title: "Seasonal demand row",
chars: "1,250 characters",
body: "Q4 velocity table: pistachio +18%, vanilla +6%, rocky road -11%; retire flavors below 40 scoops weekly.",
source: "Sales Velocity Export.csv",
badge: "CSV",
tone: "bg-green",
},
]
export function ContextCards() {
const [chipsShown, setChipsShown] = React.useState(false)
React.useEffect(() => {
const chips = setTimeout(() => setChipsShown(true), 700)
return () => clearTimeout(chips)
}, [])
return (
<div className="flex w-full max-w-95 flex-col gap-2">
<div className="flex items-center gap-2 px-0.5" style={{ animation: "fade-in 400ms ease-out both" }}>
<span className="text-[13px] font-medium text-ink">All chunks</span>
<span className="inline-flex h-5 items-center rounded-md bg-inset px-1.5 text-[11.5px] font-medium text-ink-2 shadow-hairline tabular-nums">
32
</span>
</div>
{CHUNKS.map((chunk, i) => (
<div
key={chunk.title}
className="overflow-hidden rounded-card bg-surface shadow-card"
style={{ animation: `fade-up 400ms cubic-bezier(0.23,1,0.32,1) ${i * 100}ms both` }}
>
<div className="primitive-card-bar flex items-center gap-2.5 border-b border-line">
<span className="flex min-w-0 items-center gap-1.5 text-[13px] font-medium text-ink">
<svg
width="11"
height="11"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2.5"
strokeLinecap="round"
>
<path d="M4 6h16M4 12h16M4 18h10" />
</svg>
<span className="truncate">{chunk.title}</span>
</span>
<span className="ml-auto shrink-0 text-[12px] text-ink-3 tabular-nums">{chunk.chars}</span>
</div>
<p className="px-3 pt-2 pb-1 text-[12.5px] leading-relaxed text-ink-2">{chunk.body}</p>
<div className="px-3 pb-3">
<span
className="inline-flex h-6 items-center gap-1.5 rounded-full bg-inset px-2 text-[12px] font-medium text-ink-2 shadow-btn transition-[opacity,transform,background-color] duration-300 hover:bg-hover"
style={{
opacity: chipsShown ? 1 : 0,
transform: chipsShown ? "scale(1)" : "scale(0.95)",
transitionTimingFunction: "cubic-bezier(0.23, 1, 0.32, 1)",
transitionDelay: `${i * 80}ms`,
}}
>
<span
className={`flex size-3.5 items-center justify-center rounded-[4px] ${chunk.tone} text-[7px] font-bold text-white`}
>
{chunk.badge}
</span>
{chunk.source}
<svg
width="9"
height="9"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2.5"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M7 17L17 7M7 7h10v10" />
</svg>
</span>
</div>
</div>
))}
</div>
)
}