@fictjs/ui-primitives
v0.1.0
Published
Official headless UI primitives for Fict
Maintainers
Readme
@fictjs/ui-primitives
Official headless UI primitives for Fict.
This repository provides unstyled, composable primitives focused on accessibility, interaction semantics, and controlled/uncontrolled APIs.
Who This Is For
- Teams building design systems on top of
@fictjs/runtime - App developers who want accessible primitives without pre-baked styles
- Contributors working on interaction, focus, overlay, and form behaviors
Package Highlights
- Headless component primitives with composable parts
- Controlled + uncontrolled state APIs across core components
- Consistent
asChildsupport acrossTrigger/Close/Itemparts - Deterministic id strategy via
idinjection anduseId/IdProvider - Built-in accessibility semantics (
role,aria-*, keyboard interactions) - Shared behavior utilities via
@fictjs/hooks(event listeners, timers, lifecycle cleanup) - Strong behavior tests (Vitest + JSDOM)
- Executable demo app + screenshot baseline workflow
Installation
pnpm add @fictjs/ui-primitives @fictjs/runtime @fictjs/hooks
# or npm / yarnNode version: >=18
Peer dependencies:
@fictjs/hooks@^0.3.0@fictjs/runtime@^0.10.0
Quick Start
import { render } from '@fictjs/runtime'
import {
DialogRoot,
DialogTrigger,
DialogOverlay,
DialogContent,
DialogTitle,
DialogDescription,
DialogClose,
} from '@fictjs/ui-primitives'
const app = document.querySelector('#app')
if (!(app instanceof HTMLElement)) throw new Error('Missing #app')
render(
() => (
<DialogRoot>
<DialogTrigger>Open dialog</DialogTrigger>
<DialogOverlay />
<DialogContent>
<DialogTitle>Settings</DialogTitle>
<DialogDescription>Update your preferences.</DialogDescription>
<DialogClose>Close</DialogClose>
</DialogContent>
</DialogRoot>
),
app,
)API Surface
All exports are available from the root entry:
import { DialogRoot, TabsRoot, ToastProvider } from '@fictjs/ui-primitives'Export groups:
- Core:
Primitive,Slot,Presence,Portal,VisuallyHidden, etc. - Core id primitives:
IdProvider,useId - Interaction:
FocusScope,DismissableLayer,RovingFocusGroup,Popper, etc. - Overlay:
Dialog*,AlertDialog*,Popover*,Tooltip*,HoverCard*,CommandPalette* - Menu:
DropdownMenu*,ContextMenu*,Menubar*(including submenu parts) - Feedback:
ToastProvider,ToastViewport,Toast*,useToast - Disclosure:
Tabs*,Accordion*,Collapsible*,NavigationMenu* - Form:
Label,Checkbox,RadioGroup,Switch,Toggle,Slider,RangeSlider,Calendar,DatePicker,Select,Combobox,Form* - Layout:
ScrollArea*,Resizable*,AspectRatio,Progress,Skeleton,FocusVisible
For detailed symbol-by-symbol reference, see docs/api-reference.md.
Design Contracts
- Controlled/uncontrolled parity:
open/defaultOpen/onOpenChangeandvalue/defaultValue/onValueChange asChildparity:Trigger,Close, andItemparts support Slot composition- Stable id wiring: prefer explicit
idfor deterministic SSR, otherwise use built-in id generation - Interceptable outside interactions: overlay content parts expose escape and outside interaction hooks
Documentation Map
docs/README.md: documentation indexdocs/components/*: per-component behavior, minimal examples, and a11y notesdocs/api-reference.md: full export indexdocs/architecture.md: design and implementation structuredocs/testing.md: testing strategy and expectationsdocs/accessibility.md: accessibility review checklistdocs/examples.md: copyable composition snippetsexamples/README.md: executable demo app + screenshot workflowdocs/release.md: release and publish checklist
Demo App
Run local demo app:
pnpm examples:devOpen http://127.0.0.1:4173.
Build and preview:
pnpm examples:build
pnpm examples:previewScreenshot Baselines
Install browser binary once:
pnpm examples:screenshots:installRegenerate baseline screenshots:
pnpm examples:screenshotsOutputs: examples/screenshots/baseline
Development
Install dependencies:
pnpm install --ignore-workspaceCommon commands:
pnpm lintpnpm typecheckpnpm testpnpm test:coveragepnpm buildpnpm clean
Contribution Workflow
- Create a focused branch.
- Make small, reviewable commits.
- Keep docs and tests updated with behavior changes.
- Run quality gates before opening a PR.
Detailed guide: CONTRIBUTING.md
Release Workflow
Use the checklist in docs/release.md before publishing.
License
MIT, see LICENSE.
