Changelog
Every release of @sisyphos-ui/react and its sub-packages. Follow along via RSS.
Multi-framework v1 — React, Vue, and Angular ship from one design system
Sisyphos UI grows from a React-only kit into a multi-framework design system. Three brand-new umbrella packages ship 33 components for React 18+, Vue 3+, and Angular 18+ — same class names, same ARIA, same CSS tokens, same keyboard behavior across all three. The 35 per-component v0.5 packages are deprecated; the new umbrellas are the install path going forward.
Three framework umbrellas
@sisyphos-ui/react@1.0.0, @sisyphos-ui/vue@1.0.0, and @sisyphos-ui/angular@1.0.0 land in one release. Pick the binding that matches your stack — pnpm add @sisyphos-ui/<framework> + import the bundled stylesheet once, that's the whole install.
Identical contract everywhere
Same class names (sisyphos-button, sisyphos-dialog, …), same ARIA semantics, same WAI-ARIA keyboard support, same CSS variables. Verified by 1,038 tests across the three frameworks. Migrate teams without re-learning anything.
Theming stays runtime
applyTheme() lives in @sisyphos-ui/core@1.0.0 — framework-agnostic, called once, flips every token across React + Vue + Angular at the same time. No ThemeProvider, no per-binding setup.
Multi-framework live preview
Every component page on sisyphosui.com gets a framework picker that swaps the live demo between React, Vue 3, and Angular 18 in place — all rendered inline in the same page. See the component you're documenting render in three frameworks side-by-side, with the same DOM under the hood.
Added
- @sisyphos-ui/react@1.0.0 — unified umbrella replacing the 33 per-component packages and the @sisyphos-ui/ui aggregator.
- @sisyphos-ui/vue@1.0.0 — Vue 3 binding with
<script setup>+ defineProps/defineEmits APIs, full v-model:* / v-model two-way bindings. - @sisyphos-ui/angular@1.0.0 — Angular 18 standalone components binding with signals + OnPush change detection, ng-packagr Partial-Ivy publish format.
- @sisyphos-ui/core@1.0.0 — design tokens + applyTheme + dark-mode helpers, framework-agnostic, the foundation every umbrella builds on.
- Portal + useFocusTrap + useScrollLock primitives publicly re-exported from @sisyphos-ui/react@1.0.2 for advanced consumers composing custom overlays.
Deprecated
- @sisyphos-ui/ui (umbrella) and the 33 per-component @sisyphos-ui/<name> packages are now deprecated on npm. They keep working at their last 0.5.x version but new projects should adopt the v1.0 framework umbrellas.
Install
$ pnpm add @sisyphos-ui/react@1.0.0Table truncation, mask caret lock, default times, real tristate
Eight component primitives pick up the polish features production apps usually have to hand-roll. Table learns column truncation, a delayed loading skeleton, and per-row hooks. Input locks the caret past a mask's fixed prefix. DatePicker remembers a default time on first pick. Checkbox finally has a real tristate. Core's Escape handling is now stack-aware so nested overlays close one layer at a time. NumberInput stops shipping a Turkish locale to international consumers.
Table — truncate, loading delay, row hooks
`<TableColumn>` gains `truncate` (CSS ellipsis with native `title` fallback when overflowing). `loadingDelay` smooths the skeleton flicker on fast loads. `rowClassName(row, index)` and a first-class `onRowDoubleClick` round out per-row hooks.
Input — mask prefix caret lock
On masks with a fixed prefix (e.g. `+90 (5` in `tel-tr`) the caret can no longer wander into the literal area. Real text selections (Ctrl+A) are preserved so select-all-then-replace still works. New helper: `getMaskPrefixLength(maskSpec)`.
Checkbox — real tristate via `indeterminate`
Sets the DOM `indeterminate` flag and exposes `aria-checked="mixed"` so screen readers announce the mixed state. Activating an indeterminate checkbox calls `onChange(true)` — the standard select-all promotion that hierarchical pickers need.
Core — stack-aware `useEscapeKey`
Nested overlays now close one layer at a time. Open a Popover inside a Dialog, press Escape — only the Popover dismisses. The fix is internal; every overlay package picks it up automatically.
Added
- Table —
TableColumn.truncate,Table.loadingDelay,Table.rowClassName(row, index),Table.onRowDoubleClick(row, index). Skeleton placeholder widths now vary across columns. - Input — caret lock past a mask's fixed prefix on focus, click, and key-up. New
getMaskPrefixLengthexport. - DatePicker —
defaultHour,defaultMinute, plus the range-awaredefaultStartHour/defaultStartMinute/defaultEndHour/defaultEndMinute. Defaults only apply on first pick; user-edited times survive subsequent re-picks. - Checkbox —
indeterminateprop with synced DOM flag andaria-checked="mixed". Tristate visual matches the configuredcolortoken across primary / success / warning / error / info. - FileUpload —
directoryenables folder selection viawebkitdirectory(preserveswebkitRelativePath).onBeforeRemove(file)returns a boolean (or Promise) to cancel removal. - TreeSelect — auto-expand matched ancestors while a search term is active; clearing the search restores manual expand/collapse state.
- Core —
useEscapeKeyis stack-aware. Only the topmost handler fires.
Changed
- NumberInput —
localeprop now defaults to the runtime locale instead oftr-TR. Pass an explicit BCP 47 tag (e.g.tr-TR,de-DE) to lock the format. Existing call sites that passlocaleexplicitly keep their behavior.
Install
$ pnpm add @sisyphos-ui/react@0.5.0Kbd, Command, ContextMenu — and a Firefox spinner fix
Three new packages round out the keyboard / menu story: a Kbd chip for rendering shortcuts, a ContextMenu anchored at the pointer, and a Command palette with substring filtering. Dialog picks up an auto-rendered close button, Toast gains `loading` + `promise`, Table adds row-click selection and a context-menu hook, and Spinner moves to SVG to kill Firefox's antialiasing seam on small sizes.
New <Kbd>
Single keys or shortcuts (`cmd+k`, `mod+s`). Platform-aware — `mod` resolves to ⌘ on macOS and ⌃ elsewhere — with built-in glyphs for modifiers, arrows, Enter/Tab/Esc.
New <ContextMenu>
Right-click menu anchored at the pointer. Portal-mounted, viewport-clamped, keyboard navigable. Pairs with the new Table `onRowContextMenu` prop.
New <Command>
Compound command palette (Input / List / Group / Item / Empty / Separator). Case-insensitive substring filter; groups auto-hide when all items filter out. Drop it inside a Dialog for the classic ⌘K menu.
Toast `loading` + `promise`
`toast.promise(p, { loading, success, error })` morphs a loading toast into success or error when the promise settles. Action and close-button alignment also fixed.
Added
- New package —
@sisyphos-ui/kbd: Kbd component with platform-awaremod, built-in alias glyphs, outlined + soft variants. - New package —
@sisyphos-ui/context-menu: right-click menu anchored at the pointer with same item shape as DropdownMenu. - New package —
@sisyphos-ui/command: compound command palette with filtering, groups, keyboard nav, combobox/listbox a11y. - Dialog —
showCloseButton+closeButtonLabelprops auto-render the close button in the top-right. - Toast —
toast.loading(title)andtoast.promise(promise, { loading, success, error }). Shared id morphs loading → success/error in place. - Table —
rowSelectionMode: "checkbox" | "click" | "doubleClick"andonRowContextMenu(event, row, index).
Changed
- Spinner — rewritten as inline SVG. Firefox no longer shows the antialiasing seam on
border-radius: 50%borders at small sizes. Public API unchanged;thicknessnow drives stroke-width via--sisyphos-spinner-thickness. - Toast — action and close button center vertically against the full toast body. Fixes "Undo" floating to the top line when a description was present.
- Accordion — trigger vertical padding reduced from
$spacing-md(16px) to$spacing-s(10px). - Input —
startIcon/endIconwrappers clamp direct<svg>/<img>children to1.15emso 24×24 Lucide defaults no longer blow out xs/sm inputs. - Button — SCSS migrated from deprecated
map-get()tomap.get().
Install
$ pnpm add @sisyphos-ui/react@0.4.0Input masks, data-grid Table, submenus
Twenty-two packages land a feature-and-polish pass. Input gains masks, Table becomes a real data-grid, DropdownMenu grows submenus, and a full PageSkeleton joins the loading-state toolkit.
Input masks
New mask prop plus mask.ts helpers. Expanded variants, refreshed styles, broader test coverage.
Data-grid Table
Sorting, row selection, loading skeletons, empty states, refined pagination.
DropdownMenu submenus
Nested menus with improved keyboard navigation and consistent styling.
PageSkeleton
New full-page loading primitive alongside richer Skeleton building blocks.
Added
- Input —
maskprop andmask.tshelpers for phone, date, currency, and custom formats. - Table — sorting, row selection, loading skeletons, empty-state integration.
- Skeleton — new
PageSkeletoncomponent and extra primitives for common layouts. - DropdownMenu — submenu support with full keyboard navigation.
Changed
- Input — expanded variants and refreshed visual styles.
- Table — refined pagination and broader test coverage.
- DatePicker — UX and styling refinements, better edge-case handling.
- Checkbox, Radio, RadioGroup — accessibility polish and consistent styling.
- FileUpload — drag-and-drop and file-type filtering polish.
- Slider, Carousel, Tabs, Tooltip, Popover, Toast, EmptyState, Alert, Accordion, Card, Dialog, Spinner, Select, TreeSelect — behavioural fixes and style refinements.
- ui —
bundle-css.mjsbuild tweaks for aggregated stylesheet output. - eslint-config — ruleset tuning.
Install
$ pnpm add @sisyphos-ui/react@0.3.0Initial public release
Sisyphos UI goes public. A headless-flavored, accessible React design system built on CSS variables and SCSS tokens — 30+ components as tree-shakable packages plus an umbrella.
30+ components
Every component ships as an independent, tree-shakable package. The @sisyphos-ui/react umbrella bundles them all.
Accessible by default
WAI-ARIA compliant, keyboard operable, focus-trap and scroll-lock wired into every overlay.
Themeable at runtime
applyTheme(), setThemeMode(), and CSS variables under --sisyphos-*. Works with any styling stack.
Strict TypeScript
Compound APIs, controlled + uncontrolled modes, forwardRef + displayName, full prop JSDoc.
Added
- Initial public release of the Sisyphos UI design system.
- 30+ accessible components: Accordion, Alert, Avatar, Breadcrumb, Button, Card, Carousel, Checkbox, Chip, DatePicker, Dialog, DropdownMenu, EmptyState, FileUpload, Input, NumberInput, Popover, Radio, Select, Skeleton, Slider, Spinner, Switch, Table, Tabs, Textarea, Toast, Tooltip, TreeSelect, and more.
- Runtime theming primitives —
applyTheme(),setThemeMode(), and the full CSS variable system under--sisyphos-*. - Compound component APIs for Dialog, Tabs, Accordion, Card, Radio, and others.
- Controlled and uncontrolled modes on every interactive component.
- Strict TypeScript types with forwardRef, displayName, and full prop JSDoc.
Install
$ pnpm add @sisyphos-ui/react@0.2.0Looking for a specific component’s history? Every @sisyphos-ui/* package ships its own CHANGELOG.md on npm. Or watch the GitHub repository for release notifications.