PXLKIT UI KIT
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.
Components
111
Icon Packs
6
Design Tokens
6 tones
Fully Custom
100%
GETTING STARTED
Three steps and you're rendering. Install @pxlkit/ui-kit, import its stylesheet alongside Tailwind, and pull components from the same package. Every primitive accepts the shared , size, and surface contract — so what you learn on applies to , , and the other 108.
// 1. Setup your Tailwind CSS file (e.g., index.css)// @import "tailwindcss";// @import "@pxlkit/ui-kit/styles.css";// @source "../node_modules/@pxlkit/ui-kit";// 2. Import components in your React appimport { PixelButton, PixelCard, PixelInput } from '@pxlkit/ui-kit';import { PxlKitIcon } from '@pxlkit/core';import { Trophy } from '@pxlkit/gamification';import { Search } from '@pxlkit/ui';// Button with icon<PixelButton tone="green" iconLeft={<PxlKitIcon icon={Trophy} size={16} />}> Create Quest</PixelButton>// Input with icon<PixelInput label="Search" icon={<PxlKitIcon icon={Search} size={16} />} placeholder="Find icons..."/>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.
| Prop | Type | Default | Description |
|---|---|---|---|
| tone | "green" | "cyan" | "gold" | "red" | "purple" | "pink" | "neutral" | varies | Color 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. |
| disabled | boolean | false | Standard HTML disabled state — applies to every interactive component (buttons, inputs, switches, sliders, segmented, etc.). |
| iconLeft / iconRight | ReactNode | — | Icon slots flanking the label. Accepted by PixelButton; PxlKitButton/PixelSplitButton use the single `icon` slot. Standalone inputs use the `icon` prop instead. |
| label | string | — | Accessible label for inputs/controls (PixelInput, PixelSelect, PixelCheckbox, PixelSwitch, PixelSlider, PixelRadioGroup, …). Buttons use `children` for their visible text, not `label`. |
| children | ReactNode | — | Required for container components (PixelCard, PixelModal, PixelTooltip, animations, etc.). Listed here once; not repeated in each table. |
| className | string | — | Extra CSS class names merged onto the outer element. |
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-body
Surfaces
Background
--retro-bg
Surface
--retro-surface
Card
--retro-card
Border
--retro-border
SURFACE SYSTEM
v1.4.0Every 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)
surface="linear"
Every component also accepts `surface` directly
Every UI-kit component (PixelButton, PixelInput, PixelCard, …) exposes a surface?: "pixel" | "linear" prop that overrides the nearest provider. Use it when you need a single button in linear mode inside an otherwise pixel-mode page.
import { PxlKitSurfaceProvider, PixelButton, PixelCard } from '@pxlkit/ui-kit';// === GLOBAL toggle: wrap your whole app once ===export default function RootLayout({ children }) { return ( <html> <body> <PxlKitSurfaceProvider surface="linear"> {children} </PxlKitSurfaceProvider> </body> </html> );}// === 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.0PxlKit 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
| Input | English Uppercase | Turkish Uppercase | Note |
|---|---|---|---|
| i | I | İ (U+0130) | Dotted uppercase İ in Turkish |
| ı (U+0131) | I | I | Dotless ı is unique to Turkish |
| istanbul | ISTANBUL | İSTANBUL | Complete word difference |
Live Demo — Turkish vs English
ISTANBUL IŞLEMLERI
İSTANBUL İŞLEMLERİ
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-body)
Ç Ğ İ Ö Ş Ü
ç ğ ı ö ş ü
Turkish Pangram (font-pixel)
Pijamalı hasta yağız şoföre çabucak güvendi
// === STEP 1: Install & import ===import { PxlKitLocaleProvider } from '@pxlkit/ui-kit';// === STEP 2: Wrap your app (React / Next.js) ===// For a standard React app (Vite, CRA, etc.):function App() { return ( <PxlKitLocaleProvider locale="tr"> <MyApp /> </PxlKitLocaleProvider> );}// For Next.js App Router — also set lang on <html>:// app/layout.tsxexport default function RootLayout({ children }) { return ( <html lang="tr"> <body> <PxlKitLocaleProvider locale="tr"> {children} </PxlKitLocaleProvider> </body> </html> );}// === STEP 3: Google Fonts — ensure 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 generate the URL dynamically:import { buildGoogleFontsUrl } from '@pxlkit/ui-kit';const fontsUrl = buildGoogleFontsUrl('tr');// → includes &subset=latin,latin-ext// === STEP 4: Use locale-aware text in custom components ===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"Important: CSS text-transform
CSS text-transform: uppercase is automatically locale-aware when the lang attribute is set. PxlKitLocaleProvider sets lang on a wrapper div. For full page coverage, also set lang="tr" on your <html> tag.
All three fonts support Turkish
Press Start 2P, Inter, and JetBrains Mono all include Latin Extended characters (ğ, Ğ, ı, İ, ş, Ş, ç, Ç, ö, Ö, ü, Ü). The latin-ext subset in the Google Fonts URL ensures these glyphs are downloaded.
PIXELINPUT
input<PixelInput label="Search" icon={<PxlKitIcon icon={Search} size={16} />} placeholder="Find components..." tone="cyan"/><PixelInput label="Email" error="Invalid email address" />PIXELPASSWORDINPUT
passwordinput<PixelPasswordInput label="Password" placeholder="Enter your password" />PIXELTEXTAREA
textareaFieldShell wrapper as .<PixelTextarea label="Bio" placeholder="Tell us about yourself..." />PIXELSELECT
select<PixelSelect label="Icon Pack" value={pack} onChange={setPack} options={[ { value: 'ui', label: 'UI' }, { value: 'gamification', label: 'Gamification' }, { value: 'social', label: 'Social' }, ]}/>PIXELCHECKBOX
checkbox<PixelCheckbox label="Enable animations" checked={enabled} onChange={setEnabled} tone="green"/>PIXELRADIOGROUP
radiogroup<PixelRadioGroup label="Framework" value={framework} onChange={setFramework} options={[ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, { value: 'svelte', label: 'Svelte' }, ]}/>PIXELSWITCH
switch<PixelSwitch label="Auto refresh" checked={on} onChange={setOn} />PIXELSLIDER
slider<PixelSlider label="Volume" value={vol} onChange={setVol} min={0} max={100} /><PixelSlider label="Opacity" value={opacity} onChange={setOpacity} tone="gold" />PIXELSEGMENTED
segmentedLayout density
<PixelSegmented label="Density" value={density} onChange={setDensity} options={[ { value: 'compact', label: 'Compact' }, { value: 'comfortable', label: 'Comfortable' }, ]}/>PIXELCARD
cardSocial Pack
<PixelCard title="Gamification" icon={<PxlKitIcon icon={Trophy} size={16} />} footer={<PixelButton tone="gold" size="sm">Use Pack</PixelButton>}> RPG icons, rewards, and game UI elements.</PixelCard>PIXELSTATCARD
statcardTotal Icons
204
+12 new
Components
111
100% typed
Downloads
8.2k
+24%
Stars
1.4k
trending
<PixelStatCard label="Downloads" value="12.4k" tone="green" trend="+15% this week" />PIXELTABLE
table| Component | Category | Status |
|---|---|---|
| PixelButton | Actions | Stable |
| PixelSelect | Inputs | Stable |
| PixelTable | Data Display | New |
| PixelAvatar | Data Display | New |
| PixelSkeleton | Feedback | New |
<PixelTable columns={[ { key: 'name', header: 'Component' }, { key: 'category', header: 'Category' }, { key: 'status', header: 'Status' }, ]} data={[ { name: 'PixelButton', category: 'Actions', status: <PixelBadge tone="green">Stable</PixelBadge> }, { name: 'PixelTable', category: 'Data', status: <PixelBadge tone="gold">New</PixelBadge> }, ]}/>PIXELAVATAR
avatar<PixelAvatar name="Joangel De La Rosa" tone="green" /><PixelAvatar name="AI Bot" tone="purple" size="lg" />PIXELBADGE
badge<PixelBadge tone="green">Stable</PixelBadge><PixelBadge tone="gold">Beta</PixelBadge><PixelBadge tone="red">Deprecated</PixelBadge>PIXELCHIP
chip<PixelChip label="react" tone="cyan" /><PixelChip label="removable" tone="gold" onRemove={() => {}} />PIXELTEXTLINK
textlink<a> when href is provided, otherwise as <button>. Supports all anchor and button attributes via spread props.<PixelTextLink href="/docs" tone="cyan">Documentation</PixelTextLink><PixelTextLink tone="gold" onClick={() => alert('clicked')}>Action Link</PixelTextLink>PIXELCODEINLINE
codeinlineUse useState for local state, PxlKitIcon for icons, green gold red neutral
<PixelCodeInline tone="cyan">useState</PixelCodeInline><PixelCodeInline tone="purple">PxlKitIcon</PixelCodeInline>PIXELKBD
kbd<PixelKbd>Ctrl</PixelKbd> + <PixelKbd>K</PixelKbd><PixelKbd>⌘</PixelKbd> + <PixelKbd>Shift</PixelKbd> + <PixelKbd>P</PixelKbd>PIXELCOLORSWATCH
colorswatchGreen
--retro-green
Cyan
--retro-cyan
Gold
--retro-gold
Red
--retro-red
Purple
--retro-purple
<PixelColorSwatch name="Green" cssVar="--retro-green" /><PixelColorSwatch name="Cyan" cssVar="--retro-cyan" />PIXELALERT
alertBuild Success
Package compiled and DTS types generated.
Warning
Some components still need visual fine-tuning review.
Breaking Change
PixelSelect API changed from native to custom dropdown in v2.0.
Tip
Use the tone prop to match your alert to the appropriate severity level.
<PixelAlert tone="green" icon={<PxlKitIcon icon={CheckCircle} size={16} />} title="Build Success" message="Package compiled successfully." action={<PixelButton tone="green" size="sm">View Logs</PixelButton>}/>PIXELPROGRESS
progress<PixelProgress value={72} tone="green" label="Upload Progress" />PIXELSKELETON
skeleton<PixelSkeleton width="200px" height="1rem" /><PixelSkeleton width="40px" height="40px" rounded />PIXELEMPTYSTATE
emptystateNo results found
Adjust your filters or create a new custom component for this kit.
<PixelEmptyState title="No results" description="Try adjusting your search or filters." icon={<PxlKitIcon icon={Search} size={20} />} action={<PixelButton tone="green">Reset Filters</PixelButton>}/>PIXELTOAST
toast<PixelToast> component shipped from @pxlkit/core. It renders one toast at a fixed position; you control visibility and lifecycle. For most apps you'll want the useToast() hook below — it stacks multiple toasts and handles timers for you. The old /toast route redirects to this section.Detailed integration docs are also available in /docs#toast-notifications.
import { useToast } from '@/components/ToastProvider';import { CheckCircle, WarningTriangle } from '@pxlkit/feedback';import { FireSword } from '@pxlkit/gamification';function SaveButton() { const { toast, success, warning } = useToast(); return ( <> <PixelButton onClick={() => success('SAVED', 'Changes synced to server', CheckCircle)} > Save </PixelButton> <PixelButton onClick={() => toast({ tone: 'warning', title: 'LOW HEALTH', message: 'Use a potion now', position: 'bottom-right', duration: 3500, animatedIcon: FireSword, }) } > Show Warning Toast </PixelButton> </> );}USETOAST()
usetoast()<PixelToast> instances. Mount the matching <ToastProvider> once at the root (this site does it in layout.tsx). The hook's methods auto-handle ids, timers, and unmount — you only worry about the message. Returns the API listed below.Implementation lives at apps/web/src/components/ToastProvider.tsx in this repo. Copy that file (or write your own equivalent) into your project to get the multi-toast stack on top of the low-level <PixelToast> primitive documented above.
// 1. Mount the provider once at the rootimport { ToastProvider } from '@/components/ToastProvider';export default function RootLayout({ children }) { return ( <html> <body> <ToastProvider> {children} </ToastProvider> </body> </html> );}// 2. Anywhere inside, call useToast() and use itimport { useToast } from '@/components/ToastProvider';import { CheckCircle, WarningTriangle } from '@pxlkit/feedback';import { FireSword } from '@pxlkit/gamification';function SaveButton() { const { toast, success } = useToast(); return ( <> <PixelButton onClick={() => success('SAVED', 'Changes synced', CheckCircle)}> Save </PixelButton> <PixelButton onClick={() => toast({ tone: 'warning', title: 'LOW HEALTH', message: 'Use a potion now', position: 'bottom-right', duration: 3500, animatedIcon: FireSword, }) } > Show Warning Toast </PixelButton> </> );}PIXELTABS
tabs<PixelTabs items={[ { id: 'overview', label: 'Overview', content: '...' }, { id: 'api', label: 'API', content: '...' }, { id: 'tokens', label: 'Tokens', content: '...' },]} />PIXELACCORDION
accordion<PixelAccordion items={[ { id: '1', title: 'How to use icons', content: '...' }, { id: '2', title: 'Custom themes', content: '...' },]} />PIXELCOLLAPSIBLE
collapsibleThis panel starts expanded. Click the label to collapse it.
<PixelCollapsible label="Show details"> <p>Hidden content revealed on toggle.</p></PixelCollapsible><PixelCollapsible label="Open by default" defaultOpen tone="green"> <p>Visible from the start.</p></PixelCollapsible>PIXELPAGINATION
pagination<PixelPagination page={page} total={5} onChange={setPage} />PIXELMODAL
modalconst [open, setOpen] = useState(false);<PixelButton onClick={() => setOpen(true)}>Open Modal</PixelButton><PixelModal open={open} title="Confirm Action" onClose={() => setOpen(false)}> <p>Are you sure you want to proceed?</p> <PixelButton tone="green" onClick={() => setOpen(false)}>Confirm</PixelButton></PixelModal>PIXELTOOLTIP
tooltip<PixelTooltip content="Edit this item" position="top"> <PxlKitButton label="Edit" icon={<PxlKitIcon icon={Edit} size={16} />} /></PixelTooltip>PIXELDROPDOWN
dropdown<PixelDropdown label="Actions" items={[ { value: 'copy', label: 'Copy snippet' }, { value: 'preview', label: 'Open preview' }, { value: 'delete', label: 'Delete item' }, ]} onSelect={(v) => console.log(v)}/>PIXELSECTION
sectionEXAMPLE SECTION
This is a wrapped content area with border and padding.
<PixelSection title="Actions" subtitle="Interactive button components."> {children}</PixelSection>PIXELDIVIDER
divider<PixelDivider /><PixelDivider label="Section" tone="green" spacing="lg" />PIXELBAREINPUT
bareinput<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 .
<PixelBareInput type="text" placeholder="Unstyled input..." className="border px-2 py-1" />PIXELBARETEXTAREA
baretextarea<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 .
<PixelBareTextarea rows={3} placeholder="Unstyled textarea..." className="border px-2 py-1 w-full" />TRIGGER MODES
all animationsEvery animation component accepts a trigger prop that controls when it plays. The default "mount" mode preserves backward compatibility — the animation fires on render.
Plays immediately on render (default).
Plays while the pointer is over the element.
Plays once per click. Re-click to replay.
Plays while the element has focus-within.
Plays when scrolled into the viewport (IntersectionObserver).
Controlled mode — true = playing, false = idle.
// 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 stateconst [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
CLICK
HOVER
PIXELFADEIN
fadeintrigger to control when it fires — e.g. "inView" for scroll-triggered reveals. Combines well with for staggered entrances.Faded In
<PixelFadeIn duration={400} delay={0} easing="ease-out"> <PixelCard title="Hello World">Faded in!</PixelCard></PixelFadeIn>// Scroll-triggered fade<PixelFadeIn trigger="inView" duration={600}> <p>I appear when scrolled into view</p></PixelFadeIn>PIXELSLIDEIN
slideindistance and pacing using easing. Complements .<PixelSlideIn from="down" duration={350} distance={14} easing="ease-out"> <PixelButton tone="green">Slid In</PixelButton></PixelSlideIn>// Staggered list{items.map((item, i) => ( <PixelSlideIn key={item} from="right" delay={i * 80}> <PixelCard title={item} /> </PixelSlideIn>))}PIXELPULSE
pulseCPU
87%
<PixelPulse duration={2000}> <PixelBadge tone="red">Live</PixelBadge></PixelPulse>PIXELBOUNCE
bounceduration and stop it with repeat=1.<PixelBounce duration={800}> <PxlKitIcon icon={Trophy} size={24} /></PixelBounce>// Finite bounce<PixelBounce duration={600} repeat={3}> <PixelBadge tone="gold">+100 XP</PixelBadge></PixelBounce>PIXELFLOAT
float<PixelFloat distance={8} duration={2400}> <PxlKitIcon icon={Star} size={20} /></PixelFloat>PIXELSHAKE
shakerepeat low to avoid visual fatigue. Often paired with .<PixelShake duration={450} repeat={2} distance={3}> <PixelBadge tone="red">Invalid Input</PixelBadge></PixelShake>PIXELROTATE
rotatedirection to reverse or alternate spin behavior for loading indicators and decorative accents.<PixelRotate duration={1800} direction="normal" repeat="infinite"> <PxlKitIcon icon={Gear} size={22} /></PixelRotate>PIXELZOOMIN
zoominPack Ready
<PixelZoomIn duration={320} startScale={0.9}> <PixelCard title="Quick Reveal">Zoomed entrance</PixelCard></PixelZoomIn>PIXELFLICKER
flickerSIGNAL LOCKED
<PixelFlicker duration={2200}> <p className="font-pixel text-retro-cyan">SIGNAL LOCKED</p></PixelFlicker>PIXELTYPEWRITER
typewriter<PixelTypewriter text="Hello, World!" speed={60} tone="green" /><PixelTypewriter text="// loading system..." speed={40} delay={800} tone="cyan" cursor />PIXELGLITCH
glitchtrigger, tune speed and intensity.ERROR
2500ms / 4px
CORRUPT
1800ms / 5px
badge / 3px
PXLKIT
2200ms / 6px
<PixelGlitch trigger="hover" duration={3000} intensity={4}> <h1 className="font-pixel text-retro-green">SYSTEM ERROR</h1></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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import { useState } from 'react';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' },];const GROUPED = [ { value: 'us', label: 'United States', group: 'Americas' }, { value: 've', label: 'Venezuela', group: 'Americas' }, { value: 'mx', label: 'Mexico', group: 'Americas' }, { value: 'es', label: 'Spain', group: 'Europe' }, { value: 'fr', label: 'France', group: 'Europe' }, { value: 'de', label: 'Germany', group: 'Europe' }, { value: 'jp', label: 'Japan', group: 'Asia' }, { value: 'kr', label: 'South Korea', group: 'Asia' },];export function Default() { return ( <PixelCombobox label="Fruit" options={FRUITS} placeholder="Pick a fruit" hint="Type to filter" /> );}PIXELMULTISELECT
multiselect@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.'use client';import { useForm } from 'react-hook-form';import { PixelForm } from '@pxlkit/ui-kit';import { 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import { useState } from 'react';import { PixelDateRangePicker, 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import React, { 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import { PxlKitIcon } from '@pxlkit/core';import { Heart } from '@pxlkit/gamification';import { PixelStarRating } from '@pxlkit/ui-kit';export function Default() { return <PixelStarRating value={4} />;}PIXELICONFRAME
iconframe@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import { PixelIconFrame } from '@pxlkit/ui-kit';const Glyph = () => ( <span style={{ fontFamily: 'monospace', fontWeight: 700 }}>{'>_'}</span>);const Dot = () => ( <span style={{ width: 6, height: 6, borderRadius: 9999, background: 'currentColor', display: 'inline-block' }} />);export function Default() { return <PixelIconFrame icon={<Glyph />} />;}PIXELDATATABLE
datatable@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.| Alice | Engineer | active |
| Bob | Designer | idle |
| Carol | PM | active |
| Dan | Engineer | active |
| Eve | Designer | idle |
import * as React from 'react';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} />;}PIXELCAROUSEL
carousel@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import { PixelCarousel } from '@pxlkit/ui-kit';function Slide({ label, tone }: { label: string; tone: string }) { return ( <div className="flex h-32 items-center justify-center border border-retro-border bg-retro-surface text-retro-text" style={{ background: tone }} > <span className="text-xs">{label}</span> </div> );}export function Default() { return ( <PixelCarousel aria-label="Featured items"> <PixelCarousel.Item> <Slide label="Slide 1" tone="rgba(14,165,233,0.15)" /> </PixelCarousel.Item> <PixelCarousel.Item> <Slide label="Slide 2" tone="rgba(168,85,247,0.15)" /> </PixelCarousel.Item> <PixelCarousel.Item> <Slide label="Slide 3" tone="rgba(34,197,94,0.15)" /> </PixelCarousel.Item> </PixelCarousel> );}PIXELTIMELINE
timeline@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.- Order placed09:00Confirmation email sent.
- Packed11:20At the warehouse.
- 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.Users
1,284
Revenue
$12.4k
Active
312
import { PixelStatGroup } from '@pxlkit/ui-kit';import { 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import { PixelAvatarGroup } from '@pxlkit/ui-kit';import { 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import { PixelBadgeGroup } from '@pxlkit/ui-kit';import { 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import React, { useState } from 'react';import { PixelChipGroup } from '@pxlkit/ui-kit';import { PixelChip } from '@pxlkit/ui-kit';// PixelChipGroup reads `value` off each child via children inspection; the chip// component itself forwards unknown attrs, so we use a tiny shim here so the// example reads naturally without leaking a `value` prop into PixelChipProps.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.Realtime sync
Push every keystroke to peers via WebSockets — under 50ms p95.
import { PixelFeatureCard } from '@pxlkit/ui-kit';const PixelIcon = ( <svg viewBox="0 0 8 8" shapeRendering="crispEdges" fill="currentColor" className="h-4 w-4"> <rect x="3" y="0" width="2" height="8" /> <rect x="0" y="3" width="8" height="2" /> </svg>);export function Default() { return ( <PixelFeatureCard title="Realtime sync" description="Push every keystroke to peers via WebSockets — under 50ms p95." /> );}PIXELPRICINGCARD
pricingcard@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.Starter
Everything you need to ship your first project.
- 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.“pxlkit dropped the polish ceiling. Our marketing site felt like a product launch in a week.”
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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.Pixel-perfect retro UI for modern web
A component kit that brings cinematic, terminal-grade interfaces to React apps.
import React from 'react'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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import React from 'react'import { PixelSpinner } from '@pxlkit/ui-kit'export function Default() { return <PixelSpinner />}PIXELSTEPPER
stepper@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import { useState } from 'react';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> );}PIXELPORTAL
portal@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.import React from 'react'import { PixelPortal } from '@pxlkit/ui-kit'export function Default() { return ( <PixelPortal> <div>Portaled content (renders into document.body after mount)</div> </PixelPortal> )}PIXELPOPOVER
popover@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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-fg"> {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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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-fg"> {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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.One
Short copy.
Two
A longer body that forces the row to grow taller than the first card.
Three
Medium length copy here.
import { PixelEqualHeightGrid } from '@pxlkit/ui-kit';function Card({ title, body }: { title: string; body: string }) { return ( <div className="border border-retro-border p-4"> <h3 className="text-sm font-semibold text-retro-fg">{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={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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.Feature cell
Span 2x1 with feature layout.
import { PixelBento } from '@pxlkit/ui-kit';import { 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@pxlkit/ui-kit. See the v2.0.1 changelog for release notes, or the full reference for props, accessibility, and keyboard docs generated from the component manifest.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> );}