ui/changelog
Changelog
Release notes for @diffgazer/ui.
0.3.0
Minor changes
MenuandNavigationListtake atypeaheadprop (defaulttrue). Settypeahead={false}on a list whose screen advertises printable keys as shortcuts; the list then buffers no characters and every key reaches your hotkey layer.- Typeahead claims a keystroke only once its query has matched an item, and while a matched query is being narrowed. A first press that matches nothing falls through, so a window-level hotkey layer that skips
defaultPreventedevents (such asKeyboardProviderfrom@diffgazer/keys) sees/,?,q, and digits while a list has focus. Menu,NavigationList,RadioGroup, andCheckboxGroupacceptkwherever they acceptArrowUpandjwherever they acceptArrowDown. Roving focus,aria-activedescendant, disabled skipping, and boundary callbacks are unchanged. Typeahead reservesj/krather than consuming them: on an empty query they move the highlight, during a query they extend it, and they never start one (useTypeaheadBuffergained anextendOnlyoption for this).- Modal
DialogContentrenders a close icon by default, last in the DOM so it stays the final tab stop. PasscloseIcon={false}to opt out; inline dialogs still composeDialog.CloseIconexplicitly. ScrollAreagains anoverlayprop (vertical orientation only): the native scrollbar is hidden and a draggable floating thumb renders above the content, so rows can run border-to-border.scrollAreaVariantsgains ascrollbardimension (thindefault,overlay). Touch devices keep their native indicator.@diffgazer/ui/lib/focus-outline(FOCUS_OUTLINE,FOCUS_OUTLINE_INSET,HIGHLIGHT_OUTLINE) and@diffgazer/ui/lib/marker-rail(MARKER_RAIL_BASE,MARKER_RAIL_SELECTED,MARKER_RAIL_ON_INVERTED) are package exports; the copy path already installed both as ride-along items.- Form, focus, keyboard, SSR, and accessibility fixes across the component, hook, and lib surfaces, and refreshed base theme tokens.
Removals
HorizontalStepperProps.steps— the run is now derived from the renderedHorizontalStepper.Stepchildren, which register themselves in document order. Drop the prop; the steps you render are the run.CommandPaletteItemMetadata— folded intoCommandPaletteItemRegistration, which carries the same fields directly.MenuItemRadiovalueprop — it was never read; drop it.
Changes
ToggleGroupPropsandCheckboxGroupPropsare no longer generic. For a value-typed toggle group, build one withcreateToggleGroup(values);CheckboxGroupvalues arestring[].DialogContentPropsis a discriminated union onmodal: a modal dialog takesmodal?: truewithrole,closeIcon,closeOnBackdropClick,initialFocus,onCancel, andonEscapeKeyDown, and an inline dialog takesmodal: falseand accepts none of them.DiffViewProps.statusBaris accepted only withvariant="statusbar"; on every other variant it is now typedneverinstead of being silently ignored.DialogContent initialFocusnow wins in browsers: the shell focuses the target right aftershowModal(), before the browser's own first-focusable pick could stand.MenucallspreventDefault()on Tab in addition toonClose(). Tab closes the menu and leaves focus where your close handler puts it — for a popover-hosted menu, the trigger, matching Escape. Press Tab twice to reach the element after the trigger.- An empty
type="single"Accordionvalue normalizes toundefined. - Focus outlines move from
outline-offset-2tooutline-offset-0across the library so the mark hugs the control edge;ScrollAreadraws its outline inset. Fields keep the inset field grammar (focus:border-ringplusfocus:ring-1). dialog.cssdrops the CSS-onlybody:has(dialog[open])scroll lock, leaving the reference-counteduseScrollLockinsideDialogContentas the single owner, so the page no longer jumps on open. The modal entrance duration is a literal150msinstead of the anchored tier's--ui-content-enter-duration.- Copy path:
stepper.cssmoves out of thestepperandhorizontal-stepperfile lists intostepper-variants, which both already depend on, so installing either brings the stylesheet once;toastpicks up afocus-restoredependency on@diffgazer/keys.
Patch changes
- The marker rail reserves its lane with a side-scoped
border-l-transparent, soNavigationListseparators render at their variant color (border-b-border/50) and a consumer-passed bottom-border color no longer tints the rail into a second vertical line. - A
ScrollAreaoverlay thumb that is turned back on while mounted (overlayororientationchanged) shows immediately instead of staying invisible until a scroll or resize, and its hover color applies reliably.
0.2.0
Minor changes
- Added
FloatingPanelas the shared anchored-surface primitive used byPopover,Select, and related floating UI. - Raised the
@diffgazer/keyspeer floor to>=0.2.0. - Renamed the decorated input wrapper to
InputGroupand addedFieldfor label/control/description/error wiring. - Normalized public form-like controls on
value,defaultValue, andonChange(value)while native wrappers keep native React event handlers.
Removals
PopoverContent.externalOnAnimationEnd— was a leaked internal prop. NativeonAnimationEndcontinues to flow through via spread props..animate-slide-in/.animate-slide-outclassName-driven animation onPopoverContentandSelectContent. The.ui-floating-panelcascade replaces them and is overridable per side without className escalation.
Changes
SelectsideOffsetdefault changes from0to4so the menu reads as a distinct surface anchored to the trigger.- Reduced-motion behavior is now token-driven: under
prefers-reduced-motion: reduce, all eight--ui-content-{enter-from,exit-to}-*tokens collapse to the fade-only keyframes. Per-instance overrides win.
Patch changes
- Regenerated package artifacts from source during verification instead of tracking deterministic generated docs and CLI bundles.
- Documented install paths, shadcn namespace setup, and keyboard integration.
0.1.0
Initial publish candidate. Public npm and hosted registry endpoints were gated until the package publication checks passed.
Components
Accordion, Avatar, Badge, Block Bar, Breadcrumbs, Button, Callout, Card, Checkbox, Code Block, Command Palette, Dialog, Diff View, Divider, Empty State, Horizontal Stepper, Icons, Input, Kbd, Key Value, Label, Logo, Menu, Navigation List, Overflow, Pager, Panel, Popover, Progress, Radio, Scroll Area, Search Input, Section Header, Select, Sidebar, Skeleton, Spinner, Status Indicator, Stepper, Switch, Tabs, Textarea, Toast, TOC, Toggle Group, Tooltip, Typography.
Features
- CLI install paths through
dgadd init,add,list,diff, andremove. - Two-layer CSS variable theme system with the Diffgazer monochrome palette.
- Dark-mode default with
[data-theme]switching. - Tailwind 4 and CVA component variants.
- Keyboard behavior through copied hooks or
@diffgazer/keys.