kenos UIBeta

Headless primitives
for React.

Composable, accessible, unstyled primitives — Button, Date Picker, and more. Start with structure. Finish with style.

  • Unstyled by design
  • WAI-ARIA compliant
  • Fully composable
  • React 19 compatible
primitives
ButtonavailableDate PickeravailableSelectavailableComboboxavailable

live

See what ships in the box

Real primitives — unstyled by default. Every demo below is running the actual package, not a mock.

Get started

clicks: 0

Button

Unstyled pressable with data-hovered, data-pressed, and data-focused — style every state yourself.

Documentation →

Date Picker

Segmented input, popover calendar, range and multiple selection — one composable API.

Documentation →

Select

Combobox + listbox with dialog-safe defaults — inline Content, Escape interop, HiddenSelect for forms.

Documentation →

Combobox

Type-to-filter with aria-activedescendant navigation, Empty state, and inline floating Content.

Documentation →

capabilities

Built the same way, every primitive

Headless parts with predictable APIs, semantic data attributes, and zero shipped CSS — not themed widgets you fight to customize.

headless

Zero default styles

Every Kenos primitive is unstyled. Wire Tailwind, CSS modules, Panda CSS, StyleX, inline styles, or any CSS framework — Kenos ships no CSS. You bring your own, your way, and decide how your app looks.

data-*
state-driven styling hooks
render prop
compose your own DOM
per-package
install only what you need
accessibility

WAI-ARIA

Roles, keyboard patterns, and focus management built in — tested with axe-core and keyboard suites across primitives.

keyboard
focus-ring
aria-roles
screen reader
composition

Compound APIs

Shorthand composites for the common case, full part trees when you need control — from a single Button to multi-part pickers.

Button
DatePicker
Select
Combobox
typescript

Strict, inferred types

Props and generics across every part — or import everything from @kenos-ui/react when you depend on multiple primitives.

aggregator or per-package
import { Button, DatePicker } from "@kenos-ui/react"
<Button>Open picker</Button>
<DatePicker.Root><DatePicker.Calendar /></DatePicker.Root>

primitives

One library, many primitives

Install the aggregator or pick individual packages. Each primitive ships unstyled, with WAI-ARIA patterns and data attributes you style yourself.

Button

available

An augmented native <button> primitive. Built with native-first press logic, keyboard support, and robust state-driven data attributes.

Docs →npm
@kenos-ui/react-button
import { Button } from "@kenos-ui/react-button";

export function Example() {
  return <Button>Click me</Button>;
}

Date Picker

available

Headless date primitives — segmented input, popover calendar, range and multiple selection, time granularity, presets, unavailable dates, HiddenInput, RTL keyboard. Built on Intl, timescape, and Floating UI. Zero CSS shipped.

Docs →npm
@kenos-ui/react-datepicker
import { DatePicker } from "@kenos-ui/react-datepicker";

<DatePicker.Root value={date} onValueChange={setDate}>
  <DatePicker.Input />
  <DatePicker.Calendar />
</DatePicker.Root>

Select

available

A headless select with combobox + listbox pattern. Interop-first defaults: modal={false}, portal={false}. Pointer open keeps focus on the trigger; keyboard open moves focus into the listbox. Supports single and multiple selection, items prop for label maps, and Select.HiddenSelect for native form submission.

Docs →npm
@kenos-ui/react-select
import { Select } from "@kenos-ui/react-select";

<Select.Root>
  <Select.Trigger />
  <Select.Content />
</Select.Root>

Combobox

available

A headless combobox with type-to-filter, Input-first focus (aria-activedescendant), and an Empty state when nothing matches. open and inputValue are independent — Trigger toggles the list without clearing the query. Interop-first defaults: modal={false}, portal={false}, Content anchored to the Input.

Docs →npm
@kenos-ui/react-combobox
import { Combobox } from "@kenos-ui/react-combobox";

<Combobox.Root>
  <Combobox.Input />
  <Combobox.List />
</Combobox.Root>

accessible by default

Built for production UI

Interactive widgets are easy to get wrong. Kenos handles semantics, keyboard support, and locale rules so your team can focus on visual design. Accessibility guide →

  • Full keyboard navigation

    Predictable patterns across primitives — arrows, Home/End, Escape, and typeahead where it matters.

  • WAI-ARIA semantics

    Roles, states, and relationships wired in — not unlabeled divs with onClick handlers.

  • Locale-aware where needed

    Date segments respect Intl — week start, order, and labels without manual format strings.

  • Assistive technology ready

    Meaningful labels, expanded states, and announcements so screen readers don't guess intent.

  • Unstyled and lightweight

    Zero CSS ships with the package. Import only the parts you render — no theme runtime.

  • Composable parts

    Shorthand for common cases, full part trees when you need control over structure and behavior.

Ship UI with structure — not overrides.

Install from npm, browse the primitive catalog, and compose headless parts that respect keyboard and screen readers out of the box.