Skip to main content

February 2026

Rebrand to gentleduck/ui, full primitives rewrite, RTL/i18n, accessibility audit, Recharts v3, JSON Editor, and docs overhaul.

Rebrand to gentleduck/ui feat

Rebranded the project to gentleduck/ui across all assets and documentation.

  • Redesigned OG image with duck decorations and dark theme
  • Replaced command menu substring search with lunr.js full-text search
  • Added SVG path indicator with mask-image highlight to the table of contents
  • Enhanced docs TOC sidebar with edit link, scroll-to-top, and formatting cleanup
  • Added skeleton fallback to TOC tree to prevent layout shift on mount
  • Show prev/next pager buttons on all doc pages, not just component pages

CLI Monorepo Workspace Support feat

Improved @gentleduck/cli monorepo behavior and workspace targeting.

  • Added --workspace <path> support to init, add, update, remove, and diff
  • Added strict workspace validation (package.json and tsconfig.json where required)
  • Added parent-directory config discovery for duck-ui.config.json
  • Added explicit workspace output in command flows to show where files are written
  • Added legacy config migration error for configs missing workspace

See CLI docs for command examples.


Accessibility Audit a11y

Comprehensive accessibility pass across the entire docs site and component library:

  • Added aria-hidden to all decorative icons across sidebar, preview-panel, upload, auth, and blog blocks
  • Added aria-label and aria-pressed states across interactive examples
  • Increased touch target sizes in docs sidebar and block toolbar to meet 24px minimum
  • Added prefers-reduced-motion support via @gentleduck/motion helpers
  • Fixed ARIA violations in Tabs component (role, aria-selected, aria-controls)
  • Added accessible title and description to CommandDialog
  • Fixed ResponsiveContainer to prevent negative dimensions in charts

All interactive elements in the docs sidebar and block toolbar now meet the WCAG 2.2 minimum of 24x24px touch targets.


Performance perf

  • Lazy-loaded CommandMenu, MobileNav, and CardsDemo for faster initial page load
  • Added page-specific canonical URLs to all pages for SEO
  • Migrated to Vercel hosting with LLM endpoint and docs breadcrumb

RTL / i18n Support feat

Added right-to-left direction support and i18n text props across the component library.

  • Added dir prop to Dialog, Popover, HoverCard, Tooltip, Pagination, Carousel, Breadcrumb, Sidebar, and JSON Editor
  • Converted all RTL examples to standalone Arabic text components
  • Added Arabic locale to RTL Calendar example
  • Added CSS logical properties (margin-inline-start, padding-inline-end, etc.) for proper RTL layout
  • Added text prop for i18n string customization across navigation components

Button RTL

Accordion RTL

Select RTL


Primitives Expansion feat

Built a complete headless primitives layer from scratch.

  • Existing: dialog, alert-dialog, popover, tooltip, hover-card, context-menu, menu, menubar, dropdown-menu, select, slider, progress, roving-focus

  • New: input-otp, radio-group, toggle, toggle-group, command, pagination, direction, avatar

  • Foundation modules: focus-scope, dismissable-layer, popper, slot, shared hooks and utilities

  • Split each primitive into individual files for tree-shaking

  • Added data-slot and dir prop to all primitive components

  • Added shared list-navigation logic for Select and Command

  • Migrated all registry-ui components to use the new primitives

See the full primitives docs for API reference and guides.


Direction Provider feat

Added a shared DirectionProvider context across primitives and registry with DOM wrapper support.

Direction

  • Shared direction API across primitives and registry
  • DOM wrapper element for scoped RTL sections

Avatar Group feat

Added AvatarGroup component using the composition API from @gentleduck/primitives/avatar.

Avatar Group


Command Menu Rewrite feat

  • Refactored navigation model with keyboard-first design
  • Added virtualized rendering for large command lists
  • Removed autoFocus default from CommandInput

Command


Added 16 sidebar block variants (sidebar-01 through sidebar-16) with full registry infrastructure.

  • Converted sidebar to forwardRef pattern
  • Added loading and error states to ComponentPreview and ComponentSource
  • Used data-open attribute instead of data-state for collapsible groups

Recharts v3 Migration feat

Upgraded all charts from Recharts v2.15.1 to Recharts v3.7.0. The chart API is unchanged — your existing chart code works as-is. Charts now render on the server, so there is no flash of "Loading..." on page load. accessibilityLayer is on by default — you no longer need to add it.

  • Upgraded across all 6 packages that depend on recharts
  • Removed explicit accessibilityLayer prop from 47 chart files (on by default in v3)
  • Replaced removed activeIndex prop with Tooltip defaultIndex
  • Registry build now generates next/dynamic({ ssr: true }) instead of React.lazy() for 382 components

Chart

See the full chart docs for all chart types and examples.


JSON Editor feat

Added a new json-editor component to the UI registry with inline/sheet, popover, and callback expand modes.

JSON Editor

  • Full docs at /docs/components/json-editor with installation, usage, examples, and API reference
  • Portaled discard confirmation dialog for better z-index handling
  • Registry dependencies: alert-dialog, button, popover, field, and sheet

Preview Panel feat

Added preview-panel component to the registry for side-by-side content previews.

Preview Panel


Documentation Overhaul docs

Completed a comprehensive documentation rewrite covering every component and package page:

  • API props normalization across all 57 component pages with formal prop tables
  • Philosophy sections on every component and package page
  • Mermaid diagrams on 50+ pages — composition diagrams and "How It's Built" dependency diagrams
  • Contextual icons on all Callout blocks
  • Cross-links between related components (Dialog links to Sheet and Drawer, Toggle links to Toggle Group, etc.)
  • Structured documentation for all 9 core packages

All core packages now have structured docs with architecture diagrams, philosophy sections, and API overviews. See the Core Packages sidebar section.


Radio Group and Pagination Sync feat

  • Updated radio-group keyboard behavior to track group-level navigation keys (Arrow, Home/End, PageUp/PageDown) for focus-driven selection
  • Added radio-group typeahead and Vim-style navigation (a-z, gg, G) when the group or its items are focused
  • Migrated pagination registry internals to @gentleduck/primitives/pagination with direction-aware wrapper controls
  • Switched docs app sans font from Montserrat to Geist

Radio Group

Pagination


Registry Fixes fix

Fixed component dependency declarations in registry-ui.ts and registry-examples.ts:

  • Combobox — Added missing registry entry with correct dependencies
  • Resizable — Added missing react-resizable-panels dependency
  • Hover Card — Fixed typo in @gentleduck/libs dependency
  • Button Group — Added missing separator registry dependency
  • Badge — Added missing @gentleduck/primitives dependency
  • Alert Dialog — Added missing @gentleduck/motion dependency
  • Item — Added missing @gentleduck/primitives dependency
  • Checkbox examples — Fixed empty registry dependencies
  • Combobox examples — Fixed registry dependencies to reference combobox
  • Theme Toggle — Fixed malformed empty-string dependency

Build and Infrastructure chore

  • Migrated from pnpm to Bun as the package manager
  • Moved duck-gen-docs, duck-query, duck-skitch, and duck-ttest to the duck-gen monorepo
  • Fixed Recharts v3 types and static view pages
  • Corrected all GitHub URLs from gentleeduck/ui to gentleeduck/duck-ui
  • Improved mermaid block rendering and ordered-list indentation in docs
  • Added @types/node v25 and primitives dependencies
  • Set docs dev server to port 3008
  • Regenerated sitemap