Theme: Smoke
Background: Field
Theme: Smoke
Background: Field
System

Release log

One entry per npm release

What each published version of Rift DS shipped, newest first. The log is one to one with npm: an entry is written when a version is published, and never otherwise, so this page and the registry always tell the same story. The versions published before the package was renamed are listed beneath it.

Contributions

The system is built in public: every commit lands on GitHub. This is the real activity, pulled live from the account that builds Rift DS.

Releases

  1. November 7, 20261.25.0 — Components for building apps, money and dates, and ShaderScene

    Twelve new components cover what a real app screen needs. Heading, Text, Link and List open a typography category. DescriptionList, ErrorSummary, CurrencyInput and MaskedInput handle data and forms, with `fieldErrorsFrom` turning a server's errors into the summary and a per-field `errorText`. DateRangePicker and Deadline handle dates, and SignaturePad and DocumentViewer handle documents.

    `rift-ds/format` is a new subpath of pure helpers: money as decimal strings, added without floating-point drift, and relative and time-zone dates. Input gains `prefix`, `suffix`, `clearable`, `errorText` and `action`; Field gains `errorText`; Widget gains `description`, `footer`, `padding` and `collapsible`; and an attachment with a `fileUrl` now shows a PDF or a text file in place in the file viewer.

    ShaderScene paints a horizon or a rift in the theme's ambient colours, with a scrim, a vignette, fades and grain, and a pale tint on a light page. It reports its status the way ShaderField does and pauses off screen. Nothing published was renamed or removed, so upgrading needs no code changes.

  2. November 7, 20261.24.0 — One app shell in three modes, and the Signal theme

    Every app shell now draws from one recipe in one of three modes: `flush`, edge to edge behind a hairline; `floating`, the rail raised as a card; and `inset`, the rail flush beside a raised content surface. AppLayout, AppSidebar, the `app-shell` block and ChatWidget all read it, so their gap, edge and background agree. The edge belongs to the mode: floating and inset are raised, and flush never is.

    ChatWidget takes `layout` to sit as a page in any of the three modes, and `backdrop` (`solid` or `blur`) for what the flush layout lies on. When there is not room for a raised mode, it falls back to flush on the solid backdrop. Its `fit` widgets now hang under a centred composer. The rails share one geometry: the collapse toggle has a tooltip and hover pill, ThemePicker's swatch has a tooltip, and group headings are in mixed case.

    The passive hover and active washes are a step lighter in both colour modes. The Aubergine preset is now Signal: safety-orange buttons with navy labels, navy headlines on a cool blue-grey page, the logo on the orange and blue-led chart series. Its id is still `plum`, so `data-brand="plum"` and its stylesheet path are unchanged. Nothing published was renamed or removed, so upgrading needs no code changes.

  3. November 6, 20261.23.0 — A chat that proposes changes, one recipe for chat cards, EntitySwitcher and Aubergine

    A chat can now propose a change and wait for the reader to confirm it. `rift-ds/chat/actions`, a new subpath with no dependencies, holds `defineAction`, `planAction` and the confirmation mark a page and its route share. ActionCard is the proposal, with Confirm and Dismiss, then the record of what happened, with Undo; given `facts`, it lists what the change will do over Confirm and keeps them once confirmed. ActionReadout is what a confirmed change did. A card sent with `lead` opens the reply under a status line that keeps running, so the thinking never moves it.

    A chat can also follow what the reader is looking at: ChatWidget's `context` object, `useSelectionFocus`, `useHeldHighlight` and `describeSelection` for a highlight and what it sits in, `getContext` on ChatProvider, and starters a model writes for the focus with `createStartersHandler` and `useGeneratedStarters`. Every card a reply carries now reads one recipe, with the new `--color-chat-card-bg` fill.

    EntitySwitcher is new, for the company, team or account a screen is scoped to, and so is the Aubergine preset. Two defaults moved: ChatWidget's `contextPlacement` is now `inside` (it was `above`), and a docked panel takes the overlay once the page loses the room the dock needs. `contextLabel` and `contextNote` are deprecated in favour of `context`. Nothing published was renamed or removed.

  4. November 3, 20261.22.0 — Chat cards, composer sizes and a sturdier colour mode

    A chat reply can now carry several cards, or be a card with no text. `useChatAgentState` from `rift-ds/chat` reports what the agent is doing to an entry button, and ChatLauncher keeps a reply's progress on show after the panel closes. ChatWidget takes `contextPlacement` to put its context note above the composer or inside it.

    The composer now sizes itself to what it holds. A ChatWidget with nothing for the footer renders the one-row `inline="chat"` composer. Four defaults moved: `maxRows` is 12 in a chat composer (it was 8) and 3 in the mini composer (it was 1), and `size="compact"` now changes only the mini composer.

    The script from `colorModeScript()` now puts the visitor's colour mode back when a hydration failure at the root makes React rebuild `<html>` and drop its attributes. Nothing published was renamed or removed, so upgrading needs no code changes.

  5. November 2, 20261.21.0 — Search keeps up on large tables

    Search on a large DataTable no longer holds up typing. The field takes each key at once and the rows follow a moment later, under a thin progress line. Each row's text is read once per `rows` array, so an app that changes a row's values in place should pass a new array when its rows change. An inline `columns` array no longer costs a scan on every render, and selecting many rows no longer slows down with the square of the row count.

    When a TableToolbar AI command changes the view, the table now draws skeleton rows, then the new rows, then the toast. `MOTION_TABLE_COMMAND_SKELETON_MS` in `rift-ds/tokens/motion` sets how long the skeleton rows stay. Nothing published was renamed or removed, so upgrading needs no code changes.

  6. November 2, 20261.20.0 — Form controls submit, and every component has a schema

    Ten form controls now reach an enclosing form under `name`: Checkbox, RadioButton, RadioGroup, ToggleSwitch, PinInput, Dropdown, RichDropdown, TagInput, TimePicker and SelectionCard. A form using them will start receiving values it used to leave out, so check anything that rejects unknown fields. They submit through hidden inputs, which browsers leave out of validation, so `required` does not block a native submit on them; validate these fields in your app or on your server.

    Every component now has a JSON schema at `/schema/components/<slug>.json`, generated from its props interface. `rift-ds/tokens/values` gives every token's value in every theme and mode, and the same values are published as DTCG files.

    SegmentedControl takes `cycle`, one circle that steps through the segments. AppSidebar takes `collapsedFooterSlot`, and a click on the collapsed rail's empty space expands it. A tab's `panelId` writes its `aria-controls`, an inline Composer can grow, and `--color-icon-bg` and `--color-label-bg` are new. Light surfaces take a softer tint, and Forest and Volt are retuned.

    TableToolbar folds whenever search and Filter no longer fit, long labels end in an ellipsis instead of being cut, and rows in several components wrap on a phone. Nothing published was renamed or removed, so upgrading needs no code changes.

  7. October 31, 20261.19.1 — Clearer status colours and a lighter neutral outline

    Status colours read more clearly in light mode: Badge, Alert, Banner, Toast and the other status surfaces use a stronger fill and more colourful text, and the neutral role moves to a lighter fill so it no longer outweighs the coloured ones. The outlined neutral button takes a lighter edge in both modes, matching a SegmentedControl beside it.

    TableToolbar's icon buttons are now outlined neutral instead of filled grey, and AttachmentViewer and BentoTile use the same outline. The Smoke theme charts in colour from the same muted ramps as its badges, while its accents and background stay grey.

    A selected SegmentedControl icon's tooltip no longer turns nearly invisible, and the Zest theme's positive text holds AA on the stronger fill. Nothing published was renamed or removed, so upgrading needs no code changes.

  8. October 31, 20261.19.0 — Describe a table and it changes

    TableToolbar takes `command`: a Describe button at the start of the bar turns the whole row into a composer, the way selecting rows turns it into the bulk bar. Your handler turns the sentence into a table view, and the library calls no model. A change lands in a toast with an Undo for 10 seconds, and an error lands in a toast that stays, with the table left alone and the text back in the composer.

    Composer takes `inline` and `size`: `size` is the default and compact density a table uses, and `inline` puts everything on one row at that density's control height. Toast takes `action` in the stack as well as standalone, and `useOptionalToast` lets a component join the host's stack or bring its own.

    Bar, stacked bar and combo charts now draw bars as a wash of their series colour. TableToolbar moves Group and Columns into More under 480px, AppSidebar shows counts on the collapsed rail, and tooltips always paint in the top layer. Nothing published was renamed or removed, so upgrading needs no code changes.

  9. October 29, 20261.18.0 — Stats that restack themselves

    Stat takes `deltaPlacement="auto"`: the delta sits beside the value while the stat has room and drops under the label once it is narrow, such as two KPI tiles side by side on a phone. It reads its own width with a container query, so it restacks wherever it sits.

    ChatWidget's history rail takes a footer through `threadsProps.footerSlot`, for controls or a link out, shown in both seats and faded out while the inline rail is collapsed.

    AppSidebar's panel mode now opens and closes with the logo, every icon and the avatar holding their place, and its inset layout draws a divider between the rail and the side panel. The app shell block's top bar stays in view over a blur, and the dashboard block's stats restack on a phone. Nothing published was renamed or removed.

  10. October 29, 20261.17.0 — An inset layout for app shells

    AppLayout and AppSidebar take a `layout` prop: `flush`, `floating` or `inset`. Inset runs the rail flush on a shell colour and sets the content full width in a surface inset from the other edges, which scrolls inside itself, with a side panel joining the rail. Two colour roles name the planes, `--color-bg-app-shell` and `--color-bg-app-surface`. AppSidebar's boolean `floating` is deprecated in favour of `layout="floating"` and keeps working.

    ChatLauncher takes `surface="inset"`: docked beside an inset layout, the panel goes flat on the surface colour at the same gap and its widen grip follows, and as an overlay it takes the gap but keeps its shadow.

    Icon-only SegmentedControl strips now show their labels as tooltips on hover and keyboard focus, and the label stays each segment's name. ThemeToggle defaults to `size="default"`, and TableToolbar starts the table on its active view, offers "is none of" for enum filters and keeps a narrow bulk bar from overlapping. Nothing published was renamed or removed.

  11. October 28, 20261.16.0 — A site header, its mega menus and a progressive blur

    `SiteHeader` is the sticky top bar the docs site runs on: section pills that open mega menus, a blur that dissolves into the page as it scrolls, and a fold to a drawer when the pills no longer fit. Its parts ship on their own too: `MegaMenu`, a wide panel of icon rows beside an optional featured card, and `ProgressiveBlur`, a backdrop blur that fades out along one edge.

    Drawer takes a `heading` that puts content such as your logo where the title text shows, while `title` stays as the dialog's hidden accessible name. `Nav` is deprecated in favour of `SiteHeader` and keeps working.

    In a QuestionCard set, picking an option now only marks it and Next moves on, so a slip can be changed before the step passes. A radio is always a circle and a checkbox a rounded square whatever the theme's radii, and their unchecked ring takes a new `--color-input-indicator-border` that clears 3:1 in both themes. Nothing published was renamed or removed.

  12. October 26, 20261.15.0 — Your locale, your keys, your reading direction

    Every number and date a component prints is now written in a locale you choose. Wrap your app in `LocaleProvider` (`rift-ds/behaviors/LocaleProvider`) and the charts, tables, calendars, pickers, counters and percentages take your locale's digits, decimal and percent marks, month and weekday names, first day of the week and clock; a component's own `locale` prop wins. It formats and never translates: words stay props.

    `useShortcut` (`rift-ds/behaviors/shortcuts`) binds keys with a short string, `mod+k` for Cmd+K on a Mac and Ctrl+K elsewhere, through the one listener the components use, so a shortcut stays quiet in a text field and never takes Escape from an open overlay. `useRegisteredShortcuts` lists the live bindings for a help dialog, and Kbd, the command palette and the menus take `keys` to draw a shortcut for the reader's platform.

    Set `dir="rtl"` on `<html>` and every component lays itself out right to left: sides and insets, slides and toggles, arrow keys and drags, mirrored icons, and menus that line up with their trigger's leading edge. Drawer, the popups and table columns take `start` and `end` beside `left` and `right`.

    Themes can colour the logo, display type, headings and running text apart from the action colour, and Marquee joins as the twelfth theme. Nothing published was renamed or removed. Numbers and dates now default to `en-US` rather than the browser's locale, chart value axes group long numbers, and the command palette trigger draws Ctrl K off a Mac.

  13. October 26, 20261.14.0 — The tables release

    DataTable is rebuilt on a headless engine, TanStack Table. A column's `type` (text, status, person, currency, number, progress, date, tags, checkbox, link) draws, aligns, sorts and filters it with no render function. The table sorts by several columns, resizes, moves, pins and hides them, filters from each header, edits cells or whole rows in place, groups rows with totals, opens row details and saves its setup as views. Past 200 unpaged rows it draws only the rows in view, and `manual` hands sorting, filtering and paging to your server, with loading and failed-load states built in.

    `TableToolbar` is the control bar over a table: search, filters as chips, sort, group, columns, density, saved views, a bulk bar for selected rows and the page's primary action. In a DataTable's `toolbar` slot it needs no props, and on a phone it folds to icons with its panels opening as sheets.

    For starting an app, `rift-ds/tokens/base.css` is the reset and page the components are tuned against, `ThemeToggle` with `colorModeScript` sets the colour mode before first paint, `npx rift-ds init app` wires a Next.js app, and `npx rift-ds init block <name>` copies in a whole starting page. `ThemePicker` and `CommandPaletteTrigger` join the library, AiButton shows what an agent is doing through `state`, and every menu, list and popover is placed so a clipping container cannot cut it off.

    Nothing published was renamed or removed. Initials avatars now take a colour fill picked from the name (pass `fill="neutral"` for the grey), a table narrower than a phone shows "Page X of Y", and `@tanstack/react-table` and `@tanstack/react-virtual` install with the package.

  14. October 23, 20261.13.0 — One drawing per control

    Every checkbox, radio, switch and chosen mark in the library is now the same one. Checkbox, RadioButton and ToggleSwitch export their indicators (`CheckboxIndicator`, `RadioIndicator`, `SwitchIndicator`) as small presentational pieces, and SelectionCard, QuestionCard, InspectorToggleSwitch and FilterBar compose them instead of drawing their own. Add the `ds-control-host` class to a host that is itself the control and its indicator lights on hover exactly as the standalone control does.

    `ChosenMark`, exported beside Dropdown, is the one trailing check a listbox or menu row shows on its selected item, drawn by Dropdown, Combobox, RichDropdown, TimePicker, ModelPicker, DropdownMenu and ContextMenu. `CheckIcon` and `MinusIcon` are the one SVG check and minus every control draws, the switch thumb included, and `rift-ds/behaviors/visually-hidden.css` carries the one `ds-visually-hidden` class for text that is read but not seen.

    The surfaces follow one rule per family: a choice offered as a row (SelectionCard, QuestionCard) wears Input's surface, a card that holds content takes the container surface, a row inside an overlay sits at the inner radius step, and the current item of a navigation list holds the passive active token. Dialog, Drawer and CommandPalette close through CircularButton, and ModelPicker's effort row is a SegmentedControl. Nothing was renamed or removed, so upgrading needs no code changes.

  15. October 21, 20261.12.0 — Links go through your router

    Links in a routed app now navigate without reloading the page. Wrap your app in `LinkProvider`, published as `rift-ds/behaviors/LinkProvider`, with Next.js's `Link` or your router's, and every client-rendered component below it renders its links through the router, the chat's answer links included.

    Every component that takes an `href`, its own or an item's, also takes a `linkComponent` prop that wins over the provider; NavList, SourceTrail and AppLayout pass it on to the parts they render. Breadcrumb, CircularButton, LinkList, ThreadPanel and WidgetRow can render in a Server Component, where no provider reaches them, so pass the prop on the instance there.

    The Smoke theme carries more colour, so its status colours no longer read as grey. Nothing was renamed or removed, and with neither the provider nor the prop set every link stays a plain `<a>`, so upgrading needs no code changes.

  16. October 21, 20261.11.0 — One contract, one layer stack, every word translatable

    Every component now forwards its ref to its element and passes your own attributes through, and state you can own works controlled or uncontrolled through one pair of names: `value`, `defaultValue` and `onValueChange`, and the same shape for `checked`, `values` and `open`. Textarea and Slider gain `defaultValue`, and NotificationCenter, AgentRail and ChatAgentPane move to `value`.

    Every word a component writes, announced or on screen, now has a prop with its English default, so a product in another language can translate all of it; the chat widget passes the words through per part, and the chat guide shows a full set. Colour moves to `tone` on Button and the actions around it, backed by a destructive token family at AA, and BentoTile and BentoTileArt join the library.

    A few behaviours shift on their own. Popovers, menus, pickers and tooltips now close through the same stack as the modals, so inside a Dialog the first Escape closes the menu and the second the Dialog. The native `aria-label` beats the deprecated `ariaLabel`, Combobox submits its selection rather than the search text, and every chart is a client component, so importing one into a Server Component works. Nothing was renamed or removed: the older names keep working, so upgrading needs no code changes.

  17. October 18, 20261.10.0 — Questions in the AI chat

    The chat can now ask. When a reply needs a decision before it can go on, it ends in a question with the answers to pick: one answer, several, or a short set asked a step at a time, with a "Something else" field when the list may not cover it. The answer is sent as the next message, and the card stays in the conversation as the record of the choice. On the server, `askUser` on createChatHandler gives the model the tool it asks through, and `npx rift-ds init chat` now writes it on.

    QuestionCard is a library component of its own, for use outside the chat, with QuestionSummary as the record of a set. PromptSuggestions gains `value`, which keeps a used row as the record of the choice, and ChatThread and ChatWidget gain `flow`, where `bottom-up` is the classic message thread beside the send-to-top default. The breakpoints are published as `rift-ds/tokens/breakpoints`, and every stacking layer is a `--layer-*` token.

    A few behaviours shift without any change on your side. A follow-up chip once sent stays as the record and no longer takes a tap, a reply that asks gets no follow-up chips, and the `rift-ds/chat/demo` story now asks its questions instead of carrying buttons in its cards. Nothing was renamed or removed, so upgrading needs no code changes.

  18. October 14, 20261.9.0 — An artifact panel for the AI chat

    The chat can now open what it makes in a panel beside the conversation. Set `artifacts` on ChatWidget and a reply can carry a dashboard, a page or a file: the thread shows a tile, and the tile or a header button opens it. On a narrow chat it rises as a sheet. The panel can be dragged wider or expanded to fill the chat, and a page drawn in it runs in a sandboxed frame with its source one switch away.

    An artifact travels as an ordinary card, so a server that already sends cards can send one. ArtifactPanel and ArtifactCard are library components of their own, for use outside the chat, and `rift-ds/chat/demo` adds a dashboard and a web page to its scripted conversation.

    Two layouts shift without any change on your side. The agent panel now sits beside the conversation from 760px of chat width, where it waited for 860px, and gains a close button and a solid background. ThreadPanel keeps one inset whether collapsed or expanded, so its marks no longer move when it opens, and its expanded content sits 8px closer to each edge. Nothing was renamed or removed, so upgrading needs no code changes.

  19. October 13, 20261.8.0 — The AI chat as an installable widget

    The chat is now one thing you install. `rift-ds/chat` holds the whole assembly: ChatProvider keeps the conversation, ChatWidget is the panel, and ChatLauncher is the floating button that opens it. Replies stream, follow-up questions and thumbs come built in, and the conversation survives moving between pages. The engine under it is exported too, for a chat with your own UI.

    The launcher's header menu docks the panel to the right or left edge, or floats it as a card the visitor moves and sizes. The server side ships beside it: the streaming handler for Claude in `rift-ds/chat/server`, optional rate limits and a daily budget over Upstash in `rift-ds/chat/upstash`, and a scripted conversation in `rift-ds/chat/demo` that runs with no model or key.

    `npx rift-ds init chat` scaffolds all of it into a Next.js app: the routes, the mount and an env example, starting in demo mode and never overwriting a file. Six ambient tokens now colour the ShaderField background, and most theme presets key the AI gradient to their own action colour. Everything is additive, and the chat's dependencies are optional peers, so upgrading needs no code changes.

  20. October 11, 20261.7.0 — Mentions for chat, thread status dots, and three agent skills

    A chat input can now reference people, files and skills. Mention is the inline tag, MentionMenu the list a trigger opens, and MentionText draws a sent message with its mentions as tags. Composer takes a mentions prop: typing @ or / at the start of a word opens the menu, and the value stays a plain string throughout.

    Threads say what state they are in. ThreadPanel rows and ThreadTabs tabs carry a status (idle, working, unread, waiting or error), drawn by StatusDot, which gains an 8px size for list rows, a hollow outline for a settled state, and a decorative mode so a list of dots is not a list of announcements. The old unread flag still works and is deprecated.

    `npx rift-ds init` now installs three agent skills instead of one: the library skill, with a new reference of every token and its light and dark value, a skill for restyling existing screens onto the system, and one for auditing styles against the tokens. The command reads the list from the site, so later skills arrive without a package update. Add --skill to install one, and use --dir in place of --out, which still works. Everything is additive, so upgrading needs no code changes.

  21. October 10, 20261.6.0 — Generated avatars, a dashboard tile, and prompt cards

    Anything with a name can now have a mark. PixelAvatar draws a small pixel character from a name, the same character and colour every time, so a project or workspace needs nothing designed or stored. AppSidebar rows can use it in place of an icon, and ThreadPanel projects wear it by default instead of a folder. In a list, the colours are spread so neighbours never match.

    Widget is a new titled tile for dashboards and home screens, with rows, labelled groups, and a grid that packs tiles of different heights into columns. PromptSuggestions gains two layouts for an empty-state home screen: tiles, an icon over a label and a line of description, and cards, with the icon in a tinted cover.

    SourceChip gains hover and pressed states and can preview its source in a floating panel. Everything is additive, so upgrading needs no code changes; pass a folder icon to a ThreadPanel project to keep its old look.

  22. October 10, 20261.5.0 — A selected state for menus, and retuned themes

    Menu items can now show a current choice. Give the items of a DropdownMenu or ContextMenu a selected value and they become a set of radio items: the chosen one holds a quiet fill, full-strength text and icon, and a trailing check. Plain action items are unchanged.

    Three theme presets take new typeface pairings: Bubblegum sets Fredoka over Nunito, Velvet sets Playfair Display over Plus Jakarta Sans, and Volt sets Space Grotesk over Manrope, with the faces shipped in the package. Tinted themes are brighter in light mode, where the two lightest surfaces carry half the tint they did. The Fraunces and Work Sans font files leave the package, since no preset uses them. Nothing else is removed, so upgrading needs no code changes.

  23. October 9, 20261.4.0 — File attachments for chat

    Four new components for files in a conversation. AttachmentTile draws one file as a square: a picture fills it, a PDF, spreadsheet, document or presentation wears a coloured mark, and every other file wears its extension as a neutral badge. AttachmentGroup lays out the files on a sent message, AttachmentViewer opens them in a preview dialog, and AttachmentDropZone lets a file be dropped anywhere on a chat. A headless hook, useAttachments, owns the list of files and their previews.

    Composer now takes files: an attach button, paste and drop feed a row of tiles above the input, and a message can be files alone. ChatMessage shows a turn's files above its bubble. Four new file-format colour tokens keep the colour each format is known by in every theme. DocumentChip is deprecated in favour of the tile and keeps working. Nothing breaks, so upgrading needs no code changes.

  24. October 2, 20261.3.0 — InspectorColorPicker and the action colour

    InspectorColorPicker joins the Inspector family: the library colour picker dressed as one bar, with its name on the left and the colour on the right. A new motion token, the orbit duration, paces Globe's spin, so a theme's motion scale now reaches it, and Composer can place its context note above the input with contextPlacement="above".

    The action colour is now kept for actions. Spinner, FileInput, Sparkline, the bar charts, Timeline's links, Instructions and DatePicker's today ring each use the role that fits instead, and a build check stops new decorative uses. Every action fill also holds contrast with its label and icon in every state, which repairs the Volt preset, and Treemap labels pick a readable colour for each cell. Nothing breaks, so upgrading needs no code changes.

  25. September 30, 20261.2.0 — The Inspector family

    Six one-row controls for tool panels and settings rails: InspectorSlider, InspectorInput, InspectorToggleSwitch, InspectorSegmentedControl, InspectorDropdown, and InspectorSection to group them. Each is one bar with its name inside, sized and shaped like Button, so a dense panel of settings stays light. They sit beside the form controls rather than replacing them.

    SegmentedControl's track corner now counts its hairline, so on a theme with squarer pills it stays parallel with the sliding pill. Nothing breaks, so upgrading needs no code changes.

  26. September 27, 20261.1.0 — Mobile app navigation

    Three new navigation components. BottomNav is the tab bar of a mobile app, drawn in the Rift style, as the iOS Liquid Glass capsule, or as the Material 3 Expressive bar. TopAppBar is the header of a mobile screen, with a title that collapses as the page scrolls. SidebarPanel lists one section's pages, on its own or beside AppSidebar as a third navigation level.

    Screen readers get more to work with: charts are named by their title, Nav names its landmark and accepts native props, and Stepper announces its steps. Nothing breaks, so upgrading needs no code changes.

  27. September 26, 20261.0.1 — A readable package page

    No code changed. 1.0.0 shipped with the README's banner image as a relative path, which npm cannot resolve against the repository, so the package page opened with a broken image. This release carries an absolute one.

    The banner is now generated from the repository URL rather than typed by hand, alongside the npm badge that already worked that way, so it cannot drift again.

  28. September 26, 20261.0.0 — The first Rift DS release

    Rift DS is on npm. `npm install rift-ds` gets you 133 React components built on 255 semantic design tokens, with light and dark modes in the box and React as the only required peer dependency.

    Theming is plain CSS custom properties. There is no provider to mount and no config file to write: every semantic token chains to a primitive, so overriding a handful of primitives restyles everything built on them, the charts and the ambient background included. Eleven complete themes ship as generated stylesheets, and setting one `data-brand` attribute on the root element applies a whole look, self-hosted typefaces and all, with no runtime JavaScript.

    The Recharts-backed charts live behind their own entry point, so `recharts` stays an optional peer dependency you install only if you use them.

    Coding agents are treated as first-class consumers. `npx rift-ds init` installs an agent skill into your project and prints the MCP connect line, and the public MCP endpoint serves the component catalogue, the prop contracts and the token registry with no key and no account. All of it is generated from the same JSDoc that builds the shipped type declarations, so an agent reads the exact contract the package ships.

    Prefer owning the source? Every component is also installable through the shadcn CLI, or you can clone the repo. All three paths are MIT.

    If you were using the earlier scoped package, this is the same system under its own name. Change your import specifier to `rift-ds` and nothing else moves.

Before Rift DS

Rift DS starts at 1.0.0, but the system is older than that. It first reached npm on July 26, 2026 under an earlier package name, and shipped 22 versions there before it was renamed and restarted on September 26, 2026. Those versions stayed behind on the old name. This is what each one added, newest first.

  1. September 19, 20260.21.0

    The package’s first bin: an init command that fetches the consumer agent skill from the live site into .claude/skills/ and prints the MCP connect line.

  2. September 18, 20260.20.0

    Six components taking the registry to 132: WorldMap, the flat companion to Globe, plus Toolbar, Lightbox, Waveform, AnimatedNumber and StatusDot. Lightbox is the first overlay born on the shared behaviour layer, and the count-up budget joins the motion constants.

  3. September 16, 20260.19.0

    GanttChart and RichDropdown, the heading and body font family roles for split-face theming, AiButton’s signature refresh, Dropdown’s typeface preview, the micro-animation pass (SegmentedControl’s sliding pill, Button’s trailing-icon nudge), and ToggleSwitch labels hugging the track.

  4. September 12, 20260.18.1

    The section-divider rhythm fix. SectionTitle’s rule clearance drops so every divider header runs heading, 20px, rule, 40px, content, and the rule width and Table’s hairlines move onto the border tokens.

  5. September 11, 20260.18.0

    ThreadTabs, the animated strip of open chat sessions, with ThreadPanel’s detail rows, pin marks and projects section; PromptSuggestions’ pending shimmer and entrance stagger; and CommandPalette’s trailing slot for a non-interactive row badge.

  6. September 9, 20260.17.0

    ThreadPanel, the session-history rail for chat products, plus EventCalendar’s selectedDate and whole-cell interactivity on its own calendar colour family, and the toast exit timer on the motion constant.

  7. September 6, 20260.16.0

    The shared overlay behaviour layer under the modal components, with useScrollLock published for host chrome. Also AiButton’s summary panel, Composer’s context note, the status icon step tokens, and overlay listener and timer fixes.

  8. September 4, 20260.15.0

    UsageCard and SourceTrail join the ai category, and Composer gains its working glow. The agent-docs surfaces arrive around the package: per-component markdown contracts, the consumer agent skill, and the MCP roster with example prompts.

  9. August 29, 20260.14.0

    Six components taking the registry to 120: Banner, HoverCard, ImageCompare, Meter, Rating and SplitButton, plus LinkList’s newTab opt-out. The same JSDoc now also feeds the site’s public MCP endpoint.

  10. August 29, 20260.13.0

    Five composition gap-fillers: Gauge, FilterBar, SplitPane, StreamingText and AvatarGroup, plus the stream reveal’s motion constant and the amended JS motion contract.

  11. August 26, 20260.12.0

    The dashboard set from the labs rebuild: Panel, LegendTile, FunnelChart and ComboChart, with live var() chart colours and bare mode, Stat’s trend tokens and inline delta, borderless badges, and AppSidebar’s floating variant, item badges, slots and rebuilt transition.

  12. August 23, 20260.11.0

    The maps category (Globe, MapCallout, MapLegend), plus CardStack and the overline typography face.

  13. August 20, 20260.10.0

    The accessible teal split: the action colour becomes theme-dependent, a deep light-mode fill inverting to a light dark-mode one, with every action pairing at WCAG AA. Also SectionTitle’s optional divider and AppSidebar link rows.

  14. August 17, 20260.9.0

    Nine components taking the registry past 100: AnchorNav plus Stepper, TagInput, NumberInput, TreeView, PinInput, CodeDiff, Sparkline and TimePicker. The published dist also gets its ‘use client’ directives back.

  15. August 16, 20260.8.0

    Five components from the dashboard gap analysis: AgentPlan, ModelPicker, NotificationCenter, DataTable and EventCalendar.

  16. August 15, 20260.7.0

    ShaderField, the WebGL2 ambient background, with Card’s cover slot and the instant motion duration token.

  17. August 11, 20260.6.0

    The composer radius token, ChatMessage’s showActions, and a README that states the chat’s UI-only boundary.

  18. August 9, 20260.5.0

    The chat component set that powers the site-wide chat.

  19. August 1, 20260.4.0

    The ai component category.

  20. July 28, 20260.3.0
  21. July 27, 20260.2.0

    The first release through Trusted Publishing, authenticated by OIDC with no token.

  22. July 26, 20260.1.0

    The first publish, using a granular npm token that has since been retired.