@bytelyst/ui (0.2.2)
Installation
@bytelyst:registry=npm install @bytelyst/ui@0.2.2"@bytelyst/ui": "0.2.2"About this package
@bytelyst/ui
Shared component library for the ByteLyst ecosystem. Built with Radix UI primitives, Lucide icons, and CSS custom properties from @bytelyst/design-tokens.
Install
pnpm add @bytelyst/ui
Peer dependencies: react, react-dom.
Components
The package offers a cohesive, token-driven web toolkit: controls and fields, overlays and menus,
navigation and layout primitives, data display, feedback, and loading states. Import from the root
for application use, or use a documented subpath such as @bytelyst/ui/button when a consumer needs
to keep its dependency boundary explicit.
The main exports include Button, IconButton, Input, Textarea, Select, Checkbox,
RadioGroup, Switch, Combobox, SearchInput, TagInput, Field, Label, Card, Panel,
Surface, Section, PageHeader, Sidebar, Tabs, SegmentedControl, Modal, ConfirmDialog,
Drawer, Tooltip, DropdownMenu, ActionMenu, Toast, Badge, StatusBadge, AlertBanner,
EmptyState, StateView, Skeleton, LoadingSpinner, LoadingDots, DataList, DataTable,
and supporting composition primitives.
Button
5 variants (primary, secondary, ghost, destructive, outline), 3 sizes, loading state with spinner.
import { Button } from '@bytelyst/ui';
<Button variant="primary" size="md" loading={saving}>Save</Button>
<Button variant="destructive" onClick={onDelete}>Delete</Button>
<Button variant="ghost" size="sm">Cancel</Button>
Input
Text input with error/success states. Supports aria-invalid automatically when error is truthy.
import { Input } from '@bytelyst/ui';
<Input placeholder="Email" type="email" />
<Input error="Required field" />
Textarea
Auto-resize textarea with error states.
import { Textarea } from '@bytelyst/ui';
<Textarea placeholder="Description" rows={4} />;
Select
Styled <select> with keyboard navigation.
import { Select } from '@bytelyst/ui';
<Select
options={[
{ value: 'a', label: 'Option A' },
{ value: 'b', label: 'Option B' },
]}
value={selected}
onChange={setSelected}
/>;
Modal / Dialog
Radix @radix-ui/react-dialog with focus trap, Esc close, and aria-modal.
import { Modal } from '@bytelyst/ui';
<Modal open={isOpen} onOpenChange={setOpen} title="Edit item">
<p>Modal content here</p>
</Modal>;
ConfirmDialog
Radix AlertDialog for destructive/warning confirmations. Supports async onConfirm.
import { ConfirmDialog } from '@bytelyst/ui';
<ConfirmDialog
open={showConfirm}
onOpenChange={setShowConfirm}
title="Delete item?"
description="This action cannot be undone."
onConfirm={handleDelete}
variant="destructive"
/>;
Toast
4 types (success, error, warning, info), auto-dismiss, role="alert". Use ToastProvider in your root layout and toast() anywhere.
import { ToastProvider, toast } from '@bytelyst/ui';
// In providers.tsx
<ToastProvider>{children}</ToastProvider>;
// Anywhere in app
toast('Saved successfully', 'success');
toast('Something went wrong', 'error');
Card
Container with default, elevated, and interactive variants. Includes CardHeader, CardTitle, CardDescription sub-components.
import { Card, CardHeader, CardTitle, CardDescription } from '@bytelyst/ui';
<Card>
<CardHeader>
<CardTitle>Dashboard</CardTitle>
<CardDescription>Overview of your data</CardDescription>
</CardHeader>
{children}
</Card>;
Badge
Status/count/risk-level badges, color-coded by semantic tokens.
import { Badge } from '@bytelyst/ui';
<Badge variant="success">Active</Badge>
<Badge variant="danger">Critical</Badge>
<Badge variant="warning" count={5} />
EmptyState
Placeholder for empty lists with icon, description, and optional CTA.
import { EmptyState } from '@bytelyst/ui';
<EmptyState
icon={<FileText size={48} />}
title="No items yet"
description="Create your first item to get started."
action={<Button onClick={onCreate}>Create</Button>}
/>;
Label
Styled form label.
import { Label } from '@bytelyst/ui';
<Label htmlFor="email">Email address</Label>;
Separator
Horizontal/vertical divider.
import { Separator } from '@bytelyst/ui';
<Separator />
<Separator orientation="vertical" />
Sidebar
Responsive collapsible sidebar with mobile toggle, overlay, and navigation items.
import { Sidebar, SidebarItem } from '@bytelyst/ui';
<Sidebar
collapsed={collapsed}
onToggle={() => setCollapsed(!collapsed)}
header={<span>MyApp</span>}
footer="v1.0.0"
>
<SidebarItem href="/dashboard" label="Dashboard" icon={<Home size={18} />} active />
<SidebarItem href="/settings" label="Settings" icon={<Settings size={18} />} />
</Sidebar>;
StatCard
Dashboard metric card with trend indicator.
import { StatCard } from '@bytelyst/ui';
<StatCard label="Total Users" value="1,234" trend="up" trendValue="+12%" />
<StatCard label="Errors" value={42} trend="down" trendValue="-8%" icon={<AlertCircle />} />
LoadingSpinner
Accessible loading indicator with aria-busy and prefers-reduced-motion support.
import { LoadingSpinner } from '@bytelyst/ui';
<LoadingSpinner size="md" label="Loading data…" />
<LoadingSpinner size="sm" label="" /> {/* spinner only, no text */}
Design Token Integration
All components use CSS custom properties with --bl- prefix and sensible fallbacks. Override them per-product:
:root {
--bl-accent: var(--jj-accent); /* JarvisJr */
--bl-surface-card: var(--fm-surface); /* FlowMonk */
}
Accessibility
Every component includes:
focus-visiblering styles- ARIA attributes (
aria-label,aria-modal,aria-busy,aria-invalid,aria-current) - Keyboard navigation (Esc to close, Tab focus trap in modals)
prefers-reduced-motionrespected via Tailwind'sanimate-spin
Storybook
pnpm --filter @bytelyst/ui storybook
Storybook is configured with @storybook/addon-a11y for automated accessibility checks.
Dependencies
Dependencies
| ID | Version |
|---|---|
| @radix-ui/react-alert-dialog | ^1.1.0 |
| @radix-ui/react-checkbox | ^1.3.0 |
| @radix-ui/react-dialog | ^1.1.0 |
| @radix-ui/react-dropdown-menu | ^2.1.0 |
| @radix-ui/react-radio-group | ^1.3.0 |
| @radix-ui/react-slot | ^1.1.0 |
| @radix-ui/react-switch | ^1.2.0 |
| @radix-ui/react-tabs | ^1.1.0 |
| @radix-ui/react-tooltip | ^1.2.0 |
| clsx | ^2.1.0 |
| lucide-react | ^0.460.0 |
Development Dependencies
| ID | Version |
|---|---|
| @storybook/addon-a11y | ^8.5.0 |
| @storybook/addon-essentials | ^8.5.0 |
| @storybook/react | ^8.5.0 |
| @storybook/react-vite | ^8.5.0 |
| @tailwindcss/vite | 4.2.0 |
| @testing-library/react | ^16.3.2 |
| @types/react | ^19.0.0 |
| @types/react-dom | ^19.0.0 |
| happy-dom | ^20.9.0 |
| react | ^19.2.4 |
| react-dom | ^19.2.4 |
| storybook | ^8.5.0 |
| tailwindcss | 4.2.0 |
| typescript | ^5.7.0 |
| vite | ^6.0.0 |
| vitest | ^4.0.18 |
Peer Dependencies
| ID | Version |
|---|---|
| react | ^18.0.0 || ^19.0.0 |
| react-dom | ^18.0.0 || ^19.0.0 |