PXLKIT UI KIT FOR REACT

A React component kit built on three promises. Surface system — flip every component between an 8-bit pixel aesthetic and a flat linear one with a single prop, same API either way. Accessibility-first — WAI-ARIA roles, keyboard navigation, focus rings, and reduced-motion fallbacks ship on every interactive, not bolted on later. Batteries-included — DataTable, Stepper, Sidebar, Timeline, Calendar, Charts, OTPInput and 103+ more are already in the box. Use the sidebar to browse all 111 components and the PixelToast guide.

New in 2.2: the same 111 components for Vue 3 and Angular — same markup, theme and keyboard behaviour, checked against React by parity tests. See Vue and Angular below.

111 componentspixel ↔ linear surfacetypescript-firstWAI-ARIA baselineTailwind CSS v4

Components

111

Icon Packs

7

Design Tokens

7 tones

New in 2.2

Vue + Angular

GETTING STARTED

Three steps and you're rendering. Install the React kit, @pxlkit/ui-kit — or, new in 2.2, @pxlkit/ui-kit-vue or @pxlkit/ui-kit-angular — with your framework's icon components and the icon packs you use; import its stylesheet — a Tailwind CSS v4 entry point, so Tailwind's Vite or PostCSS plugin must run on it; and use the components. The three kits render the same markup and classes and behave the same way. Every primitive accepts the shared , size, and surface contract — so what you learn on applies to , , and the other 108. The code on this page follows the framework you pick.

Installtsx
npm install @pxlkit/ui-kit @pxlkit/core @pxlkit/gamification @pxlkit/ui
Tailwind CSS v4 in your buildtsx
# Next.js — create-next-app --tailwind sets this up. Otherwise:
npm install -D tailwindcss @tailwindcss/postcss postcss
// postcss.config.mjs
export default { plugins: { '@tailwindcss/postcss': {} } };
# Vite
npm install -D tailwindcss @tailwindcss/vite
// vite.config.ts
import tailwindcss from '@tailwindcss/vite';
// …
plugins: [react(), tailwindcss()],

The kit's stylesheet is a Tailwind CSS v4 entry point, so Tailwind has to process it. Without that step the build still succeeds, but the CSS keeps @theme, @source and @apply as written and the components render unstyled.

Quick Starttsx
// 1. In your Tailwind CSS file (e.g., index.css), in place of @import "tailwindcss":
// @import "@pxlkit/ui-kit/styles.css";
// 2. Use the components
import { PixelButton, PixelInput } from '@pxlkit/ui-kit';
import { PxlKitIcon } from '@pxlkit/core';
import { Trophy } from '@pxlkit/gamification';
import { Search } from '@pxlkit/ui';
export function QuickStart() {
return (
<>
<PixelButton tone="green" iconLeft={<PxlKitIcon icon={Trophy} size={16} decorative />}>
Create Quest
</PixelButton>
<PixelInput
label="Search"
prefix={<PxlKitIcon icon={Search} size={16} decorative />}
placeholder="Find icons..."
/>
</>
);
}

Next.js (App Router). Keep app/layout.tsx a Server Component and put the providers in a 'use client' file of your own; start files that use the components' hooks or event handlers with 'use client', and import server-side helpers such as buildGoogleFontsUrl from @pxlkit/ui-kit-core. The setup guide has the files.

Server rendering. The three kits render on the server and hydrate — Next.js, Nuxt, @angular/ssr. A calendar shows the current month and marks today, which depends on the reader's clock: give PixelCalendarGrid a month (or a value) for a stable server render, or render a current-month calendar in the browser only — next/dynamic with ssr: false in Next.js, <ClientOnly> in Nuxt, @defer in Angular.

From React props to Vue and Angular

The props tables on this page use the React names. The Vue and Angular kits keep those names and defaults, and follow their framework where React has its own idiom:

ReactVueAngular
<PixelButton>, <PixelTextLink> (render a <button> or an <a>)<PixelButton>an attribute on your element: <button pxlButton>, <a pxlTextLink>
any other component: <PixelBadge><PixelBadge>an element: <pxl-badge>
childrenthe default slotprojected content
element props: icon, iconLeft, footer, actionnamed slots, kebab-case: #icon-leftinputs taking text or an <ng-template>
value + onChangev-model[(value)]; form controls also take ngModel and formControlName
open + onOpenChange, checked + onChangev-model:open, v-model:checked[(open)], [(checked)]
other callbacks: onCloseevents: @closeoutputs: (closed) — past tense where the present would shadow a DOM event
const form = useForm(); <PixelForm form={form}> on React Hook Formconst form = useForm() in <script setup>; <PixelForm :form="form"> on VeeValidate<form [pxlForm]="group"> on reactive forms
classNameclassclass
<PxlKitSurfaceProvider surface><PxlKitSurfaceProvider surface>providePxlKitSurface() for the app, pxlKitSurface="…" on an element

Common API Surface

These props are accepted by every UI-kit component where applicable. Each component's individual props table below also lists them inline — so each table is a complete, self-contained reference. This shared block remains as a quick overview.

PropTypeDefaultDescription
tone"green" | "cyan" | "gold" | "red" | "purple" | "pink" | "neutral"variesColor scheme — shared across all components
size"sm" | "md" | "lg""md"Controls height, padding, and font size
surface"pixel" | "linear"inherits from PxlKitSurfaceProvider, falls back to "pixel"Visual aesthetic. Per-component override of the global surface — see Surface System.
disabledbooleanfalseStandard HTML disabled state — applies to every interactive component (buttons, inputs, switches, sliders, segmented, etc.).
iconLeft / iconRightReactNode—Icon slots flanking the label. Accepted by PixelButton; PxlKitButton/PixelSplitButton use the single `icon` slot. Inputs take `prefix` and `suffix` instead (`icon` is the older name of `prefix`).
labelstring—Accessible label for inputs/controls (PixelInput, PixelSelect, PixelCheckbox, PixelSwitch, PixelSlider, PixelRadioGroup, …). Buttons use `children` for their visible text, not `label`.
childrenReactNode—Required for container components (PixelCard, PixelModal, PixelTooltip, animations, etc.). Listed here once; not repeated in each table.
classNamestring—Extra CSS class names merged onto the outer element.

PXLKIT FOR VUE 3 · NEW IN 2.2

@pxlkit/ui-kit-vue is the Vue 3 edition of this kit: the same 111 components, markup, Tailwind CSS v4 theme and keyboard behaviour as the React kit, checked against it example by example. They are single-file components — React's element props become slots, value and open become v-model, callbacks become events. It needs Vue 3.5 or later, renders on the server with Nuxt or vue/server-renderer and hydrates without mismatches. The icon components come from @pxlkit/vue; React is never installed.

Install (Vite)bash
npm install @pxlkit/ui-kit-vue @pxlkit/vue
npm install -D tailwindcss @tailwindcss/vite
vite.config.tstypescript
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import tailwindcss from '@tailwindcss/vite';
export default defineConfig({
plugins: [vue(), tailwindcss()],
});
src/style.css — in place of @import "tailwindcss"css
@import "@pxlkit/ui-kit-vue/styles.css";
App.vuevue
<script setup lang="ts">
import { ref } from 'vue';
import { PixelButton, PixelInput, PxlKitSurfaceProvider } from '@pxlkit/ui-kit-vue';
const email = ref('');
function save() {
// send email.value
}
</script>
<template>
<PxlKitSurfaceProvider surface="pixel">
<PixelInput v-model="email" label="Email" placeholder="you@studio.dev" />
<PixelButton tone="green" @click="save">Save</PixelButton>
</PxlKitSurfaceProvider>
</template>

Nuxt. No Nuxt module or build.transpile entry is needed: add @tailwindcss/vite to vite.plugins and the stylesheet to css in nuxt.config.ts (see the Tailwind step above). Nuxt auto-imports your own components, not a package's, so import the kit's components where you use them. Every example on this page has a Vue tab; the package README maps the whole API.

PXLKIT FOR ANGULAR · NEW IN 2.2

@pxlkit/ui-kit-angular brings the same 111 components to Angular 20, 21 and 22 as standalone, signal-based components — <button pxlButton>, <pxl-modal> — with the React kit's markup, theme and keyboard behaviour. Form controls implement ControlValueAccessor, so ngModel, formControlName and [formControl] work; overlays take [(open)]. They run in zoneless and zone.js applications and hydrate with @angular/ssr. The icon components come from @pxlkit/angular.

Installbash
npm install @pxlkit/ui-kit-angular @pxlkit/angular
# Tailwind CSS v4: ng new my-app --style=tailwind (Angular CLI 21 and later),
# or on Angular 20: npm install -D tailwindcss @tailwindcss/postcss postcss
# and a .postcssrc.json with { "plugins": { "@tailwindcss/postcss": {} } }
src/styles.css — in place of @import "tailwindcss"css
@import "@pxlkit/ui-kit-angular/styles.css";
src/app/app.config.tstypescript
import type { ApplicationConfig } from '@angular/core';
import { providePxlKitSurface } from '@pxlkit/ui-kit-angular';
export const appConfig: ApplicationConfig = {
providers: [
// …keep the providers ng new generated (change detection, router,
// provideClientHydration() in SSR apps), and add:
providePxlKitSurface('pixel'),
],
};
A componenttypescript
import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { PixelButton, PixelInput } from '@pxlkit/ui-kit-angular';
@Component({
selector: 'app-signup',
imports: [FormsModule, PixelButton, PixelInput],
template: `
<pxl-input label="Email" placeholder="you@studio.dev" [(ngModel)]="email" />
<button pxlButton tone="green" (click)="save()">Save</button>
`,
})
export class Signup {
protected email = '';
protected save() {
// send this.email
}
}

Keep the providers ng new generated — provideClientHydration() in particular: without it the browser throws the server markup away and renders again. Every example on this page has an Angular tab; the package README maps the whole API, overlays and form controls included.

DESIGN TOKENS

All components use CSS custom properties for theming. Override these variables to customize the entire kit. Dark and light themes are built in via the .dark class. Colors are applied through the tone prop on components like , , and .

Colors

Green

--retro-green

Cyan

--retro-cyan

Gold

--retro-gold

Red

--retro-red

Purple

--retro-purple

Typography

Press Start 2P

Titles & accents — font-pixel

JetBrains Mono

Code & UI labels — font-mono

Inter

Body text — font-sans


Surfaces

Background

--retro-bg

Surface

--retro-surface

Card

--retro-card

Border

--retro-border

SURFACE SYSTEM

v1.4.0

Every UI-kit component has two visual surfaces: the retro 8-bit "pixel" aesthetic (default — sharp pixel borders, pressed shadows, mono fonts) and a flatter, more modern "linear" aesthetic (subtle 1px borders, rounded corners, sans fonts). You toggle it globally with <PxlKitSurfaceProvider>, or per-component with the surface prop. Useful for embedding Pxlkit into a non-retro product without rewriting the components.

Side-by-side

surface="pixel" (default)

v1.4

surface="linear"

v1.4
Surface — Setup & overridetsx
// === GLOBAL toggle: wrap your whole app once ===
// app/providers.tsx — in Next.js (App Router) the providers live in a Client Component
'use client';
import { PxlKitSurfaceProvider, PixelButton, PixelCard } from '@pxlkit/ui-kit';
export function Providers({ children }: { children: React.ReactNode }) {
return <PxlKitSurfaceProvider surface="linear">{children}</PxlKitSurfaceProvider>;
}
// app/layout.tsx stays a Server Component and renders <Providers>{children}</Providers> in <body>.
// In a Vite app, wrap <App /> in main.tsx instead.
// === LOCAL override: one component in a different mode ===
<PxlKitSurfaceProvider surface="pixel">
<PixelCard title="Retro card">
{/* This one button breaks the pixel surface */}
<PixelButton tone="green" surface="linear">Modern button</PixelButton>
</PixelCard>
</PxlKitSurfaceProvider>

LOCALE / TURKISH SUPPORT

v1.3.0

PxlKit includes built-in locale support for Turkish (tr) and English (en). Turkish requires special handling because of the dotted/dotless i distinction, and the latin-ext Google Fonts subset for characters like ğ, ş, ı, İ, ç, ö, ü.

Why Turkish Needs Special Handling

InputEnglish UppercaseTurkish UppercaseNote
iIİ (U+0130)Dotted uppercase İ in Turkish
ı (U+0131)IIDotless ı is unique to Turkish
istanbulISTANBULİSTANBULComplete word difference

Live Demo — Turkish vs English

locale="en"

ISTANBUL IŞLEMLERI

IG
JD
locale="tr"

İSTANBUL İŞLEMLERİ

İG
JD

Notice how the section title "istanbul işlemleri" renders differently: English shows ISTANBUL ISLEMLERI while Turkish correctly shows İSTANBUL İŞLEMLERİ. The avatar initials also change — "İG" (Turkish) vs "IG" (English) for "işıl gündüz".

Turkish Characters — Font Preview

Press Start 2P (font-pixel)

Ç Ğ İ Ö Ş Ü

ç ğ ı ö ş ü


JetBrains Mono (font-mono)

Ç Ğ İ Ö Ş Ü

ç ğ ı ö ş ü


Inter (font-sans)

Ç Ğ İ Ö Ş Ü

ç ğ ı ö ş ü


Turkish Pangram (font-pixel)

Pijamalı hasta yağız şoföre çabucak güvendi

Turkish Locale — Complete Setup Guidetsx
// === STEP 1: Wrap your app — in src/main.tsx (Vite), or in a 'use client' providers file (Next.js App Router) ===
import { PxlKitLocaleProvider } from '@pxlkit/ui-kit';
export function Providers({ children }: { children: React.ReactNode }) {
return <PxlKitLocaleProvider locale="tr">{children}</PxlKitLocaleProvider>;
}
// Server-rendered apps: also set lang="tr" on <html> (app/layout.tsx in Next.js).
// === STEP 2: Google Fonts — ensure the latin-ext subset ===
// In your CSS file or HTML <head>:
// @import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&subset=latin,latin-ext&display=swap');
// Or build the URL — from @pxlkit/ui-kit-core, which a Server Component (app/layout.tsx) can import:
import { buildGoogleFontsUrl } from '@pxlkit/ui-kit-core';
const fontsUrl = buildGoogleFontsUrl('tr');
// → includes &subset=latin,latin-ext
// === STEP 3: Use locale-aware text in your components (a Client Component in Next.js) ===
import { usePxlKitLocale, toLocaleUpper } from '@pxlkit/ui-kit';
function MyTitle({ text }: { text: string }) {
const { upper } = usePxlKitLocale();
return <h1 className="font-pixel">{upper(text)}</h1>;
// "istanbul" → "İSTANBUL" when locale is "tr"
}
// Or use the standalone function:
toLocaleUpper('istanbul', 'tr'); // → "İSTANBUL"
toLocaleUpper('istanbul', 'en'); // → "ISTANBUL"

PIXELBUTTON

button
Versatile button with multiple tones, sizes, icon slots, loading spinner, and ghost variant. Supports all native button attributes. Combine with for icon-only actions or for split actions.

TONES

SIZES

VARIANTS & STATES

import { PixelButton } from '@pxlkit/ui-kit';
const Arrow = () => (
<span aria-hidden className="inline-block h-3.5 w-3.5">→</span>
);
export function WithIcons() {
return (
<div className="flex flex-wrap gap-2">
<PixelButton iconLeft={<Arrow />}>Leading</PixelButton>
<PixelButton iconRight={<Arrow />}>Trailing</PixelButton>
<PixelButton iconLeft={<Arrow />} iconRight={<Arrow />}>Both</PixelButton>
</div>
);
}

PXLKITBUTTON

pxlkitbutton
Square icon-only button with accessible label via aria-label and title. Ideal for toolbar actions. For labeled buttons, see .
import { PxlKitButton } from '@pxlkit/ui-kit';
const StarIcon = () => (
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden>
<path d="M12 2l3.09 6.26L22 9.27l-5 4.87L18.18 22 12 18.56 5.82 22 7 14.14l-5-4.87 6.91-1.01L12 2z" />
</svg>
);
export function Default() {
return <PxlKitButton label="Favorite" icon={<StarIcon />} />;
}

PIXELSPLITBUTTON

splitbutton
A compound button with a primary action and a for secondary options. Dropdown closes on click-outside. Powered by the same tone system as .
import React from 'react';
import { PixelSplitButton } from '@pxlkit/ui-kit';
export function WithCallbacks() {
const [last, setLast] = React.useState<string>('—');
return (
<div className="flex flex-col items-start gap-2">
<PixelSplitButton
label="Save"
tone="cyan"
options={[
{ value: 'draft', label: 'Save as draft' },
{ value: 'template', label: 'Save as template' },
{ value: 'copy', label: 'Save a copy' },
]}
onPrimary={() => setLast('primary')}
onSelect={(v) => setLast(v)}
/>
<span className="text-xs text-retro-muted">last action: {last}</span>
</div>
);
}

PIXELINPUT

input
Text input with optional label, hint, error message, icon slot, and tone-based focus ring. Supports all native input attributes. For passwords, see . For multi-line, see .
We will never share your email
This field is required
import { PixelInput } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelInput
label="Username"
placeholder="hero@pxlkit.xyz"
hint="Your retro alias"
/>
);
}

PIXELPASSWORDINPUT

passwordinput
Password field with a custom show/hide toggle button. No native browser password reveal UI. Extends the same field shell as .
Keep this secret
import { PixelPasswordInput } from '@pxlkit/ui-kit';
export function Default() {
return <PixelPasswordInput label="Password" placeholder="Enter password" />;
}

PIXELTEXTAREA

textarea
Multi-line text input with label, hint, and error support. Uses the same FieldShell wrapper as .
Markdown supported
import { PixelTextarea } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelTextarea
label="Notes"
placeholder="Write something..."
hint="Up to 280 characters."
/>
);
}

PIXELSELECT

select
Fully custom dropdown select — no native <select> element. Features keyboard navigation (Arrow keys, Enter, Escape), click-outside close, and check mark indicator. For a simpler toggle, see . For action menus, see .
import { PixelSelect } from '@pxlkit/ui-kit';
const FRUITS = [
{ value: 'apple', label: 'Apple' },
{ value: 'banana', label: 'Banana' },
{ value: 'cherry', label: 'Cherry' },
{ value: 'date', label: 'Date' },
];
export function Default() {
return (
<PixelSelect
label="Fruit"
options={FRUITS}
placeholder="Pick a fruit"
hint="Choose your favorite"
/>
);
}

PIXELCHECKBOX

checkbox
Custom checkbox with a pixel-art check mark SVG — no native checkbox visible. Fully accessible with role='checkbox' and keyboard support. For toggling, also see .
import { useState } from 'react';
import { PixelCheckbox } from '@pxlkit/ui-kit';
export function Default() {
const [checked, setChecked] = useState(false);
return (
<PixelCheckbox
label="Accept terms"
checked={checked}
onChange={setChecked}
/>
);
}

PIXELRADIOGROUP

radiogroup
Fully custom radio group with pixel-art dot indicators. Built with role='radiogroup' and role='radio' for accessibility. For a more compact variant, see .
Framework
import { useState } from 'react';
import { PixelRadioGroup } from '@pxlkit/ui-kit';
const PLANS = [
{ value: 'free', label: 'Free' },
{ value: 'pro', label: 'Pro' },
{ value: 'team', label: 'Team' },
];
export function Default() {
const [value, setValue] = useState('free');
return (
<PixelRadioGroup
label="Plan"
value={value}
options={PLANS}
onChange={setValue}
/>
);
}

PIXELSWITCH

switch
Toggle switch with smooth transition animation. Uses role='switch' with aria-checked for screen readers. For binary choices with a label, also consider .
import { useState } from 'react';
import { PixelSwitch } from '@pxlkit/ui-kit';
export function Default() {
const [on, setOn] = useState(false);
return <PixelSwitch label="Enable notifications" checked={on} onChange={setOn} />;
}

PIXELSLIDER

slider
Fully custom range slider — no native <input type="range">. Supports pointer events for mouse and touch, keyboard arrows, and pointer capture for smooth dragging. View the current value in real-time via .
Animation speed66
Progress72
Gold range45
Fine step66
import { useState } from 'react';
import { PixelSlider } from '@pxlkit/ui-kit';
export function Default() {
const [value, setValue] = useState(40);
return (
<PixelSlider
label="Volume"
value={value}
onChange={setValue}
/>
);
}

PIXELSEGMENTED

segmented
Segmented control for toggling between a set of predefined options. Great for view modes and filters. For more choices, see or .

Layout density

import { useState } from 'react';
import { PixelSegmented } from '@pxlkit/ui-kit';
const VIEWS = [
{ value: 'grid', label: 'Grid' },
{ value: 'list', label: 'List' },
{ value: 'kanban', label: 'Kanban' },
];
export function Default() {
const [value, setValue] = useState('grid');
return (
<PixelSegmented
label="View"
value={value}
options={VIEWS}
onChange={setValue}
/>
);
}

PIXELCARD

card
Content card with icon header, body, and optional footer. Subtle hover border effect. Use with in the footer for card actions. For metric cards, see .

Gamification Pack

RPG icons, progress bars, rewards, and game UI elements ready to use.

Social Pack

Emotions, interactions, and communication elements for modern apps.
import { PixelCard } from '@pxlkit/ui-kit';
export function WithFooter() {
return (
<PixelCard
title="Invoice #1042"
footer={<span className="text-xs text-retro-muted">Due in 7 days</span>}
>
<p>Total: $1,250.00</p>
</PixelCard>
);
}

PIXELSTATCARD

statcard
Compact metric card for dashboards. Displays a value with label, icon, and optional trend indicator. For content cards, see .

Total Icons

204

+12 new

Components

111

100% typed

Downloads

8.2k

+24%

Stars

1.4k

trending

import { PixelStatCard } from '@pxlkit/ui-kit';
export function Default() {
return <PixelStatCard label="Revenue" value="$12,480" trend="+8.2% vs last week" />
}

PIXELTABLE

table
Data table with striped rows, hover highlight, and horizontal scroll on small screens. Accepts ReactNode cell values for rich content like .
ComponentCategoryStatus
PixelButtonActionsStable
PixelSelectInputsStable
PixelTableData DisplayNew
PixelAvatarData DisplayNew
PixelSkeletonFeedbackNew
import { PixelTable } from '@pxlkit/ui-kit';
type Row = {
id: string;
name: string;
role: string;
status: string;
};
const rows: Row[] = [
{ id: '1', name: 'Alice', role: 'Engineer', status: 'active' },
{ id: '2', name: 'Bob', role: 'Designer', status: 'idle' },
{ id: '3', name: 'Carol', role: 'PM', status: 'active' },
];
const baseColumns = [
{ key: 'name', header: 'Name' },
{ key: 'role', header: 'Role' },
{ key: 'status', header: 'Status' },
];
export function Default() {
return <PixelTable<Row> columns={baseColumns} data={rows} />;
}

PIXELAVATAR

avatar
Avatar component that renders initials fallback when no image is provided. Pixel-art aesthetic with border.
JD
AB
P
RT
GU
import { PixelAvatar } from '@pxlkit/ui-kit';
export function Default() {
return <PixelAvatar name="Joangel De La Rosa" />;
}

PIXELBADGE

badge
Read-only status indicator with tone variants. Use inside cells, headers, or alongside any text for contextual labels.
StableBetaDeprecatedv2.0ExperimentalArchived
import { PixelBadge } from '@pxlkit/ui-kit';
export function Default() {
return <PixelBadge>NEW</PixelBadge>;
}

PIXELCHIP

chip
Interactive tag with optional remove button. Use for filter selections, tag lists, or removable labels. For static labels, see .
reacttypescripttailwindremovabledeprecated
import { useState } from 'react';
import { PixelChip } from '@pxlkit/ui-kit';
export function Deletable() {
const [visible, setVisible] = useState(true);
if (!visible) return null;
return (
<PixelChip
label="Remove me"
tone="red"
onDelete={() => setVisible(false)}
/>
);
}

PIXELCODEINLINE

codeinline
Inline code highlight with monospace font and tone border. Use inside paragraphs, descriptions, and props documentation to reference code tokens.

Use useState for local state, PxlKitIcon for icons, green gold red neutral

import { PixelCodeInline } from '@pxlkit/ui-kit';
export function Default() {
return <PixelCodeInline>npm install</PixelCodeInline>;
}

PIXELKBD

kbd
Keyboard shortcut indicator rendered as a styled key cap. Combine multiple instances for multi-key shortcuts. Pairs well with for shortcut hints.
Ctrl+K·⌘+Shift+P·Esc·Tab·Enter
import { PixelKbd } from '@pxlkit/ui-kit';
export function Default() {
return <PixelKbd>Enter</PixelKbd>;
}

PIXELCOLORSWATCH

colorswatch
Color swatch preview for . Renders a color box with name and CSS variable reference. Use in theme documentation or settings panels.

Green

--retro-green

Cyan

--retro-cyan

Gold

--retro-gold

Red

--retro-red

Purple

--retro-purple

import { PixelColorSwatch } from '@pxlkit/ui-kit';
export function Default() {
return <PixelColorSwatch name="cyan" cssVar="--color-retro-cyan" />;
}

PIXELALERT

alert
Alert banner with title, message, optional icon, and action slot. Supports all variants for different severity levels. Pair with in the action slot.
import { PixelAlert, PixelButton } from '@pxlkit/ui-kit';
const InfoIcon = () => (
<span
aria-hidden
style={{
width: 14,
height: 14,
borderRadius: 9999,
background: 'currentColor',
display: 'inline-block',
}}
/>
);
export function WithAction() {
return (
<PixelAlert
tone="red"
title="Connection lost"
message="We couldn't reach the server. Check your network and retry."
icon={<InfoIcon />}
action={
<PixelButton size="sm" tone="red" variant="outline">
Retry
</PixelButton>
}
/>
);
}

PIXELPROGRESS

progress
Determinate progress bar with optional label and value display. Smooth animated transitions. Works great alongside to show computed progress.
Build progress72%
Animation speed66%
Storage used45%
CPU load90%
import { PixelProgress } from '@pxlkit/ui-kit';
export function Default() {
return <PixelProgress value={60} label="HP" />;
}

PIXELSKELETON

skeleton
Loading placeholder with pulse animation. Use to indicate content is being fetched. Great for placeholder state in layouts.
import { PixelSkeleton } from '@pxlkit/ui-kit';
export function Default() {
return <PixelSkeleton width="12rem" height="1rem" />;
}

PIXELEMPTYSTATE

emptystate
Placeholder for empty lists, search results, or zero-data views. Supports icon, description, and .

No results found

Adjust your filters or create a new custom component for this kit.

import { PixelEmptyState, PixelButton } from '@pxlkit/ui-kit';
const FolderIcon = () => (
<span
aria-hidden
style={{
width: 32,
height: 32,
borderRadius: 4,
border: '2px solid currentColor',
display: 'inline-block',
}}
/>
);
export function WithIconAndAction() {
return (
<PixelEmptyState
icon={<FolderIcon />}
title="No documents"
description="Upload a file or create a new document to begin."
action={
<PixelButton size="sm" tone="green" variant="solid">
Create document
</PixelButton>
}
/>
);
}

PIXELTOAST

toast
The card each toast renders as: a tone, a title and message, an icon or animated icon, an action, a loading spinner and the bar that counts down to its dismissal. <PxlKitToastProvider> draws one for every toast you push with (injectToast() in Angular) — you rarely render it yourself. Push some live in the playground below. The icon packages' standalone PixelToast, one toast whose visibility you control, is documented in /docs#toast-notifications.

Saved

Your changes were saved.

Not saved

The server did not answer. Try again.

Syncing…

Fetching the latest updates.

File deleted

report.pdf went to the bin.

import { PixelToast } from '@pxlkit/ui-kit';
import type { ToastItem } from '@pxlkit/ui-kit';
const noop = () => {};
const baseToast = (overrides: Partial<ToastItem> = {}): ToastItem => ({
id: 'demo',
title: 'Saved',
message: 'Your changes have been persisted.',
tone: 'cyan',
duration: 0,
...overrides,
});
export function Default() {
return <PixelToast toast={baseToast()} onDismiss={noop} />;
}

USETOAST()

usetoast()
Mount <PxlKitToastProvider> once around your app; under it, useToast() (React, Vue) or injectToast() (Angular) returns the toast API. The provider keeps the queue, draws the in its viewport — stacked by default, a landmark F8 moves focus to — announces each toast to screen readers, and holds the countdowns while the page is hidden. Try it:
Duration (ms)4500
10008000
import React from 'react';
import { PxlKitToastProvider, useToast, PixelButton } from '@pxlkit/ui-kit';
function TriggerRow({ children }: { children: React.ReactNode }) {
return <div className="flex flex-wrap gap-2">{children}</div>;
}
function DefaultTriggers() {
const { toast } = useToast();
return (
<TriggerRow>
<PixelButton size="sm" onClick={() => toast({ title: 'Saved', message: 'Your changes were persisted.' })}>
Push toast
</PixelButton>
</TriggerRow>
);
}
export function Default() {
return (
<PxlKitToastProvider>
<DefaultTriggers />
</PxlKitToastProvider>
);
}

PIXELTABS

tabs
Tab navigation with optional icon support per tab. Uses proper ARIA tablist and tabpanel roles. For collapsible panels, see .
Quick start guide and component summary for the Pxlkit UI Kit.
import { PixelTabs } from '@pxlkit/ui-kit';
import type { TabItem } from '@pxlkit/ui-kit';
const ITEMS: TabItem[] = [
{ id: 'overview', label: 'Overview', content: <p>High-level summary of the project.</p> },
{ id: 'activity', label: 'Activity', content: <p>Recent events and commits.</p> },
{ id: 'settings', label: 'Settings', content: <p>Configuration for this workspace.</p> },
];
export function Default() {
return <PixelTabs items={ITEMS} defaultValue="overview" />;
}

PIXELACCORDION

accordion
Collapsible content sections with pixel-art chevron indicator. Supports single or multiple open panels. For tabbed navigation, see .
Pass any PxlKitIcon or AnimatedPxlKitIcon as a ReactNode through iconLeft, iconRight, or icon props. All Pxlkit icon packs are supported.
import { PixelAccordion } from '@pxlkit/ui-kit';
const SAMPLE_ITEMS = [
{
id: 'overview',
title: 'Overview',
content: 'Introductory section that opens by default.',
},
{
id: 'details',
title: 'Details',
content: 'Secondary section with extended copy.',
},
{
id: 'faq',
title: 'FAQ',
content: 'Common questions and short answers.',
},
];
export function Default() {
return <PixelAccordion items={SAMPLE_ITEMS} />;
}

PIXELCOLLAPSIBLE

collapsible
Simple toggle panel with chevron indicator. Use for optional detail sections, prop references, or progressive disclosure. For multi-panel groups, see .

This panel starts expanded. Click the label to collapse it.

import { PixelCollapsible } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelCollapsible label="Show details">
<p className="text-xs text-retro-muted">
Hidden content revealed when the header is toggled.
</p>
</PixelCollapsible>
);
}

PIXELBREADCRUMB

breadcrumb
Navigation breadcrumb with pixel-art chevron separators. Items can be links, buttons, or plain text. Used at the top of this page and in headers.
import { PixelBreadcrumb } from '@pxlkit/ui-kit';
const TRAIL = [
{ label: 'Home', href: '/' },
{ label: 'Docs', href: '/docs' },
{ label: 'Components', href: '/docs/components' },
{ label: 'Breadcrumb', active: true },
];
export function Default() {
return <PixelBreadcrumb items={TRAIL} />;
}

PIXELPAGINATION

pagination
Page navigation with prev/next buttons and numbered pages. Disables prev/next at boundaries. Pairs well with for paginated data.
import { useState } from 'react';
import { PixelPagination } from '@pxlkit/ui-kit';
export function Default() {
const [page, setPage] = useState(1);
return <PixelPagination page={page} total={10} onChange={setPage} />;
}

PIXELMODAL

modal
Modal dialog with backdrop blur, Escape key close, backdrop click close, and body scroll lock. Rendered with proper ARIA dialog attributes. Great with for confirm/cancel actions.
import { useState } from 'react';
import { PixelModal, PixelButton } from '@pxlkit/ui-kit';
export function Default() {
const [open, setOpen] = useState(false);
return (
<>
<PixelButton onClick={() => setOpen(true)}>Open modal</PixelButton>
<PixelModal open={open} onClose={() => setOpen(false)} title="Default modal">
<p>This is a minimal modal with title and body content.</p>
</PixelModal>
</>
);
}

PIXELTOOLTIP

tooltip
Informational tooltip that appears on hover and focus. Supports four positions. Wrap any element — works perfectly with .
import { PixelTooltip, PixelButton } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelTooltip label="Save your changes">
<PixelButton>Save</PixelButton>
</PixelTooltip>
);
}

PIXELDROPDOWN

dropdown
Action menu dropdown with click-outside close. Ideal for contextual actions and quick navigation. For form selection, see . For split actions, see .
import { PixelDropdown } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelDropdown
label="Actions"
items={[
{ value: 'edit', label: 'Edit' },
{ value: 'duplicate', label: 'Duplicate' },
{ value: 'archive', label: 'Archive' },
]}
onSelect={() => {}}
/>
);
}

PIXELSECTION

section
Content section wrapper with title and optional subtitle. Provides consistent spacing and border styling. Used internally to group components on this page. Combine with for visual separation.

EXAMPLE SECTION

This is a wrapped content area with border and padding.

import { PixelSection } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelSection title="Overview" subtitle="Key metrics for this period.">
<p className="text-sm text-retro-muted">
Section content goes here. Wrap any layout block.
</p>
</PixelSection>
);
}

PIXELDIVIDER

divider
Horizontal divider with optional centered label. Great for separating content sections. Used throughout this page between categories. Pair with .

import { PixelDivider } from '@pxlkit/ui-kit';
export function Default() {
return <PixelDivider />;
}

PIXELBAREBUTTON

barebutton
Unstyled <button> wrapper with forwardRef support and type="button" default. Use as the base for custom styled buttons.

Renders an unstyled <button type="button"> element. Apply your own classes to build custom interactions without inheriting Pxlkit button styles.

import { PixelBareButton } from '@pxlkit/ui-kit';
export function Default() {
return <PixelBareButton>Bare button</PixelBareButton>;
}

PIXELBAREINPUT

bareinput
Unstyled <input> wrapper with forwardRef support. Use as the base for custom text fields or form controls.

Renders an unstyled <input> element. For styled text fields with labels, hints, and errors, use .

import { PixelBareInput } from '@pxlkit/ui-kit';
export function Default() {
return <PixelBareInput placeholder="Type something" />;
}

PIXELBARETEXTAREA

baretextarea
Unstyled <textarea> wrapper with forwardRef support. Use for custom multi-line inputs.

Renders an unstyled <textarea> element. For styled multi-line input with labels and errors, use .

import { PixelBareTextarea } from '@pxlkit/ui-kit';
export function Default() {
return <PixelBareTextarea placeholder="Write something..." rows={4} />;
}

TRIGGER MODES

all animations

Every animation component accepts a trigger prop that controls when it plays. The default "mount" mode preserves backward compatibility — the animation fires on render.

mount

Plays immediately on render (default).

hover

Plays while the pointer is over the element.

click

Plays once per click. Re-click to replay.

focus

Plays while the element has focus-within.

inView

Plays when scrolled into the viewport (IntersectionObserver).

boolean

Controlled mode — true = playing, false = idle.

Animation triggerstsx
// Plays on hover
<PixelBounce trigger="hover">
<PxlKitIcon icon={Star} size={20} />
</PixelBounce>
// Plays once per click
<PixelShake trigger="click" repeat={2}>
<PixelBadge tone="red">Error</PixelBadge>
</PixelShake>
// Controlled by parent state
const [active, setActive] = useState(false);
<PixelPulse trigger={active}>
<PixelBadge tone="green">Live</PixelBadge>
</PixelPulse>
// Fade in when scrolled into view
<PixelFadeIn trigger="inView" duration={600}>
<PixelCard title="Hello">Visible!</PixelCard>
</PixelFadeIn>
// Callback when animation completes
<PixelFadeIn trigger="click" onComplete={() => console.log('done!')}>
<p>Click me</p>
</PixelFadeIn>

HOVER

star

CLICK

Shake me

HOVER

gear

PIXELFADEIN

fadein
Fades in children on mount. Use trigger to control when it fires — e.g. "inView" for scroll-triggered reveals. Combines well with for staggered entrances.

Faded In

This card fades in from opacity 0. Click replay to restart.
import { PixelFadeIn } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelFadeIn>
<div style={{ padding: 16, background: '#111', color: '#fff' }}>
Fades in on mount
</div>
</PixelFadeIn>
);
}

PIXELSLIDEIN

slidein
Slides in children from a direction with a fade. You can fine tune travel using distance and pacing using easing. Complements .
v DOWN
^ UP
< LEFT
> RIGHT
import { PixelSlideIn } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelSlideIn>
<div style={{ padding: 16, background: '#111', color: '#fff' }}>
Slides in from below on mount
</div>
</PixelSlideIn>
);
}

PIXELPULSE

pulse
Continuously pulses opacity and scale to draw attention. Ideal for notifications, loading states, or status indicators. Disable by removing the component when not needed.
Live
Online

CPU

87%

import { PixelPulse } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelPulse>
<span>Pulse</span>
</PixelPulse>
);
}

PIXELBOUNCE

bounce
Applies a pixel-art vertical bounce to any element. Great for icons, badges, and call-to-actions. Control bounce speed with duration and stop it with repeat=1.
trophy
+100 XP
crown
import { PixelBounce } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelBounce>
<span>Bounce</span>
</PixelBounce>
);
}

PIXELFLOAT

float
Creates a smooth hovering motion for icons, badges, and decorative cards. Use it as a soft ambient animation and combine with for status signals.
star
Hover
heart
import { PixelFloat } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelFloat>
<span>Float</span>
</PixelFloat>
);
}

PIXELSHAKE

shake
Adds a quick horizontal shake for validation errors or critical alerts. Keep repeat low to avoid visual fatigue. Often paired with .
Invalid
warning-triangle
Low HP
import { PixelShake } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelShake>
<span>Shake on mount</span>
</PixelShake>
);
}

PIXELROTATE

rotate
Rotates children continuously or in finite loops. Use direction to reverse or alternate spin behavior for loading indicators and decorative accents.
gear
lightning
Sync
import { PixelRotate } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelRotate>
<span>Rotate</span>
</PixelRotate>
);
}

PIXELZOOMIN

zoomin
Scales and fades elements into view for punchy entrances. Works great for cards, badges, and modal content. Combine with for polished appear transitions.

Pack Ready

UI pack bundled
New Anim
import { PixelZoomIn } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelZoomIn>
<div style={{ padding: 16, background: '#0EA5E9', color: '#fff', borderRadius: 8 }}>
Zoom in content
</div>
</PixelZoomIn>
);
}

PIXELFLICKER

flicker
Creates a retro monitor/electric flicker effect. Ideal for alert labels, neon headings, and ambient status text. Pair with for cyberpunk-style UI accents.

SIGNAL LOCKED

NEON
lightning
import { PixelFlicker } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelFlicker>
<span>OPEN 24/7</span>
</PixelFlicker>
);
}

PIXELTYPEWRITER

typewriter
Reveals text character by character at a configurable speed. Supports a blinking cursor and start delay. Inherits the system for color theming.
> Initializing Pxlkit UI Kit...
> Loading 111 components...
> System ready.
import { PixelTypewriter } from '@pxlkit/ui-kit';
export function Default() {
return <PixelTypewriter text="Hello, pxlkit." />;
}

PIXELGLITCH

glitch
Cyberpunk-style scanline glitch with RGB channel split. Three rendered layers shift independently — two ghost layers offset in opposite directions create chromatic aberration. Control with trigger, tune speed and intensity.

ERROR

2500ms / 4px

CORRUPT

1800ms / 5px

GLITCH

badge / 3px

PXLKIT

2200ms / 6px

import { PixelGlitch } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelGlitch>
<span className="text-2xl font-bold">SYSTEM ONLINE</span>
</PixelGlitch>
);
}

Real live demos for every component that ships in @pxlkit/ui-kit. Each preview is the Default example function authored alongside the component in <Component>.examples.tsx (single source of truth).

PIXELCOMBOBOX

combobox
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
Type to filter
import { PixelCombobox } from '@pxlkit/ui-kit';
const FRUITS = [
{ value: 'apple', label: 'Apple' },
{ value: 'banana', label: 'Banana' },
{ value: 'cherry', label: 'Cherry' },
{ value: 'date', label: 'Date' },
{ value: 'elderberry', label: 'Elderberry' },
{ value: 'fig', label: 'Fig' },
{ value: 'grape', label: 'Grape' },
];
export function Default() {
return (
<PixelCombobox
label="Fruit"
options={FRUITS}
placeholder="Pick a fruit"
hint="Type to filter"
/>
);
}

PIXELMULTISELECT

multiselect
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
React
import React from 'react';
import { PixelMultiSelect } from '@pxlkit/ui-kit';
const OPTIONS = [
{ value: 'react', label: 'React' },
{ value: 'vue', label: 'Vue' },
{ value: 'svelte', label: 'Svelte' },
{ value: 'solid', label: 'Solid' },
{ value: 'angular', label: 'Angular', disabled: true },
];
export function Default() {
const [value, setValue] = React.useState<string[]>(['react']);
return (
<PixelMultiSelect
label="Frameworks"
options={OPTIONS}
value={value}
onChange={setValue}
placeholder="Pick frameworks…"
/>
);
}

PIXELDATEPICKER

datepicker
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelDatePicker } from '@pxlkit/ui-kit';
export function Default() {
const [date, setDate] = useState<Date | null>(null);
return (
<PixelDatePicker
label="Pick a date"
value={date}
onChange={setDate}
placeholder="Select date"
/>
);
}

PIXELNUMBERINPUT

numberinput
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelNumberInput } from '@pxlkit/ui-kit';
export function Default() {
const [value, setValue] = useState<number>(5);
return (
<PixelNumberInput
label="Quantity"
value={value}
onChange={setValue}
min={0}
max={100}
/>
);
}

PIXELOTPINPUT

otpinput
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import React from 'react';
import { PixelOTPInput } from '@pxlkit/ui-kit';
export function Default() {
const [value, setValue] = React.useState('')
return <PixelOTPInput length={6} value={value} onChange={setValue} />
}

PIXELFILEUPLOAD

fileupload
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
Drop files or click to browseAccepts: image/*
PNG or JPG, up to 5 MB each
import { useState } from 'react';
import { PixelFileUpload } from '@pxlkit/ui-kit';
export function Default() {
const [files, setFiles] = useState<File[]>([]);
return (
<PixelFileUpload
label="Upload files"
hint="PNG or JPG, up to 5 MB each"
value={files}
onChange={setFiles}
accept="image/*"
multiple
maxSize={5 * 1024 * 1024}
maxFiles={5}
/>
);
}

PIXELFORM

form
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Your retro alias.

import { useForm } from 'react-hook-form';
import { PixelForm, PixelInput } from '@pxlkit/ui-kit';
type DefaultValues = {
username: string;
email: string;
};
export function Default() {
const form = useForm<DefaultValues>({
defaultValues: { username: '', email: '' },
});
return (
<PixelForm
form={form}
onSubmit={(data) => {
// eslint-disable-next-line no-console
console.log('submit', data);
}}
>
<PixelForm.Field
name="username"
rules={{ required: 'Username is required' }}
render={({ field }) => (
<PixelForm.Item>
<PixelForm.Label>Username</PixelForm.Label>
<PixelForm.Control>
<PixelInput placeholder="pxlhero" {...field} />
</PixelForm.Control>
<PixelForm.Description>Your retro alias.</PixelForm.Description>
<PixelForm.Message />
</PixelForm.Item>
)}
/>
<PixelForm.Field
name="email"
rules={{
required: 'Email is required',
pattern: { value: /.+@.+\..+/, message: 'Enter a valid email' },
}}
render={({ field }) => (
<PixelForm.Item>
<PixelForm.Label>Email</PixelForm.Label>
<PixelForm.Control>
<PixelInput type="email" placeholder="hero@pxlkit.xyz" {...field} />
</PixelForm.Control>
<PixelForm.Message />
</PixelForm.Item>
)}
/>
</PixelForm>
);
}

PIXELINPUTGROUP

inputgroup
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelInputGroup } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelInputGroup aria-label="Website URL">
<input aria-label="Protocol" defaultValue="https://" className="bg-transparent px-2 outline-none" />
<input aria-label="Domain name" defaultValue="pxlkit" className="bg-transparent px-2 outline-none" />
<input aria-label="Top-level domain" defaultValue=".xyz" className="bg-transparent px-2 outline-none" />
</PixelInputGroup>
);
}

PIXELTOGGLEGROUP

togglegroup
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelToggle, PixelToggleGroup } from '@pxlkit/ui-kit';
export function Default() {
const [value, setValue] = useState<string>('left');
return (
<PixelToggleGroup
type="single"
value={value}
onChange={setValue}
aria-label="Text alignment"
>
<PixelToggle value="left">Left</PixelToggle>
<PixelToggle value="center">Center</PixelToggle>
<PixelToggle value="right">Right</PixelToggle>
</PixelToggleGroup>
);
}

PIXELTOGGLE

toggle
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelToggle } from '@pxlkit/ui-kit';
export function Default() {
const [pressed, setPressed] = useState(false);
return (
<PixelToggle value="bold" pressed={pressed} onPressedChange={setPressed}>
Bold
</PixelToggle>
);
}

PIXELDATERANGEPICKER

daterangepicker
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelDateRangePicker, type DateRangeValue } from '@pxlkit/ui-kit';
export function Default() {
const [range, setRange] = useState<DateRangeValue>({});
return (
<PixelDateRangePicker
label="Date range"
value={range}
onChange={setRange}
placeholder="Select date range"
/>
);
}

PIXELCALENDARGRID

calendargrid
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelCalendarGrid } from '@pxlkit/ui-kit';
export function Default() {
const [value, setValue] = useState<Date | null>(null)
return <PixelCalendarGrid value={value} onChange={setValue} />
}

PIXELCOLORINPUT

colorinput
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelColorInput } from '@pxlkit/ui-kit';
export function Default() {
const [value, setValue] = useState<string>('#06b6d4');
return (
<PixelColorInput
label="Brand color"
value={value}
onChange={setValue}
/>
);
}

PIXELRIBBON

ribbon
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
Card content
New
import React from 'react';
import { PixelRibbon } from '@pxlkit/ui-kit';
function Container({ children }: { children: React.ReactNode }) {
return (
<div className="relative inline-block border-2 border-retro-border bg-retro-bg/60 p-8 text-retro-text">
<div>Card content</div>
{children}
</div>
);
}
export function Default() {
return (
<Container>
<PixelRibbon>New</PixelRibbon>
</Container>
);
}

PIXELSTARRATING

starrating
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelStarRating } from '@pxlkit/ui-kit';
export function Default() {
return <PixelStarRating value={4} />;
}

PIXELICONFRAME

iconframe
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelIconFrame } from '@pxlkit/ui-kit';
const Glyph = () => (
<span style={{ fontFamily: 'monospace', fontWeight: 700 }}>{'>_'}</span>
);
export function Default() {
return <PixelIconFrame icon={<Glyph />} />;
}

PIXELDATATABLE

datatable
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
AliceEngineeractive
BobDesigneridle
CarolPMactive
DanEngineeractive
EveDesigneridle
import { PixelDataTable, createColumnHelper, type ColumnDef } from '@pxlkit/ui-kit';
type Row = {
id: string;
name: string;
role: string;
status: string;
};
const rows: Row[] = [
{ id: '1', name: 'Alice', role: 'Engineer', status: 'active' },
{ id: '2', name: 'Bob', role: 'Designer', status: 'idle' },
{ id: '3', name: 'Carol', role: 'PM', status: 'active' },
{ id: '4', name: 'Dan', role: 'Engineer', status: 'active' },
{ id: '5', name: 'Eve', role: 'Designer', status: 'idle' },
];
const ch = createColumnHelper<Row>();
const columns: ColumnDef<Row, unknown>[] = [
ch.accessor('name', { header: 'Name' }) as ColumnDef<Row, unknown>,
ch.accessor('role', { header: 'Role' }) as ColumnDef<Row, unknown>,
ch.accessor('status', { header: 'Status' }) as ColumnDef<Row, unknown>,
];
export function Default() {
return <PixelDataTable<Row> data={rows} columns={columns} />;
}

PIXELTIMELINE

timeline
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
  1. Order placed09:00
    Confirmation email sent.
  2. Packed11:20
    At the warehouse.
  3. Shipped—
    Awaiting carrier pickup.
import { PixelTimeline, PixelTimelineItem } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelTimeline active={1}>
<PixelTimelineItem title="Order placed" time="09:00">
Confirmation email sent.
</PixelTimelineItem>
<PixelTimelineItem title="Packed" time="11:20">
At the warehouse.
</PixelTimelineItem>
<PixelTimelineItem title="Shipped" time="—">
Awaiting carrier pickup.
</PixelTimelineItem>
</PixelTimeline>
);
}

PIXELSTATGROUP

statgroup
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Users

1,284

Revenue

$12.4k

Active

312

import { PixelStatGroup, PixelStatCard } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelStatGroup aria-label="Key metrics">
<PixelStatCard label="Users" value="1,284" />
<PixelStatCard label="Revenue" value="$12.4k" />
<PixelStatCard label="Active" value="312" />
</PixelStatGroup>
);
}

PIXELAVATARGROUP

avatargroup
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
JD
AL
CD
import { PixelAvatarGroup, PixelAvatar } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelAvatarGroup aria-label="3 team members">
<PixelAvatar name="Joangel De La Rosa" />
<PixelAvatar name="Ana Lopez" />
<PixelAvatar name="Carlos Diaz" />
</PixelAvatarGroup>
);
}

PIXELBADGEGROUP

badgegroup
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
reacttypescriptdesign
import { PixelBadgeGroup, PixelBadge } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelBadgeGroup aria-label="Tags">
<PixelBadge tone="cyan">react</PixelBadge>
<PixelBadge tone="green">typescript</PixelBadge>
<PixelBadge tone="gold">design</PixelBadge>
</PixelBadgeGroup>
);
}

PIXELCHIPGROUP

chipgroup
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import React, { useState } from 'react';
import { PixelChipGroup, PixelChip } from '@pxlkit/ui-kit';
const Chip = PixelChip as unknown as React.ComponentType<
React.ComponentProps<typeof PixelChip> & { value: string }
>;
export function Default() {
const [value, setValue] = useState<string[]>(['react']);
return (
<PixelChipGroup value={value} onChange={setValue} aria-label="Frameworks">
<Chip value="react" label="React" tone="cyan" />
<Chip value="vue" label="Vue" tone="green" />
<Chip value="svelte" label="Svelte" tone="gold" />
</PixelChipGroup>
);
}

PIXELSPARKLINE

sparkline
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelSparkline } from '@pxlkit/ui-kit';
const sample = [
{ x: 'Mon', y: 12 },
{ x: 'Tue', y: 18 },
{ x: 'Wed', y: 9 },
{ x: 'Thu', y: 24 },
{ x: 'Fri', y: 16 },
{ x: 'Sat', y: 21 },
{ x: 'Sun', y: 14 },
];
export function Default() {
return <PixelSparkline data={sample} />;
}

PIXELBARCHART

barchart
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelBarChart } from '@pxlkit/ui-kit';
const sample = [
{ x: 'Mon', y: 12 },
{ x: 'Tue', y: 18 },
{ x: 'Wed', y: 9 },
{ x: 'Thu', y: 24 },
{ x: 'Fri', y: 16 },
{ x: 'Sat', y: 21 },
{ x: 'Sun', y: 14 },
];
export function Default() {
return <PixelBarChart data={sample} />;
}

PIXELAREACHART

areachart
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelAreaChart } from '@pxlkit/ui-kit';
const sample = [
{ x: 'Mon', y: 12 },
{ x: 'Tue', y: 18 },
{ x: 'Wed', y: 9 },
{ x: 'Thu', y: 24 },
{ x: 'Fri', y: 16 },
{ x: 'Sat', y: 21 },
{ x: 'Sun', y: 14 },
];
export function Default() {
return <PixelAreaChart data={sample} />;
}

PIXELFEATURECARD

featurecard
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Realtime sync

Push every keystroke to peers via WebSockets — under 50ms p95.

import { PixelFeatureCard } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelFeatureCard
title="Realtime sync"
description="Push every keystroke to peers via WebSockets — under 50ms p95."
/>
);
}

PIXELPRICINGCARD

pricingcard
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Starter

Everything you need to ship your first project.

$19/mo
  • Included: 10 projects
  • Included: Basic analytics
  • Included: Email support
  • Not included: Priority support
import { PixelPricingCard } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelPricingCard
tone="cyan"
name="Starter"
description="Everything you need to ship your first project."
price={{ amount: '$19', period: '/mo' }}
features={[
{ label: '10 projects' },
{ label: 'Basic analytics' },
{ label: 'Email support' },
{ label: 'Priority support', included: false },
]}
/>
);
}

PIXELTESTIMONIALCARD

testimonialcard
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
VERIFIED
“pxlkit dropped the polish ceiling. Our marketing site felt like a product launch in a week.”
Marisol QuinteroHead of Design · Northbeam
import { PixelTestimonialCard } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelTestimonialCard
quote="pxlkit dropped the polish ceiling. Our marketing site felt like a product launch in a week."
name="Marisol Quintero"
role="Head of Design"
company="Northbeam"
stars={5}
verified
/>
);
}

PIXELHEROSECTION

herosection
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
Embedded

A hero inside a page

Its headline is an h2, under the page's own h1.

import { PixelHeroSection } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelHeroSection
eyebrow="Introducing"
headline="Pixel-perfect retro UI for modern web"
subline="A component kit that brings cinematic, terminal-grade interfaces to React apps."
primaryCta={<button type="button">Get started</button>}
secondaryCta={<button type="button">View docs</button>}
/>
)
}

PIXELHEROMEDIA

heromedia
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
16:10 media
import { PixelHeroMedia } from '@pxlkit/ui-kit';
const Placeholder = ({ label }: { label: string }) => (
<div className="flex h-full w-full items-center justify-center bg-gradient-to-br from-cyan-500/20 to-purple-500/20 text-xs font-mono text-retro-muted">
{label}
</div>
);
export function Default() {
return (
<PixelHeroMedia ratio="16/10">
<Placeholder label="16:10 media" />
</PixelHeroMedia>
);
}

PIXELSPINNER

spinner
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
Loading
import { PixelSpinner } from '@pxlkit/ui-kit';
export function Default() {
return <PixelSpinner />
}

PIXELSTEPPER

stepper
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
Step 1 of 3: AccountCreate your account
Step 2 of 3: Profile (current)Add some details
Step 3 of 3: ConfirmReview and submit
import { PixelStepper } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelStepper active={1}>
<PixelStepper.Step label="Account" description="Create your account" />
<PixelStepper.Step label="Profile" description="Add some details" />
<PixelStepper.Step label="Confirm" description="Review and submit" />
</PixelStepper>
);
}

PIXELMENUBAR

menubar
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelMenubar, type PixelMenubarMenu } from '@pxlkit/ui-kit';
const menus: PixelMenubarMenu[] = [
{
label: 'File',
items: [
{ value: 'new', label: 'New', shortcut: 'Ctrl+N' },
{ value: 'open', label: 'Open…', shortcut: 'Ctrl+O' },
{ value: 'sep-1', label: '', separator: true },
{
value: 'recent',
label: 'Open Recent',
submenu: [
{ value: 'r1', label: 'project-alpha.pxl' },
{ value: 'r2', label: 'project-beta.pxl' },
],
},
{ value: 'sep-2', label: '', separator: true },
{ value: 'save', label: 'Save', shortcut: 'Ctrl+S' },
{ value: 'quit', label: 'Quit', shortcut: 'Ctrl+Q' },
],
},
{
label: 'Edit',
items: [
{ value: 'undo', label: 'Undo', shortcut: 'Ctrl+Z' },
{ value: 'redo', label: 'Redo', shortcut: 'Ctrl+Y', disabled: true },
{ value: 'sep-3', label: '', separator: true },
{ value: 'cut', label: 'Cut', shortcut: 'Ctrl+X' },
{ value: 'copy', label: 'Copy', shortcut: 'Ctrl+C' },
{ value: 'paste', label: 'Paste', shortcut: 'Ctrl+V' },
],
},
{
label: 'View',
items: [
{ value: 'zoom-in', label: 'Zoom In', shortcut: 'Ctrl++' },
{ value: 'zoom-out', label: 'Zoom Out', shortcut: 'Ctrl+-' },
],
},
];
export function Default() {
return <PixelMenubar menus={menus} />;
}

PIXELNAVIGATIONMENU

navigationmenu
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelNavigationMenu } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelNavigationMenu
items={[
{ label: 'Home', href: '#home' },
{
label: 'Products',
content: (
<div className="grid gap-2 text-sm text-retro-text">
<a href="#analytics" className="hover:underline">Analytics</a>
<a href="#dashboard" className="hover:underline">Dashboard</a>
<a href="#reports" className="hover:underline">Reports</a>
</div>
),
},
{ label: 'Docs', href: '#docs' },
{ label: 'Pricing', href: '#pricing' },
]}
/>
)
}

PIXELSIDEBAR

sidebar
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { PixelSidebar } from '@pxlkit/ui-kit';
const sections = [
{
title: 'Workspace',
items: [
{ id: 'dashboard', label: 'Dashboard', active: true },
{ id: 'projects', label: 'Projects', badge: { label: '4', tone: 'cyan' as const } },
{ id: 'tasks', label: 'Tasks' },
],
},
{
title: 'Account',
items: [
{ id: 'settings', label: 'Settings' },
{ id: 'billing', label: 'Billing', badge: { label: 'NEW', tone: 'green' as const } },
],
},
];
export function Default() {
return (
<div style={{ height: 320 }}>
<PixelSidebar sections={sections} header={<span className="text-xs text-retro-text">pxlkit</span>} />
</div>
);
}

PIXELPORTAL

portal
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
Portaled content (renders into document.body after mount)
import { PixelPortal } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelPortal>
<div>Portaled content (renders into document.body after mount)</div>
</PixelPortal>
)
}

PIXELPOPOVER

popover
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelPopover } from '@pxlkit/ui-kit';
export function Default() {
const [open, setOpen] = useState(false);
return (
<PixelPopover open={open} onOpenChange={setOpen}>
<PixelPopover.Trigger>
<button type="button">Open popover</button>
</PixelPopover.Trigger>
<PixelPopover.Content aria-labelledby="popover-title">
<h3 id="popover-title" className="font-bold mb-1">
Popover
</h3>
<p className="text-sm">Floating content anchored to the trigger.</p>
</PixelPopover.Content>
</PixelPopover>
);
}

PIXELDRAWER

drawer
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelDrawer } from '@pxlkit/ui-kit';
export function Default() {
const [open, setOpen] = useState(false);
return (
<>
<button type="button" onClick={() => setOpen(true)}>
Open drawer
</button>
<PixelDrawer open={open} onOpenChange={setOpen} title="Settings">
<PixelDrawer.Header>
<span>Settings</span>
<button type="button" onClick={() => setOpen(false)}>
Close
</button>
</PixelDrawer.Header>
<PixelDrawer.Body>
<p>Drawer content goes here.</p>
</PixelDrawer.Body>
<PixelDrawer.Footer>
<button type="button" onClick={() => setOpen(false)}>
Done
</button>
</PixelDrawer.Footer>
</PixelDrawer>
</>
);
}

PIXELCOMMAND

command
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelCommand } from '@pxlkit/ui-kit';
export function Default() {
const [open, setOpen] = useState(false);
return (
<>
<button type="button" onClick={() => setOpen(true)}>
Open command palette
</button>
<PixelCommand
open={open}
onOpenChange={setOpen}
groups={[
{
heading: 'Actions',
items: [
{
id: 'new-file',
label: 'New file',
shortcut: 'Ctrl+N',
onSelect: () => setOpen(false),
},
{
id: 'open-file',
label: 'Open file…',
shortcut: 'Ctrl+O',
onSelect: () => setOpen(false),
},
{
id: 'save',
label: 'Save',
shortcut: 'Ctrl+S',
onSelect: () => setOpen(false),
},
],
},
{
heading: 'Navigation',
items: [
{
id: 'go-home',
label: 'Go to home',
keywords: ['dashboard', 'start'],
onSelect: () => setOpen(false),
},
{
id: 'go-settings',
label: 'Go to settings',
keywords: ['preferences', 'config'],
onSelect: () => setOpen(false),
},
],
},
]}
/>
</>
);
}

PIXELALERTDIALOG

alertdialog
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelAlertDialog } from '@pxlkit/ui-kit';
export function Default() {
const [open, setOpen] = useState(false);
return (
<div>
<button type="button" onClick={() => setOpen(true)}>
Open alert dialog
</button>
<PixelAlertDialog
open={open}
onOpenChange={setOpen}
title="Save changes?"
description="Your edits will be applied to the live document."
actionLabel="Save"
onAction={() => setOpen(false)}
/>
</div>
);
}

PIXELSHEET

sheet
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
import { useState } from 'react';
import { PixelSheet } from '@pxlkit/ui-kit';
export function Default() {
const [open, setOpen] = useState(false);
return (
<>
<button type="button" onClick={() => setOpen(true)}>
Open sheet
</button>
<PixelSheet
open={open}
onOpenChange={setOpen}
title="Quick actions"
description="Pick an action below"
>
<p>Sheet content goes here.</p>
<button type="button" onClick={() => setOpen(false)}>
Close
</button>
</PixelSheet>
</>
);
}

PIXELBOX

box
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Surface-aware container box.

import { PixelBox } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelBox tone="neutral" variant="solid" padding="md">
<p className="text-sm text-retro-muted">Surface-aware container box.</p>
</PixelBox>
);
}

PIXELSTACK

stack
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
First item
Second item
Third item
import { PixelStack } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelStack gap={4}>
<div className="text-sm text-retro-muted">First item</div>
<div className="text-sm text-retro-muted">Second item</div>
<div className="text-sm text-retro-muted">Third item</div>
</PixelStack>
);
}

PIXELCLUSTER

cluster
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
reacttypescripttailwindnextvite
import React from 'react';
import { PixelCluster } from '@pxlkit/ui-kit';
function Chip({ children }: { children: React.ReactNode }) {
return (
<span className="rounded border border-retro-border px-2 py-1 text-xs text-retro-text">
{children}
</span>
);
}
export function Default() {
return (
<PixelCluster>
<Chip>react</Chip>
<Chip>typescript</Chip>
<Chip>tailwind</Chip>
<Chip>next</Chip>
<Chip>vite</Chip>
</PixelCluster>
);
}

PIXELGRID

grid
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
One
Two
Three
Four
Five
Six
import React from 'react';
import { PixelGrid } from '@pxlkit/ui-kit';
function Cell({ children }: { children: React.ReactNode }) {
return (
<div className="border border-retro-border bg-retro-surface p-3 text-sm text-retro-text">
{children}
</div>
);
}
export function Default() {
return (
<PixelGrid cols={3} gap={4}>
<Cell>One</Cell>
<Cell>Two</Cell>
<Cell>Three</Cell>
<Cell>Four</Cell>
<Cell>Five</Cell>
<Cell>Six</Cell>
</PixelGrid>
);
}

PIXELEQUALHEIGHTGRID

equalheightgrid
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

One

Short copy.

Footer

Two

A longer body that forces the row to grow taller than the first card.

Footer

Three

Medium length copy here.

Footer
import { cn, PixelEqualHeightGrid } from '@pxlkit/ui-kit';
function Card({ title, body, className }: { title: string; body: string; className?: string }) {
return (
<div className={cn('border border-retro-border p-4', className)}>
<h3 className="text-sm font-semibold text-retro-text">{title}</h3>
<p className="text-sm text-retro-muted">{body}</p>
<div className="mt-2 text-xs text-retro-muted">Footer</div>
</div>
);
}
export function Default() {
return (
<PixelEqualHeightGrid cols={{ base: 1, sm: 3 }} gap={4}>
<Card title="One" body="Short copy." />
<Card title="Two" body="A longer body that forces the row to grow taller than the first card." />
<Card title="Three" body="Medium length copy here." />
</PixelEqualHeightGrid>
);
}

PIXELCENTER

center
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Centered content with the default max-width and page gutter.

import { PixelCenter } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelCenter>
<p className="text-sm text-retro-muted">
Centered content with the default max-width and page gutter.
</p>
</PixelCenter>
);
}

PIXELCONTAINER

container
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Default container — section landmark, xl max-width, lg rhythm.

import { PixelContainer } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelContainer>
<p className="text-sm text-retro-muted">Default container — section landmark, xl max-width, lg rhythm.</p>
</PixelContainer>
);
}

PIXELTWOCOLUMN

twocolumn
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
Left column
Right column
import { PixelTwoColumn } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelTwoColumn
left={<div className="text-sm text-retro-muted">Left column</div>}
right={<div className="text-sm text-retro-muted">Right column</div>}
/>
);
}

PIXELSECTIONHEADER

sectionheader
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Section: Build pixel-perfect interfaces

A retro-cinematic component kit with surface awareness and rhythm tokens.

import { PixelSectionHeader } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelSectionHeader
eyebrow="Section"
title="Build pixel-perfect interfaces"
description="A retro-cinematic component kit with surface awareness and rhythm tokens."
/>
);
}

PIXELBENTO

bento
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.
FeatureSpans 2x2 with a feature layout.
42Stats
Compact
WideSpans 2x1.
import { PixelBento, PixelBentoCell } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelBento columns={3} gap={4}>
<PixelBentoCell span="2x2" kind="feature" tone="cyan">
<strong>Feature</strong>
<span>Spans 2x2 with a feature layout.</span>
</PixelBentoCell>
<PixelBentoCell span="1x1" kind="stat" tone="green">
<strong>42</strong>
<span>Stats</span>
</PixelBentoCell>
<PixelBentoCell span="1x1" kind="compact" tone="gold">
<span>Compact</span>
</PixelBentoCell>
<PixelBentoCell span="2x1" kind="feature" tone="purple">
<strong>Wide</strong>
<span>Spans 2x1.</span>
</PixelBentoCell>
<PixelBentoCell span="1x1" kind="media" tone="neutral">
<div className="h-full w-full bg-retro-surface" />
</PixelBentoCell>
</PixelBento>
);
}

PIXELBENTOCELL

bentocell
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Feature cell

Span 2x1 with feature layout.

Active128
Compact
import { PixelBento, PixelBentoCell } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelBento columns={3} gap={4}>
<PixelBentoCell kind="feature" tone="neutral" span="2x1">
<h3 className="text-sm font-semibold">Feature cell</h3>
<p className="text-sm text-retro-muted">Span 2x1 with feature layout.</p>
</PixelBentoCell>
<PixelBentoCell kind="stat" tone="cyan" span="1x1">
<span className="text-xs text-retro-muted">Active</span>
<strong className="text-2xl">128</strong>
</PixelBentoCell>
<PixelBentoCell kind="compact" tone="green" span="1x1">
<span className="text-sm">Compact</span>
</PixelBentoCell>
</PixelBento>
);
}

PIXELSCROLLAREA

scrollarea
In @pxlkit/ui-kit, @pxlkit/ui-kit-vue and @pxlkit/ui-kit-angular. See the v2.2.0 changelog for release notes, or the full reference for props, accessibility, keyboard and the examples in React, Vue and Angular.

Scroll item 1

Scroll item 2

Scroll item 3

Scroll item 4

Scroll item 5

Scroll item 6

Scroll item 7

Scroll item 8

Scroll item 9

Scroll item 10

Scroll item 11

Scroll item 12

import { PixelScrollArea } from '@pxlkit/ui-kit';
export function Default() {
return (
<PixelScrollArea aria-label="Sample scrollable region" maxHeight={160}>
<div className="space-y-2 p-3">
{Array.from({ length: 12 }).map((_, i) => (
<p key={i} className="text-sm text-retro-muted">
Scroll item {i + 1}
</p>
))}
</div>
</PixelScrollArea>
);
}

ALL COMPONENTS (111) + PIXELTOAST DOCS

v2.0
PxlKitButtonPxlKitToastProviderPxlKitLocaleProviderPxlKitSurfaceProviderPixelOTPInput