@workspace/ui

Every change, on the record.

Every consumer-facing change to Faber UI, generated from changesets on release. Each entry links to the commit and pull request that shipped it.

Latest
v0.3.0
Released
Sep 29, 2026
Releases
5
Changes
38

38 of 38 changes

  1. v0.3.0

    Latest
    minor

    Minor changes6

    • Calendar keeps day buttons mounted across renders and renders week numbers as row headers.

      CalendarDayButton no longer takes a locale prop, and its data-day attribute is now the ISO date (2026-09-28) instead of a locale-formatted string that could differ between server and browser.

    • NavigationMenu drops the broken NavigationMenuIndicator export, highlights active links through data-active, and times its popup with the kit motion tokens.

      NavigationMenuIndicator wrapped the trigger icon part and styled attributes Base UI never sets, so it rendered nothing useful. Remove any import of it.

    • Popover, DropdownMenu, ContextMenu, Menubar, Select, Combobox, HoverCard, Tooltip, Dialog and AlertDialog enter and exit with interruptible transitions on the kit easing tokens, and tw-animate-css is no longer a dependency.

      A popup closed halfway through opening now reverses from where it is instead of restarting. Anchored popups scale from their trigger with motion-popup, dialogs use motion-modal and their overlays motion-backdrop, exits run faster than entrances, and reduced motion now collapses the scale and travel of every popup. Select skips the animation while its list is aligned over the trigger. If you target the old animate-in, fade-in-0 or zoom-in-95 classes, move your overrides to data-starting-style and data-ending-style.

    • Every component now installs the theme item, so the tokens and utilities it relies on reach your project instead of silently doing nothing.

      The first shadcn add copies the stylesheet into styles/faber/. Import it once from your global CSS, after Tailwind:

      @import "tailwindcss";
      @import "shadcn/tailwind.css";
      @import "../styles/faber/index.css";

      Remove the default :root, .dark and @theme inline blocks that shadcn init generated, or keep them after the import only to override values.

    • TooltipProvider now waits 400ms before the first tooltip opens, and tooltips opened right after it appear instantly with no animation.

      Pass delay={0} to TooltipProvider to keep the previous behavior.

    • Button, Toggle, Tabs and NavigationMenu ship their style configs from @workspace/ui/lib/*-variants so component files export only components.

      buttonVariants, toggleVariants, tabsListVariants and navigationMenuTriggerStyle are no longer exported from the component modules. Update imports:

      import { Button } from "@/components/ui/button";
      import { buttonVariants } from "@/lib/button-variants";

      shadcn add installs the matching lib/*-variants file alongside the component.

    Patch changes25

    • Accordion panels open and close with an interruptible height transition on the kit tokens.

    • Button presses scale to --scale-press with the press utility instead of shifting down a pixel.

    • Carousel follows the document direction, maps arrow keys to its orientation, and leaves arrow keys alone inside inputs within a slide.

    • ChartContainer accepts only color values made of safe characters, closing an injection path through the generated style tag.

    • CommandDialog opens and closes without animation, as a keyboard-invoked palette should, and its accessible title renders inside the dialog.

    • ContextMenu highlights a submenu trigger while its submenu is open.

    • The dark variant matches with zero specificity, so hover and state classes such as hover:bg-input/50 on the outline Button also apply in dark mode.

    • Checkbox, RadioGroup and Label show their disabled styles, which previously never applied because the controls render a span.

    • BreadcrumbEllipsis and PaginationEllipsis expose their "More" labels to screen readers.

    • The font tokens fall back to the system stacks when --font-sans-src, --font-mono-src or --font-serif-src is not defined.

    • Input, Textarea, NativeSelect, CommandInput and ComboboxChipsInput use 16px text on small screens so iOS Safari no longer zooms the page on focus.

    • MessageAvatar lines up with the last bubble when a MessageFooter is present, instead of sitting 8px too high.

      MessageFooter now has a fixed 16px line height and the avatar shifts by exactly the footer plus the content gap.

    • Transitions using transition-control now animate, Drawer and Sheet use the drawer curve, the Sidebar collapse eases instead of moving linearly, and MessageScroller exits faster than it enters.

      transition-control set only transition-property, so the colors it covered changed instantly. It now reads duration-* and ease-* like the built-in transition utilities.

    • Tabs and ToggleGroup pass orientation to Base UI, so vertical layouts get aria-orientation and Up/Down arrow navigation.

    • Spinner and other animate-spin loaders pulse under reduced motion instead of stopping after one turn, and the new --travel-sm and --travel-lg tokens collapse movement to zero.

    • Registry components import from your own aliases, such as @/components/ui/button and @/lib/utils, instead of the unresolvable @workspace/ui/... paths.

    • Sheet, Drawer and Sidebar keep the border and the slide direction on the side named by side, which were reversed in right-to-left layouts.

    • Nested data-brand and data-neutral scopes now re-theme semantic tokens such as --primary, and a nested neutral no longer resets the brand around it.

    • SidebarProvider ignores the toggle shortcut while typing in a field, accepts it with Shift or Caps Lock, and no longer re-subscribes on every toggle; Sidebar forwards className and props on mobile.

    • Slider renders a single thumb when value or defaultValue is a number.

    • Slider thumb is a solid circle at every radius preset, filled with foreground in dark mode instead of rendering as a dark hollow square.

      The thumb used rounded-md, which only looks round when --radius is large; at the default 0.3rem it rendered as a rounded square. It now uses rounded-full, matching the Switch thumb.

    • KbdGroup is typed as a kbd element, Combobox imports its Base UI subpath, the motion lib mirrors the exit easing and travel tokens, and the chart item declares its react-is peer.

      Unused classes that Base UI and Sonner never target were removed from Toggle, ResizablePanelGroup, Toaster and InputOTP, along with the unused hairline, mask-fade-t, press-subtle and transition-control-transform utilities.

    • Translucent menu surfaces keep their background blur while a long list scrolls.

    • Switch sits at a whole-pixel 16px height, so its thumb is inset 1px on every side instead of rendering off-center.

      The default size was 16.6px tall, which left a fractional vertical gap that browsers rounded unevenly. The sm size keeps its dimensions.

    • useIsMobile reads the viewport through useSyncExternalStore, so Sidebar no longer mismatches on hydration when a page loads on a phone.

  2. minor

    Minor changes1

    • Resizable pins react-resizable-panels to 4.14.1.

      No action needed. ResizablePanelGroup, ResizablePanel, and ResizableHandle keep the same props and markup; installs via shadcn now resolve the latest 4.x release.

  3. patch

    Patch changes1

    • Pad the Select list so options no longer sit flush against the popup edge, reserve room for the selected-item check, and scope the Shiki dark-theme rule to code tokens so code block chrome keeps its own colors.

  4. patch

    Patch changes1

    • Release coverage for the audit batch already shipped in 0.1.0: token, accessibility, and correctness fixes with no additional consumer-facing API changes.

  5. minor

    Minor changes2

    • Registry items now publish exact dependency versions. Previously every item listed bare package names, so shadcn add installed the latest release of @base-ui/react, recharts, and twelve others — versions the components were never tested against. The registry build now reads versions from packages/ui/package.json, and warns when a component imports a package that is not declared there.

    • Accessibility, correctness, and token fixes across the kit, from a full code-smell audit.

      Calendar no longer remounts its subcomponents on every render (Root, Chevron and WeekNumber are hoisted; the DayButton wrapper is memoized), formats the month dropdown with date-fns instead of the runtime locale, and focuses days without scrolling. Carousel removes its reInit listener on unmount. SidebarMenuSkeleton widths are deterministic across server and client, SidebarRail is keyboard-focusable with its accessible name intact, and the sidebar cookie is now SameSite=Lax (+Secure on https).

      Overlays resolve through the new bg-overlay token instead of a fixed bg-black/80, the slider thumb uses bg-background, and new --secondary-hover, --muted-hover and --bubble-tinted(-hover) semantic tokens replace inline color-mix()/oklch() in Button and Bubble. Table is a Server Component again with scope="col" headers, Field only sets role="group" when labelled, and EmptyDescription renders the p its type always promised.

      ChartStyle sanitizes config keys/colors and the chart id, and the recharts overrides target stable shape classes instead of default presentation attributes. durationSec derives from duration, the deprecated ComponentPropsWithRef is gone, and the unused zod dependency is removed.

    Patch changes2

    • Restore open and close animations on every menu-family popup. animate-none! compiled to animation: none !important, which beat the non-important animation shorthand that data-open:animate-in sets, so DropdownMenu, ContextMenu, Menubar, Select and Combobox opened and closed as hard cuts. MenubarContent additionally had no exit classes at all, and Dialog now uses the same 200ms as the shadcn reference rather than 120ms.

      HoverCard was the only component with a non-zero alignOffset. With align="center" Base UI maps it onto Floating UI's crossAxis, so the card sat 4px off-centre from its trigger on every open.

      Interactive elements built from divs now get a pointer cursor: the base rule only covered button and [role="button"], while menu items, options, tabs and switch/checkbox/radio roles either inherited the default arrow or explicitly set cursor-default.

      Also removes eight dead data-[motion=*] classes from NavigationMenu. Those are Radix attributes that Base UI never emits, and they compiled to twelve CSS rules that could never match.

    • Reformat component sources to match the repository Prettier configuration, and add a format:check script so drift is caught in CI rather than accumulating.

Generated from packages/ui/CHANGELOG.md. Versioning follows semver: minor releases carry changes consumers must adapt to, patches are fixes and additions.