# Charizard Design System (@hybr1d-tech/charizard) > The React 19 component library powering ZenAdmin (https://www.zenadmin.ai). ESM-only, > tree-shakeable named exports, TypeScript prop types included, styles injected on import. > Built on Zag.js state machines, TanStack Table v8, Zustand, react-day-picker and dnd-kit. Install: `pnpm add @hybr1d-tech/charizard` If your bundler strips CSS side effects: `import '@hybr1d-tech/charizard/styles.css'` Components needing router context (Button links, Breadcrumbs, TaskCards, Error pages) must render inside a react-router v8 router. This index lists the current generation of every component. Some are still exported under a V2-suffixed name (e.g. InputV2, ModalV2) — always import the exact name shown in the component's Import line. Superseded originals (Input, Modal, Checkbox, …) remain exported for backwards compatibility only; do not use them in new code. Human-browsable showcase with live demos of every component: https://ui.zenadmin.co/ Structured version of this index: https://ui.zenadmin.co/components.json Full markdown page for one component (description, imports, snippets, prop tables): https://ui.zenadmin.co/components/.md Release history: https://ui.zenadmin.co/#/changelog ## Actions ### Button Primary, secondary and tertiary buttons, icon-only buttons and grouped actions with menus. - Import: `import {Button} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/button - Markdown: https://ui.zenadmin.co/components/button.md ```tsx import {Button, BUTTON_VARIANT} from '@hybr1d-tech/charizard' ``` ```tsx import {Button, BUTTON_VARIANT} from '@hybr1d-tech/charizard' console.log('Item 1 clicked')}, {label: 'Disabled Item', onClick: () => {}, disabled: true}, ]} > Click me ``` ### SegmentedControl Mutually exclusive option switcher rendered as connected segments. - Import: `import {SegmentedControl} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/segmented-control - Markdown: https://ui.zenadmin.co/components/segmented-control.md ```tsx import {SegmentedControl} from '@hybr1d-tech/charizard' }, {label: 'Activity', value: 'activity', component: }, {label: 'Settings', value: 'settings', component: }, ]} /> ``` ```tsx ``` ## Forms & inputs ### Input Text input and textarea with labels, error handling, icons and adornments. - Import: `import {InputV2, TextareaV2, InputControlV2, LabelV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/input - Markdown: https://ui.zenadmin.co/components/input.md ```tsx import {InputV2, TextareaV2} from '@hybr1d-tech/charizard' ``` ```tsx import {InputControlV2, LabelV2, InputV2} from '@hybr1d-tech/charizard' Asset tag ``` ### Checkbox Checkbox with label, indeterminate and disabled states. - Import: `import {CheckboxV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/checkbox - Markdown: https://ui.zenadmin.co/components/checkbox.md ```tsx import {CheckboxV2} from '@hybr1d-tech/charizard' const [subscribed, setSubscribed] = useState(true) ``` ```tsx const allChecked = selected.length === devices.length const someChecked = selected.length > 0 && !allChecked setSelected(checked ? devices.map(d => d.id) : [])} /> ``` ### RadioGroup Single-choice radio group with horizontal and vertical layouts. - Import: `import {RadioGroupV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/radio-group - Markdown: https://ui.zenadmin.co/components/radio-group.md ```tsx import {RadioGroupV2} from '@hybr1d-tech/charizard' setShipping(value)} /> ``` ```tsx const [ownership, setOwnership] = useState('company') ``` ### Switch On/off toggle switch. - Import: `import {SwitchV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/switch - Markdown: https://ui.zenadmin.co/components/switch.md ```tsx import {SwitchV2} from '@hybr1d-tech/charizard' console.log(checked)} > Notify me on delivery ``` ```tsx const [mfa, setMfa] = useState(true) setMfa(checked)}> Require MFA for all users ``` ### Select Single and multi-select dropdown with search, sub-labels and creatable options. - Import: `import {SelectV2, CreatableSelectV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/select - Markdown: https://ui.zenadmin.co/components/select.md ```tsx import {SelectV2} from '@hybr1d-tech/charizard' setLaptop(value as string)} /> ``` ```tsx const [approvers, setApprovers] = useState([apiUsers[0].id]) approvers.includes(o.value))} onChange={value => setApprovers(value as string[])} /> ``` ### Selectors Multi-select option picker with custom option rendering. - Import: `import {SelectorsV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/selectors - Markdown: https://ui.zenadmin.co/components/selectors.md ```tsx import {SelectorsV2} from '@hybr1d-tech/charizard' console.log(value)} /> ``` ```tsx const [selectedValue, setSelectedValue] = useState('option1') setSelectedValue(newValue)} /> ``` ### Search Debounced search input with clear button and overflow handling. - Import: `import {SearchV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/search - Markdown: https://ui.zenadmin.co/components/search.md ```tsx import {SearchV2} from '@hybr1d-tech/charizard' ``` ```tsx const [query, setQuery] = useState('') ``` ### DatePicker Date and date-range picker built on react-day-picker, with quick-select presets. - Import: `import {DatePicker} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/date-picker - Markdown: https://ui.zenadmin.co/components/date-picker.md ```tsx import {DateRangePicker, useDateRangePicker} from '@hybr1d-tech/charizard' const {period, handleDateChange} = useDateRangePicker() date > new Date()} /> ``` ```tsx import {DatePicker} from '@hybr1d-tech/charizard' const [date, setDate] = React.useState() ``` ### TimePicker Time-of-day picker. - Import: `import {TimePicker} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/time-picker - Markdown: https://ui.zenadmin.co/components/time-picker.md ```tsx import {TimePicker} from '@hybr1d-tech/charizard' const [maintenanceAt, setMaintenanceAt] = useState() setMaintenanceAt(ts)} /> ``` ```tsx import {TimePicker, TIME_PICKER_FORMAT} from '@hybr1d-tech/charizard' setSyncAt(ts)} /> ``` ### ColorPicker Color picker with a preset palette. - Import: `import {ColorPicker} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/color-picker - Markdown: https://ui.zenadmin.co/components/color-picker.md ```tsx import {ColorPicker} from '@hybr1d-tech/charizard' setTagColor(color)} /> ``` ```tsx setBrandColor(color)} /> ``` ### Upload File upload dropzone with progress and file management. - Import: `import {Upload} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/upload - Markdown: https://ui.zenadmin.co/components/upload.md ```tsx import {DOCS_TYPE, Upload} from '@hybr1d-tech/charizard' console.log(files)} handleImageUpload={handleImageUpload} // presigned-URL flow in the real app acceptedFileTypes="image/png, image/jpeg, image/webp, application/pdf" addDocumentSubtitle="PDF, PNG, WEBP and JPEG." fileUploadLimit={2} uploadFileLimit={5} /> ``` ## Data display ### Table Batteries-included data table on TanStack Table v8: filters, sorting, search, pagination, row selection, expansion, column reordering and export. - Import: `import {Table} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/table - Markdown: https://ui.zenadmin.co/components/table.md ```tsx import {createColumnHelper} from '@tanstack/react-table' import {Table, TableDeviceCell, type TableFeatureSet} from '@hybr1d-tech/charizard' // Table v9 leads every generic with TFeatures. Pass charizard's TableFeatureSet so the // helper describes the same table builds — that is what makes per-column // options like \ ``` ### TaskCards Card list for task-style records with headers and pagination. - Import: `import {TaskCards} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/task-cards - Markdown: https://ui.zenadmin.co/components/task-cards.md ```tsx import {TaskCards} from '@hybr1d-tech/charizard' const headers = ['Task', 'Details', 'Status'] // Renders link/navigation affordances, so it must live under a react-router context. export function OpenTasks() { return } ``` ### Badge Small count or status badge. - Import: `import {Badge} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/badge - Markdown: https://ui.zenadmin.co/components/badge.md ```tsx import {Badge, BADGE_STATUS} from '@hybr1d-tech/charizard' Compliant Update pending Non-compliant ``` ```tsx import {Badge, BADGE_STATUS, BADGE_HIGHLIGHT} from '@hybr1d-tech/charizard' import infoIcon from './assets/info-circle.svg' Online Awaiting approval ``` ### Pill Rounded pill label. - Import: `import {Pill} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/pill - Markdown: https://ui.zenadmin.co/components/pill.md ```tsx import {Pill, PILL_STATUS} from '@hybr1d-tech/charizard' Procurement Delivered Awaiting quote Payment overdue ``` ### Tag Removable tag chip. - Import: `import {Tag} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/tag - Markdown: https://ui.zenadmin.co/components/tag.md ```tsx import {Tag, STATUS_MAP} from '@hybr1d-tech/charizard' ``` ```tsx import checkIcon from './assets/check.svg' ``` ### Status Colored status indicator with label. - Import: `import {Status} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/status - Markdown: https://ui.zenadmin.co/components/status.md ```tsx import {Status, STATUS_STATUS} from '@hybr1d-tech/charizard'
MDM enrolled
OS update pending
Agent unreachable
``` ```tsx
Onboarding complete
Order cancelled
``` ### Avatar User avatar with image fallback. - Import: `import {Avatar} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/avatar - Markdown: https://ui.zenadmin.co/components/avatar.md ```tsx import {Avatar} from '@hybr1d-tech/charizard' const user = { first_name: 'Priya', last_name: 'Nair', work_email: 'priya.nair@acme.io', profile_img_url: '...', } ``` ```tsx ``` ### UserChip Compact user identity chip (avatar + name). - Import: `import {UserChip} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/user-chip - Markdown: https://ui.zenadmin.co/components/user-chip.md ```tsx import {UserChip, USER_CHIP_STATUS} from '@hybr1d-tech/charizard' ``` ```tsx ``` ### UsersChip Overflow-aware chip for a set of users. - Import: `import {UsersChip} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/users-chip - Markdown: https://ui.zenadmin.co/components/users-chip.md ```tsx import {UsersChip, USER_CHIP_STATUS} from '@hybr1d-tech/charizard' const users = [ { first_name: 'Priya', last_name: 'Nair', work_email: 'priya.nair@acme.io', profile_img_url: '...', id: 'cea4d3ed-bc4b-4092-ba5d-8245a106e08d', }, // ... ] ``` ```tsx ``` ### Accordion Expandable content sections. - Import: `import {Accordion} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/accordion - Markdown: https://ui.zenadmin.co/components/accordion.md ```tsx import {Accordion} from '@hybr1d-tech/charizard' How do devices get enrolled into MDM?
New devices enroll automatically at first boot via zero-touch provisioning.
Which apps are installed by default?
The baseline bundle: browser, VPN client, password manager and the ZenAdmin agent.
``` ### Progress Progress bar. - Import: `import {Progress} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/progress - Markdown: https://ui.zenadmin.co/components/progress.md ```tsx import {Progress} from '@hybr1d-tech/charizard' , isError: false}, {label: 'Assign user', component: , isError: false}, {label: 'Review', component: , isError: false}, ]} onCancelClick={() => console.log('cancelled')} onFinalStepClick={() => console.log('submitted')} lastStepFooterContinueBtnText="Create order" /> ``` ### AsyncImage Image with async loading state and fallback. - Import: `import {AsyncImage} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/async-image - Markdown: https://ui.zenadmin.co/components/async-image.md ```tsx import {AsyncImage} from '@hybr1d-tech/charizard' ``` ```tsx ``` ### SVG Inline SVG renderer with CSS-filter coloring. - Import: `import {SVG} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/svg - Markdown: https://ui.zenadmin.co/components/svg.md ```tsx import {SVG} from '@hybr1d-tech/charizard' import searchIcon from './assets/search.svg' ``` ```tsx addRow()} /> ``` ## Overlays & feedback ### Modal Dialog with header, scrollable body, footer buttons and size variants. - Import: `import {ModalV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/modal - Markdown: https://ui.zenadmin.co/components/modal.md ```tsx import {ModalV2, Button, BUTTON_VARIANT, useDisclosure, type DialogFooterButtons} from '@hybr1d-tech/charizard' const {isOpen, onOpen, onClose} = useDisclosure() const buttons: DialogFooterButtons = [ {variant: BUTTON_VARIANT.SECONDARY, btnText: 'Cancel', onClick: onClose}, {variant: BUTTON_VARIANT.PRIMARY, btnText: 'Confirm', onClick: onClose}, ] Modal body content goes here. ``` ### Drawer Slide-in side panel that locks body scroll while open. - Import: `import {DrawerV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/drawer - Markdown: https://ui.zenadmin.co/components/drawer.md ```tsx import {DrawerV2, BUTTON_VARIANT, useDisclosure, type DialogFooterButtons} from '@hybr1d-tech/charizard' const {isOpen, onOpen, onClose} = useDisclosure() const buttons: DialogFooterButtons = [ {variant: BUTTON_VARIANT.SECONDARY, btnText: 'Cancel', onClick: onClose}, {variant: BUTTON_VARIANT.PRIMARY, btnText: 'Save', onClick: onClose}, ] Drawer content goes here. ``` ### Popover Anchored popover with trigger and content. - Import: `import {Popover} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/popover - Markdown: https://ui.zenadmin.co/components/popover.md ```tsx import { Popover, PopoverTrigger, PopoverContent, PopoverTitle, PopoverDescription, PopoverCloseButton, } from '@hybr1d-tech/charizard' Click me Popover title Anchored content with an arrow. Close ``` ### Tooltip Hover tooltip with placement and delay controls. - Import: `import {TooltipV2} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/tooltip - Markdown: https://ui.zenadmin.co/components/tooltip.md ```tsx import {TooltipV2, Button} from '@hybr1d-tech/charizard' Hover me} content="This is a tooltip" /> ``` ### Alert Inline alert banner in info, success, warning and error intents. - Import: `import {Alert} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/alert - Markdown: https://ui.zenadmin.co/components/alert.md ```tsx import {Alert, ALERT_TYPES} from '@hybr1d-tech/charizard' Alert header} body={

Supporting detail for the alert goes here.

} /> ``` ```tsx import {Alert, ALERT_TYPES, ALERT_ACTION_TYPES} from '@hybr1d-tech/charizard' const [showMore, setShowMore] = React.useState(false) Some devices are missing warranty info} body={

Expanded details are revealed by the chevron.

} showMore={showMore} setShowMore={setShowMore} /> ``` ### Toasts Toast notifications (success, error, info, warning) on react-toastify. - Import: `import {Toasts} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/toasts - Markdown: https://ui.zenadmin.co/components/toasts.md ```tsx import {toastSuccess, toastError, toastInfo, toastWarning} from '@hybr1d-tech/charizard' // Mount from react-toastify once at the app root, // then fire toasts from anywhere: toastSuccess({msg: 'Inventory item added'}) toastInfo({msg: 'Sync scheduled for tonight'}) toastWarning({msg: 'License expires in 7 days'}) toastError({msg: 'Could not reach the MDM server'}) ``` ```tsx toastSuccess({ msg: 'Successfully added inventory item', info: 'The device is now available to fulfill orders placed before today.', }) ``` ### Loader Loading spinners in multiple styles. - Import: `import {Loader} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/loader - Markdown: https://ui.zenadmin.co/components/loader.md ```tsx import {Loader, LOADER_VARIANT} from '@hybr1d-tech/charizard' ``` ### Skeleton Skeleton loading placeholders. - Import: `import {Skeleton} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/skeleton - Markdown: https://ui.zenadmin.co/components/skeleton.md ```tsx import {Skeleton} from '@hybr1d-tech/charizard' // Skeleton renders an animated span; give it dimensions via style or className. ``` ## Navigation & layout ### Tabs Tab switcher with panels. - Import: `import {Tabs} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/tabs - Markdown: https://ui.zenadmin.co/components/tabs.md ```tsx const [activeKey, setActiveKey] = React.useState('overview') {}}>

Overview pane

{}}>

Specifications pane

{}}>

Activity pane

``` ```tsx {}} > Billed every month. {}} > Billed once a year. ``` ### LayoutTabs Route-level tab navigation. - Import: `import {LayoutTabs} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/layout-tabs - Markdown: https://ui.zenadmin.co/components/layout-tabs.md ```tsx }, {label: 'Apps', value: 'apps', content: }, {label: 'Security', value: 'security', content: }, ]} /> ``` ```tsx const [current, setCurrent] = React.useState('open') setCurrent(value)} /> ``` ### Breadcrumbs Router-aware breadcrumb trail. - Import: `import {Breadcrumbs} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/breadcrumbs - Markdown: https://ui.zenadmin.co/components/breadcrumbs.md ```tsx // in the app shell (rendered once): // in a page component: useBreadcrumbs([ {label: 'Home', href: '/'}, {label: 'Tabs', href: '/components/tabs'}, {label: 'Breadcrumbs', active: true}, ]) ``` ```tsx useBreadcrumbs([ {label: 'Home', href: '/'}, {label: 'Tabs', href: '/components/tabs'}, {label: 'LayoutTabs', href: '/components/layout-tabs'}, {label: 'EmptyState', href: '/components/empty-state'}, {label: 'Breadcrumbs', active: true}, ]) ``` ### EmptyState Empty-state placeholder with illustration and actions. - Import: `import {EmptyState} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/empty-state - Markdown: https://ui.zenadmin.co/components/empty-state.md ```tsx ``` ```tsx ``` ### Error Full-page error layouts (404, 500). - Import: `import {Error} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/error - Markdown: https://ui.zenadmin.co/components/error.md ```tsx // route-level usage: renders Error404 at ./404 (and as the index) and Error500 at ./500 } /> // or compose the pieces directly: ``` ```tsx ``` ### Helmet Document head / page title manager. - Import: `import {Helmet} from '@hybr1d-tech/charizard'` - Demos: https://ui.zenadmin.co/#/components/helmet - Markdown: https://ui.zenadmin.co/components/helmet.md ```tsx ``` ```tsx {/* extra head tags as children */} ```