Component Library
Design system components, MDX content blocks, and UI primitives. Each entry includes props, variants, and live usage examples.
Layout
>TerminalCard— Core wrapper component
The foundational building block. A glassmorphic card with macOS-style traffic light dots, mouse-following spotlight effect, header shine, and glow borders. Every section wraps in this.
| Name | Type | Default | Description |
|---|---|---|---|
| children | ReactNode | — | Card content |
| title | string | — | Header label text |
| icon | string | — | Material Symbol icon name |
| variant | 'primary' | 'secondary' | primary | Purple glow (primary) or gold glow (secondary) |
| className | string | — | Additional Tailwind classes |
<TerminalCard title="Section.sh" icon="terminal" variant="primary">
<div className="p-4 font-mono text-[12px]">
Content here
</div>
</TerminalCard>>BackgroundCanvas— Interactive dot grid background
Fixed canvas with mouse-parallax dot grid. Renders behind all content at z-index -1. Self-contained, no props.
<BackgroundCanvas />
>PageTransition— Fade-in page wrapper
Wraps page content with a fade-in animation on mount. Single prop: children.
<PageTransition> <YourPageContent /> </PageTransition>
Data Display
>ProfileCard
Identity card with avatar (click for jump animation), name, title, status dot, metadata grid, and resume download button. Self-contained.
<ProfileCard />
>IntroSection
Hero section with animated SVG architecture diagram, headline, and subtitle.
<IntroSection />
>SkillsSection
Categorized progress bars with terminal prompts. Categories: frontend (amber), backend (cyan), devops (purple), security (rose), ai (emerald).
<SkillsSection />
>ExperienceSection
Accordion-style work history with hash IDs, ACTIVE badge, chevron rotation, and expandable detail rows including tech stack.
<ExperienceSection />
>ProjectsSection
Open-source projects (primary variant) + Education cards (secondary variant). Expandable details with tech stack, repo links.
<ProjectsSection />
Feedback
>CodeCopyBtn
Wraps code blocks and adds a copy-to-clipboard button via event delegation. Used in blog posts to enable copying code snippets.
<CodeCopyHandler>
<MDXRemote source={rawMDX} components={...} />
</CodeCopyHandler>>CollapsibleSummary
<details> / <summary> styled collapsible for blog post summaries. Accepts title and children.
<CollapsibleSummary title="cat summary.txt"> <p>Content here</p> </CollapsibleSummary>
MDX Content
These components are registered in lib/mdx-components.tsx and usable directly in blog MDX posts via the next-mdx-remote runtime.
>Callout— Note / Info / Warn / Error
| Name | Type | Default | Description |
|---|---|---|---|
| type | 'note' | 'info' | 'warn' | 'error' | note | Callout variant |
| title | string | — | Optional title override |
| list | 'ol' | 'ul' | — | Renders children as ordered/unordered list |
| children | ReactNode | — | Callout body content |
- 1.Lists render as proper numbered items. 2. No need to write HTML tags. 3. Strips numbering automatically.
<Callout type="info" title="Key Insight"> Important conceptual information. </Callout> <Callout type="info" title="Takeaways" list="ol"> 1. First item 2. Second item </Callout>
>Banner— Full-width highlight
| Name | Type | Default | Description |
|---|---|---|---|
| type | 'info' | 'success' | 'warning' | 'danger' | info | Banner variant |
| title | string | — | Banner header |
| children | ReactNode | — | Banner body |
| action | { label: string; href: string } | — | Optional action link |
<Banner type="info" title="Release" action={{ label: "Changelog", href: "#" }}>
Version 2.0 is now available.
</Banner>>IconButton
| Name | Type | Default | Description |
|---|---|---|---|
| icon | string | — | Material Symbol icon name |
| variant | 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link' | default | Button visual style |
| size | 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm' | 'icon-lg' | default | Button size |
| children | ReactNode | — | Optional label text |
| href | string | — | Makes it an anchor link |
<IconButton icon="play_arrow" variant="default">Run</IconButton> <IconButton icon="delete" variant="destructive">Delete</IconButton> <IconButton icon="settings" variant="outline" size="icon" />
>Grid / GridItem— Multi-column layout
| Name | Type | Default | Description |
|---|---|---|---|
| cols | 2 | 3 | — | Number of grid columns |
| children | ReactNode | — | GridItem children |
<Grid cols={2}>
<GridItem title="Left" icon="terminal">
Left column content
</GridItem>
<GridItem title="Right" icon="code">
Right column content
</GridItem>
</Grid>>Columns— Minimal two-column layout
| Name | Type | Default | Description |
|---|---|---|---|
| children | ReactNode | — | Column content (each direct child is a column) |
| first | 'left' | 'center' | 'right' | left | Text alignment in first column |
| second | 'left' | 'center' | 'right' | left | Text alignment in second column |
| className | string | — | Additional Tailwind classes |
A bare two-column grid with no background, border, or decoration. Each direct child becomes a column. Stacks to single column on mobile.
Plain text with no wrapper decorations. Works with any content — paragraphs, lists, code, components.
Responsive — collapses to single column on mobile screens. Use gap-6 by default.
<Columns first="center" second="right">
<div>
First column content (centered)
</div>
<div>
Second column content (right-aligned)
</div>
</Columns>>HoverCard
| Name | Type | Default | Description |
|---|---|---|---|
| trigger | ReactNode | — | Hover target element |
| children | ReactNode | — | Card content on hover |
| side | 'top' | 'right' | 'bottom' | 'left' | top | Popover side |
Hover over this text to see the hover card.
<HoverCard trigger={<span>Hover me</span>}>
<div className="text-emerald-400">> Rich content</div>
<div className="text-zinc-400">Any React children work here.</div>
</HoverCard>>Quote— Blockquote with attribution
| Name | Type | Default | Description |
|---|---|---|---|
| from | string | — | Attribution (required) |
| link | string | — | Optional source URL |
| children | ReactNode | — | Quote text |
This is a blockquote component with attribution and an optional source link.
<Quote from="John Doe" link="https://example.com"> This is a blockquote component with attribution. </Quote>
>Tip— Inline tooltip
| Name | Type | Default | Description |
|---|---|---|---|
| tip | string | — | Description text (required) |
| head | string | — | Green header; defaults to children if absent |
| link | string | — | Optional documentation URL shown at bottom |
| children | ReactNode | — | Inline trigger text |
Hover over this text to see the tip.
{/* Minimal: head defaults to children */}
<Tip tip="This is an inline tooltip">this text</Tip>
{/* Full: custom head, description, and docs link */}
<Tip head="Sharding" tip="Splits tenants into isolated instances" link="https://example.com">Sharding</Tip>>Popup— Dialog or Popover
| Name | Type | Default | Description |
|---|---|---|---|
| trigger | ReactNode | — | Click target |
| variant | 'dialog' | 'popover' | popover | Display type |
| title | string | — | Popup header |
| children | ReactNode | — | Popup content |
<Popup trigger={<span>Open</span>} variant="popover" title="Quick Info">
Lightweight popover content
</Popup>
<Popup trigger={<span>Open</span>} variant="dialog" title="Details">
Full dialog modal content
</Popup>>Tooltip
| Name | Type | Default | Description |
|---|---|---|---|
| label | ReactNode | — | Tooltip text |
| children | ReactNode | — | Element with tooltip |
| side | 'top' | 'right' | 'bottom' | 'left' | top | Tooltip side |
Hover over this word to see the tooltip.
<Tooltip label="Explanation text"> <span>Hover target</span> </Tooltip>
>ColorPalette
| Name | Type | Default | Description |
|---|---|---|---|
| colors | { name: string; hex: string }[] | — | Array of color swatches |
<ColorPalette colors={[
{ name: 'Primary', hex: '#d0bcff' },
{ name: 'Emerald', hex: '#34d399' },
]} />>Table— Terminal-styled data table
| Name | Type | Default | Description |
|---|---|---|---|
| columns | { key: string; header: string }[] | — | Column definitions |
| rows | Record<string, ReactNode>[] | — | Row data keyed by column key |
| striped | boolean | false | Alternate row background |
| compact | boolean | false | Reduced padding |
| # Service | # Status | # Uptime | # Latency |
|---|---|---|---|
| api-gateway | ● Healthy | 99.99% | 12ms |
| auth-service | ● Healthy | 99.97% | 8ms |
| db-primary | ● Degraded | 98.50% | 45ms |
| cache-cluster | ● Healthy | 99.99% | 1ms |
const columns = [
{ key: 'service', header: 'Service' },
{ key: 'status', header: 'Status' },
];
const rows = [
{ service: 'api-gateway', status: 'Healthy' },
];
<Table columns={columns} rows={rows} striped />>TreeTable— Hierarchical tree view
| Name | Type | Default | Description |
|---|---|---|---|
| nodes | TreeNode[] | — | Tree data with optional children |
| columns | { key: string; header: string }[] | — | Additional columns |
| showConnectors | boolean | true | Show ├─ └─ connectors |
>src/ |
│ ├─>components/ |
│ │ ├─>button.tsx |
└─>card.tsx |
└─>lib/ |
│ │ ├─>utils.ts |
└─>hooks.ts |
>public/ |
└─>favicon.ico |
const nodes = [
{
id: 'src',
label: 'src/',
children: [
{ id: 'components', label: 'components/', children: [...] },
{ id: 'lib', label: 'lib/', children: [...] },
],
},
];
<TreeTable nodes={nodes} showConnectors />>StatusPill— Inline status badges
| Name | Type | Default | Description |
|---|---|---|---|
| status | 'todo' | 'progress' | 'done' | 'cancelled' | 'review' | 'hold' | — | Status variant |
Inline status pills that can be used inside paragraphs. Task TODO is not started,IN PROGRESS means actively working, and DONE means complete. Other variants include CANCELLED, IN REVIEW, and ON HOLD.
Task <StatusPill status="done" /> means complete.</Code>
>Highlight— Inline colored span
| Name | Type | Default | Description |
|---|---|---|---|
| type | 'success' | 'info' | 'warn' | 'error' | success | Highlight colour; defaults to terminal green |
| children | ReactNode | — | Inline content to highlight |
An inline <span> component for colour-highlighting text within paragraphs. Defaults to terminal green. Use info,warn, or error for other states.
Default: <Highlight>green text</Highlight> Info: <Highlight type="info">info text</Highlight> Warning: <Highlight type="warn">warning text</Highlight> Error: <Highlight type="error">error text</Highlight>
>TableCSV— String-prop table with icon mapping
| Name | Type | Default | Description |
|---|---|---|---|
| children | string | — | Pipe-delimited table data (first line = headers, rest = rows) |
| source | string | — | Alternative to children — multiline prop (MDX-safe) |
| iconMap | string | — | Sem;colon,separated: TOKEN,icon_name,color_class |
| columnColors | string | — | Comma-separated text color classes per column |
| highlightCol | string | — | Header name to highlight |
| striped | boolean | false | Alternate row backgrounds |
| compact | boolean | false | Reduced cell padding |
Data is passed as children (TSX) or source prop (MDX). Tokens in cells are mapped to Material Symbol icons via iconMap.
| Service | Status | Uptime | Region |
|---|---|---|---|
| api-gateway | check_circle | 99.99 | us-east |
| auth-service | check_circle | 99.97 | eu-west |
| db-primary | warning | 98.50 | us-east |
| cache-cluster | check_circle | 99.99 | ap-southeast |
| analytics-worker | error | 95.20 | us-east |
// TSX — use children: <TableCSV iconMap="..." columnColors="..." highlightCol="Status" striped> Service | Status | Uptime api-gateway | UP | 99.99 </TableCSV> // MDX — use source prop: <TableCSV source="Service|Status|Uptime api-gateway|UP|99.99 auth-service|DEGRADED|98.50" />
Typography
>Font Family
>Terminal Patterns
>Type Scale
Charts
>Sparkline— SVG polyline chart
| Name | Type | Default | Description |
|---|---|---|---|
| data | number[] | — | Data points to plot |
| color | string | #34d399 | Line and dot color |
| height | number | 60 | SVG height in pixels |
| showDots | boolean | true | Show data point dots |
[ NETWORK_THROUGHPUT ]
[ RESPONSE_TIME_MS ]
<Sparkline
data={[12, 48, 35, 62, 58, 81, 74]}
color="#34d399"
height={60}
showDots
/>>AsciiBarChart— Block-character bars
| Name | Type | Default | Description |
|---|---|---|---|
| bars | { label: string; value: number }[] | — | Bar data (value 0–100) |
| maxLabel | string | — | Optional header label |
| barCount | number | 10 | Characters per bar |
<AsciiBarChart
bars={[
{ label: 'JAN', value: 65 },
{ label: 'FEB', value: 78 },
]}
maxLabel="REQUESTS_PER_MONTH"
/>>CircularGauge— SVG arc gauge
| Name | Type | Default | Description |
|---|---|---|---|
| value | number | — | Value 0–100 |
| label | string | — | Label below gauge |
| color | string | #34d399 | Arc color |
| size | number | 64 | SVG dimension |
<CircularGauge
value={87}
label="CPU"
color="#34d399"
size={64}
/>>FrequencyBars— Animated spectrum analyzer
| Name | Type | Default | Description |
|---|---|---|---|
| barCount | number | 20 | Number of bars |
| interval | number | 200 | Animation interval (ms) |
[ FREQUENCY_ANALYSIS ]
<FrequencyBars barCount={20} interval={200} />>NetworkActivity— Animated node pulses
| Name | Type | Default | Description |
|---|---|---|---|
| nodeCount | number | 7 | Number of nodes |
| interval | number | 400 | Animation speed (ms) |
[ ACTIVE_CONNECTIONS ]
<NetworkActivity nodeCount={7} interval={400} />Effects
>MatrixRain— Canvas katakana rain
| Name | Type | Default | Description |
|---|---|---|---|
| speed | number | 1 | Fall speed multiplier |
| fadeOpacity | number | 0.05 | Trail fade opacity |
<MatrixRain speed={1} fadeOpacity={0.05} />>TypewriterText— Character-by-character reveal
| Name | Type | Default | Description |
|---|---|---|---|
| phrases | string[] | — | Array of phrases to cycle |
| speed | number | 60 | Typing speed (ms per char) |
| pause | number | 1800 | Pause before delete (ms) |
| prompt | string | > | Prompt character |
| showCursor | boolean | true | Show blinking cursor |
<TypewriterText
phrases={['ACCESS_GRANTED', 'FIREWALL_BYPASSED']}
speed={60}
pause={1800}
/>>GlitchText— Random character glitch
| Name | Type | Default | Description |
|---|---|---|---|
| text | string | SYSTEM_ONLINE | Base text |
| interval | number | 2000 | Glitch interval (ms) |
| glitchProbability | number | 0.6 | Chance of glitch per interval |
| glitchDuration | number | 120 | Glitch display duration (ms) |
<GlitchText
text="SYSTEM_ONLINE"
interval={2000}
glitchProbability={0.6}
/>Interactive Demos
>TerminalChat— Simulated TTY chat
| Name | Type | Default | Description |
|---|---|---|---|
| messages | ChatMessage[] | — | Array of { user, text, delay } |
| hostName | string | host | Host user identifier |
const messages = [
{ user: 'guest', text: 'Hello!', delay: 500 },
{ user: 'host', text: 'Hi there!', delay: 2000 },
];
<TerminalChat messages={messages} hostName="host" />>TerminalTable— Process data table
| Name | Type | Default | Description |
|---|---|---|---|
| rows | ProcessRow[] | — | Array of { pid, user, cpu, mem, cmd } |
const rows = [
{ pid: 4217, user: 'root', cpu: '0.3', mem: '1.2', cmd: 'nginx' },
];
<TerminalTable rows={rows} />>ChangelogView— Unified / split git log
| Name | Type | Default | Description |
|---|---|---|---|
| commits | Commit[] | — | Array of commit objects with hash, author, date, message, stats |
const commits = [
{ hash: 'a3f2c9e', author: 'ounak', date: '2025-05-16', message: 'feat: add feature', files: 4, added: 87, deleted: 12 },
];
<ChangelogView commits={commits} />>CodeDiffView— Expandable file diff
| Name | Type | Default | Description |
|---|---|---|---|
| files | DiffFile[] | — | Array of diff files with hunks |
const files = [
{
name: 'file.tsx',
status: 'modified',
hunks: [
{ type: '+', content: 'new line' },
{ type: '-', content: 'old line' },
],
},
];
<CodeDiffView files={files} />