Changelog
Release history for @gentleduck/registry-ui. Newest releases at the top.
0.8.0
Minor Changes
0c295e1:
CommandDialogtakestitleanddescriptionfor its screen-reader title and description, so they can be translated. They default to the English text it hard-coded before,Command paletteandSearch for commands and navigation items.9075a3d:
PreviewPanelandMotionPreviewPanelstart locked: the wheel over a panel scrolls the page it sits in instead of zooming, and drag and pinch do nothing until the user presses the new lock button beside the zoom controls. The zoom buttons work either way. PassdefaultLocked={false}where the panel is the page's main content, andlockTextandunlockTextto translate the button. A newactionsprop renders your own buttons in the toolbar before the zoom controls, and still renders withshowControls={false}.PreviewPanelDialogputs its fullscreen button in that toolbar instead of over the bottom corner of the content, takes the samedefaultLocked,lockTextandunlockTextfor its inline panel, and opens the fullscreen panel unlocked.If a panel relied on the wheel zooming straight away, add
defaultLocked={false}.
Patch Changes
- 0f9c5b2:
Breadcrumbkeeps anaria-labelyou pass instead of overwriting it withbreadcrumb, which stays the default. Its type drops theseparatorprop, which the component never read; if you passed one, remove it and passBreadcrumbSeparatorchildren as before. - 4d66971: The
ButtonandMotionButtonloading spinner holds still when the user has asked for reduced motion (motion-reduce:animate-none). - 678e0d2:
CommandListcaps the box that scrolls. Themax-h-75limit and yourclassNamesat on the list inside the scroll area, so a long list spilled past the cap instead of scrolling; both now go on the viewport. The list also scrolls with the wheel and touch when it is portalled out of a modal, such as a combobox inside a dialog, where the modal's scroll lock used to swallow the gesture. - 60d564c:
Inputish-9, the height of theSelecttrigger,ButtonandInputGroupit sits beside in a form row or a button group; it wash-8.Input,Textarea, theSelectandMotionSelecttriggers and the defaultButtonshare oneshadow-xs, where the select and button usedshadow-smand the input and textarea had none.
0.7.0
Minor Changes
8d18fa6: Every component follows the direction set once with
DirectionProvideror<html dir>. Physical sides (left/righton sheet, sidebar, toasts, and popups) mirror in RTL instead of staying put, arrows and chevrons flip where they point along the inline axis, and keyboard navigation in tabs, menubar, and calendar follows the visual order. Progress fills from the inline-start edge, charts keep their SVG labels anchored, carousel passes the direction to Embla, JSON stays LTR inside the JSON editor, andKbdkeeps key labels in typing order. Preview panel controls acceptzoomInText,zoomOutText, andresetTextfor translated labels.22e853d: Add
Typeset, prose styles for rendered HTML and markdown such as docs pages, blog posts, and streamed AI replies. Wrap content in<Typeset>(or add thetypesetclass) and headings, lists, tables, code, and quotes get consistent sizes and spacing driven by three variables:--typeset-size,--typeset-leading, and--typeset-flow. Blocks only take a top margin, so streamed content never shifts what is already on screen. Opt a subtree out withnot-typeset. The styles ship as@gentleduck/registry-ui/typeset.css.27ffc5e:
TabsContenttakesrenderOnce: the panel mounts the first time its tab opens and then stays mounted, hidden, so form input, scroll position, and fetched data survive tab switches.forceMountnow keeps a panel mounted from the start, before its tab is ever opened. Kept panels getdisplay: noneandaria-hidden.By default an inactive panel now unmounts. Before, every panel stayed mounted after its first open no matter which props you passed. If you relied on that to keep state across tab switches, add
renderOnce.
Patch Changes
- 2f92193: Components share one motion language. Popups and dialogs set enter and exit durations with
animation-duration-*(200ms in and 150ms out; 300ms and 200ms for dialogs and sheets) on the shared--gentleduck-motion-ease. Transitions name the properties they animate instead oftransition-all, and the sidebar, accordion, and collapsible use the same easing. Motion popovers usespringBouncy, alert dialogsspringStifffor both overlay and content, and the motion sheet overlaytweenSlow. - 33c4389: The
Commandshortcut docs usemod+k, which is Cmd on Mac and Ctrl elsewhere, instead ofctrl+K. - ed5fb65: The navigation menu viewport measures its content before the first paint, so opening a menu no longer flashes an empty 0x0 box for a frame. The styled viewport also fades as it zooms in and out.
- c9fe51c: Tailwind classes use their v4 forms:
size-*instead of matchingh-*/w-*pairs,outline-hiddeninstead ofoutline-none, andfocus-visible:rings on close buttons, so a mouse click no longer leaves a focus ring. Popover, tooltip, hover card, and dropdown menu set their border colour with a class instead of an inline style, and the slider thumb usesbg-backgroundso it follows the theme. - 8ed39e5:
ScrollAreashows the native scrollbar again. The viewport hard-codedscrollbar-none, so content scrolled with no visible bar, and aviewportClassNamecould not bring it back. The bar now uses your global::-webkit-scrollbarstyles; passviewportClassName="scrollbar-none"to hide it. - 1b0f91a:
SheetContentrenders its children before the close button, so the absolutely positioned button stays on top of full-bleed content and comes after it in tab order. - Updated dependencies [ed5fb65]
- Updated dependencies [8d18fa6]
- @gentleduck/primitives@0.5.0
0.6.2
Patch Changes
- 65728a4:
MotionTableRow,MotionAlertTitle,MotionAlertDescriptionandMotionTypographyListItembring their ownLazyMotion. They need no context from their motion root, so they can sit in the plainTable,Alertor list, where nothing loaded Motion's features and their entrance animation never ran. - ee71f99:
toDirectionaccepts onlyltrandrtl. It checkeddir in DIRECTION_DICTIONARY, which also matches keys inherited fromObject.prototype, sotoDirection('toString')returned'toString'as a direction. - cafcba7:
unsafeHtmltakes priority overchildrenwhenever it is passed, as its docs say.PreviewPanel,MotionPreviewPanelandPreviewPanelDialogtested its truthiness, sounsafeHtml=""renderedchildreninstead.
0.6.1
Patch Changes
- bfa58d9: - Disabled and
aria-disabledcontrols show acursor-not-allowedcursor. They relied onpointer-events-nonealone, which hid the cursor instead of showing that the control is disabled.- An icon inside a component can be resized with its own
size-*class, without!. The components' default[&_svg]:size-4now steps aside when the icon carries a size. - The
Switchthumb grows from the correct side in left-to-right layouts. Its transform origins were the right-to-left ones; they now follow the direction. PopoverArrow's props no longer reference the primitive's internalScopetype, which made declaration emit non-portable.
- An icon inside a component can be resized with its own
- Updated dependencies [1681854]
- Updated dependencies [bfa58d9]
- @gentleduck/calendar@0.5.0
- @gentleduck/primitives@0.4.0
0.6.0
Minor Changes
- a157bae: Add styled arrow components for overlay components:
TooltipArrow,PopoverArrow,HoverCardArrow, andDropdownMenuArrow. Arrows use a bezier curve SVG shape that seamlessly joins the content border, with border stroke on curved sides only via a two-path technique. Border color is customizable via--tooltip-border-color,--popover-border-color,--hover-card-border-color, and--dropdown-menu-border-colorCSS custom properties on the respective content elements. Also fixesoverflow-hiddenremoval from content containers so arrows are not clipped, addsrelativepositioning for correct arrow animation, and restructuresDropdownMenuContentwith an inner scrollable wrapper to decouple overflow from the arrow's containing block.
0.5.0
Minor Changes
95638de: Audit-driven refactor across all 15 public packages. Closes type holes, hardens security boundaries, eliminates dead code, and dedups duplicated patterns.
Highlights
duck-docs— CompiledMdxBody branded type gatesnew Function(body); sanitizeSvg covers SMIL, unquoted javascript: URIs, nested script, CSS url(), bare iframe; code-preview tag + attr allowlistsduck-registry-build— safe-path containment at every fs sink; per-phase Zod cache schemas; JSON.stringify in generated TSX; cache manifest rejection on tamperduck-cli— install pipeline path containment unified across add/init/update; env-var allowlist contract reconciled with one-time warning; aliases.ui regex validationduck-primitives—observe-element-rectrAF loop guard (no leak when empty);compose-refuseCallback memo fix; popper forwardRef restored for R18 peer compatduck-hooks—useDebounceis now a real hook (stable identity, unmount cleanup);useStableIddelegates to React.useId (SSR-safe);scheduleTransitionTimeoutrename strips twouseHookAtTopLevellint suppressionsduck-lazy— spread order fix restores the lazy swap;next/imagemoved behind/lazy-image-nextsubpath so non-Next consumers don't pull the peerduck-vim— single document listener fans out to chord matcher + sequence manager; canonical modifier order;requireResetauto-clears for chord bindings; all three hook dep arrays correctedduck-variants—Props<T, D>makes defaulted variant keys optional and non-defaulted required; boundedpreludeCacheLRU; second-layerfilter2set eliminates last clone in hot pathduck-ttest—predictates/renamed topredicates/, twin dirs deleted, type-utility duplicates reconciled to canonical sources,IsVoidactually distinguishes void from undefined nowduck-calendar—./*wildcard export removed; falsy-zeroweekStartDay: 0(Sunday) bug fixed; Gregorian helpers extracted; HebrewaddMonthsuses Metonic cycleduck-libs—cnMemobounded LRU;filteredObjectrejects typo keys at compile time;parseDaterejects ambiguous one-token inputsduck-query— single AnyReq boundary cast replaces 14as any; param regex escape; throws on unresolved:tokensregisters— schema tightened (z.any()removed); ~1000 LoC of identical block-registry boilerplate replaced with buildersregistry-ui—_audio/_upload(~1.1K LoC) deleted;motion-shellHOC +withMotioncollapses simple motion clones;toDirection()narrower replaces 52as IDirection.Kindcasts; chartCSS_NAMED_COLORSfinite allowlistduck-motion— refcounted bodypointer-eventsownership; easing/blur/duration token dedup; half of public exports were unused and removed
Tests: 3133+ across the monorepo, all green. Type-checks clean across every project. No commits skipped hooks.
Patch Changes
- Updated dependencies [95638de]
- @gentleduck/libs@1.0.0
- @gentleduck/variants@1.0.0
- @gentleduck/motion@1.0.0
- @gentleduck/primitives@0.3.0
- @gentleduck/hooks@1.0.0
- @gentleduck/vim@0.3.0
- @gentleduck/calendar@0.4.0
0.4.4
Patch Changes
- 95dbbce: Standardize README headers across all packages: centered logo, h1, tagline, nav links, and npm badges (matching the @duck-md template). Replace per-repo
*.gentleduck.orgsubdomain refs with path-basedgentleduck.org/duck-<name>URLs. No runtime code changes.
0.4.3
Patch Changes
- 918b34c: Strip
workspace:*andcatalog:protocol tokens fromdevDependencies/dependencies/peerDependenciesof every public package beforechangeset publish. Previously published artifacts leaked these tokens into npm metadata, which broke strict resolvers (bun, deno) for downstream consumers. Addsscripts/clean-publish.tsand wires it into the rootreleasescript with agit checkoutrestore step so source remains workspace-friendly.
0.4.2
Patch Changes
- b4706d3: Replace
workspace:*deps in publisheddependenciesandpeerDependencieswith explicit semver. Previous publishes leakedworkspace:*to the npm tarball, breakingbun installfor downstream consumers (error: Workspace dependency "@gentleduck/calendar" not found).
0.4.1
Patch Changes
- Updated dependencies [df57671]
- @gentleduck/primitives@0.2.11
0.4.0
Minor Changes
- 7d6fb7b: Motion: export IDuckMotion namespace, add token presets, stagger utility, and exit-transition context. Shortcut and registry-ui gain motion library integration with dialog animations and MotionBadge preset.
Patch Changes
- Updated dependencies [7d6fb7b]
- Updated dependencies [7d6fb7b]
- Updated dependencies [7d6fb7b]
- @gentleduck/motion@0.3.0
- @gentleduck/calendar@0.3.0
- @gentleduck/hooks@0.2.0
- @gentleduck/libs@0.2.0
- @gentleduck/vim@0.2.0
- @gentleduck/primitives@0.2.10
- @gentleduck/variants@0.1.22
0.3.3
Patch Changes
- 0f4f2e2: Performance pass across all Motion components. Extracted inline useMotionPreset option objects to module-level constants. Memoized context provider values in Accordion, Tabs, ToggleGroup, and Collapsible. Extracted inline animate and transition literals to constants in Switch, Tabs, and Progress. Memoized event handlers with useCallback. Converted 47 wildcard barrel exports to named exports for tree-shaking. Migrated all 41 component files from string-based preset lookups to direct preset object imports. Fixed stale event handler closure in CollapsibleTrigger. Fixed MotionSelectTrigger to use LazyMotion plus m.div instead of the heavy motion.div root import. Added sideEffects false to package.json.
- Updated dependencies [0f4f2e2]
- @gentleduck/motion@0.2.0
0.3.2
Patch Changes
- Updated dependencies [32d0136]
- @gentleduck/calendar@0.2.1
0.3.1
Patch Changes
- Updated dependencies [58d1c61]
- @gentleduck/calendar@0.2.0
0.3.0
Minor Changes
3ee8b3a: feat: add AI documentation chat and command menu enhancements
@gentleduck/docs:
Add useAIChat hook for streaming AI chat with rAF-batched updates
Add AIChatPanel component with markdown rendering, shiki syntax highlighting, and dynamic props
Add AI toggle mode to CommandMenu with auto-switch on empty search results
Add react-markdown and shiki as optional peer dependencies
@gentleduck/registry-ui:
- Add hideClose prop to DialogContent to conditionally hide the close button
- Add children prop to CommandInput for rendering extra elements in the input wrapper
- Add contentClassName prop to CommandDialog for dynamic dialog sizing
0.2.12
Patch Changes
- 0fd319f: Update carousel, pagination, and sidebar components with tests and fixes.
0.2.11
Patch Changes
- 3b33efe: Remove select-none from accordion content so users can select and copy text inside accordion panels.
0.2.10
Patch Changes
- 74f5628: Remove whitespace-nowrap from accordion trigger to allow text wrapping on smaller screens.
0.2.9
Patch Changes
- 80f8c4c: Fix declaration output for shared docs and registry UI components so consumer apps keep valid props during production typechecking.
0.2.8
Patch Changes
e7ee580: fix(registry-ui): replace workspace:* dependencies with published npm versions
The published package had
workspace:*references that broke any consumer's install.
0.2.6
Patch Changes
- 2b6e8d0: Resolve all biome lint warnings, improve type safety, and add test coverage across the monorepo.
- Updated dependencies [2b6e8d0]
- @gentleduck/primitives@0.2.5
- @gentleduck/variants@0.1.20
- @gentleduck/hooks@0.1.12
- @gentleduck/motion@0.1.17
- @gentleduck/libs@0.1.15
- @gentleduck/vim@0.1.16
0.2.5
Patch Changes
fix(search): disable primitive's built-in filter when using custom lunr search
The command menu had two competing filtering systems: lunr-based search and the primitive's
substring filter. The primitive's filter was hiding items via el.hidden = true even when
lunr correctly found them, causing search results to not appear. Added shouldFilter prop
to the Command primitive to allow disabling the built-in filter.
- Updated dependencies
- @gentleduck/primitives@0.2.4
0.2.4
Patch Changes
ba8a6f3: fix: update resizable components to react-resizable-panels v4 API
Replace deprecated ref with panelRef across resizable component and
examples to align with react-resizable-panels v4.
0.2.3
Patch Changes
- 7c2aa88: Update dependencies and publish unpublished packages
- Updated dependencies [7c2aa88]
- @gentleduck/hooks@0.1.11
- @gentleduck/libs@0.1.14
- @gentleduck/motion@0.1.16
- @gentleduck/primitives@0.2.3
- @gentleduck/variants@0.1.19
- @gentleduck/vim@0.1.15
0.2.2
Patch Changes
- c9bbef8: Documentation and style updates.
- Updated dependencies [c9bbef8]
- @gentleduck/hooks@0.1.10
- @gentleduck/libs@0.1.13
- @gentleduck/motion@0.1.15
- @gentleduck/primitives@0.2.2
- @gentleduck/variants@0.1.18
- @gentleduck/vim@0.1.14
0.2.1
Patch Changes
ad86755: Migrate all UI components to new duck-primitives, add RTL support, and update component styles.
Features:
Migrate all registry-ui components to new duck-primitives module
Add RTL support with CSS logical properties across components
Add AnimVariants for consistent animation behavior
Rewrite alert-dialog to use new primitives
Rewrite sheet to use new dialog-based primitives
Rewrite menubar to use new menubar primitives
Switch preview index to next/dynamic SSR entries
Fixes:
Fix dialog and popover styles for Tailwind CSS v4 compatibility
Fix select to manage its own open state
Fix popover width and update calendar/date-picker examples
Disable SSR for dynamic preview components
Updated dependencies [ad86755]
- @gentleduck/primitives@0.2.1
- @gentleduck/hooks@0.1.9
- @gentleduck/libs@0.1.12
- @gentleduck/variants@0.1.17
- @gentleduck/motion@0.1.14
- @gentleduck/vim@0.1.13
0.2.0
Minor Changes
- 36f9364: Add json-editor component with inline, sheet, and popover editing modes for JSON data with validation. Includes registry entries and three example demos.
Patch Changes
- d46534e: Upgrade recharts peer dependency from v2 to v3.7.0 with updated chart component types.
- Updated dependencies [36f9364]
- @gentleduck/primitives@0.2.0
0.1.17
Patch Changes
- Updated dependencies [4f93768]
- @gentleduck/primitives@0.1.45
0.1.16
Patch Changes
- Updated dependencies [d0a2c1d]
- Updated dependencies [d0a2c1d]
- @gentleduck/primitives@0.1.44
0.1.15
Patch Changes
- Updated dependencies [45ec82f]
- @gentleduck/primitives@0.1.43
0.1.14
Patch Changes
- Updated dependencies [cd47e32]
- @gentleduck/primitives@0.1.42
0.1.13
Patch Changes
- df94032: Initial public release of styled UI component wrappers for duck-primitives with Tailwind CSS styling and registry infrastructure.