Changelog

Every release of @intentface/ui, newest first.

@intentface/ui

0.9.0

Minor Changes

  • ThreadAdd --thread-scroll (with -duration / -easing longhands) to time every smooth scroll from CSS; any easing works, linear() included.
  • ThreadAdd --thread-scroll-speed to pace smooth scrolls by distance, capped by the duration.
  • ThreadPin the follow while a timing is set; autoScroll decides which scrolls happen and the timing shapes the ones that animate.
  • ThreadAdd data-scrolling on Thread.Root while a timed scroll runs, naming its kind.
  • ThreadFix scrollToMessage scrolling the page around an embedded thread.
  • ThreadFix isAtBottom staying true after scrollToTop or scrollToMessage leaves the bottom.
  • ThreadFix scrolls animating under prefers-reduced-motion when the scroller sets scroll-behavior: smooth.

Patch Changes

  • ComposerFix arrowing through the command list scrolling the page in Safari and Firefox.
  • AskUserFix options scrolled into view ignoring their scroll-margin and the list's scroll-padding.

0.8.0

Minor Changes

  • ChipFix parseChipSegments dropping chips whose label has brackets, and keeping the backslashes encodeChipMarkdown adds before brackets, parentheses and backslashes.
  • ChipBreakingRemove CHIP_REF_PATTERN. Read chip tokens with parseChipSegments.
  • ChipBreakingRemove variant and ChipState from Chip.Root. Style a chip with a class or your own data-variant, and use that value directly where a className, style or render callback read state.variant.
  • ComposerBreakingComposer.Root renders a <div> instead of a <form>. Target [data-composer-root] instead of form, and pass render={<form />} to keep a form.
  • ComposerBreakingComposer.Submit and AskUser.Continue are type="button" and send through the store. Don't rely on them submitting an enclosing form.
  • ComposerBreakinguseComposerSubmit returns onClick in place of type. Spread onClick onto your button and set type="button".
  • ComposerNew submit() on the composer store.
  • ComposerFix Composer.Textarea's required never blocking the submit of a form it sits in.
  • ComposerNew --composer-height, --composer-width, --composer-container-height and --composer-container-width on Composer.Root, and the same numbers as size on the composer store.
  • ComposerNew getServerSnapshot() on the composer store, with size null as the server rendered it. useComposer and useComposerStore hydrate against it.
  • ComposerBreakingComposer.Panel and Composer.Popover render callbacks receive Omit<ComposerState, "size">. Let a separately declared callback infer its argument, or type it with that.
  • ThreadBreakingRemove Thread.Overlay, its ThreadOverlayProps and ThreadOverlayState types, the data-thread-overlay attribute and --thread-overlay-top-height. Render your own aria-hidden, pointer-events-none div for a fade, and set the space above a landed turn with --thread-inset-top.
  • ThreadBreakingRename --thread-overlay-bottom-height to --thread-inset-bottom, which now includes --thread-composer-gap. Pad Thread.Content with pb-(--thread-inset-bottom) and set --thread-composer-gap on Thread.Root for the room above the composer.
  • ThreadBreakingRemove --thread-turn-area. Read --thread-turn-min-height instead.
  • ThreadBreakingThread.Viewport is a size container, so it needs a definite height. Give it h-full inside a sized Thread.Root rather than only a max-height.
  • ThreadBreaking--thread-inset-bottom and --thread-turn-min-height assume the composer overlays the viewport. If your composer sat in flow below a flex-1 viewport, give Thread.Composer absolute inset-x-0 bottom-0, pad Thread.Content with pb-(--thread-inset-bottom), and render Message.Turns or pass autoScroll="bottom".
  • ThreadMove --thread-turn-min-height from Thread.Content to Thread.Root. It is the viewport's height (100cqh) minus the top inset and the bottom inset in follow and jump, and 0px in bottom and off, so [&>*:last-child]:min-h-(--thread-turn-min-height) can stay on Thread.Content in every mode.
  • ThreadNew --thread-inset-top for the space above a landed turn and --thread-composer-gap for the room between the last line and the composer. Set both on Thread.Root.
  • ThreadNew --thread-composer-height and --thread-composer-width, the Thread.Composer slot's size.
  • ThreadFix a Thread.Composer that mounts late or remounts going unmeasured. Its variables are removed when it unmounts.
  • MessagegroupTurns accepts any records with an id and a role.

Patch Changes

  • ComposerFix sent attachments being released before onSubmit could read them, which left their blob: URLs dead. They are now released once onSubmit settles.

0.7.0

Minor Changes

  • BreakingRenamed from @intentface/chat. Swap the dependency for @intentface/ui and replace @intentface/chat/ with @intentface/ui/ in imports; the rename changes nothing else.

0.6.0

Minor Changes

  • New @intentface/chat/generative entry, experimental: typed helpers that check a model's UI tool call against a catalog (defineCatalog, tree.schema, tree.validate), read it while it streams (useTree, tree.read), resolve its data bindings (bindings.resolve) and write it as Markdown (markdown.tree).

0.5.3

Patch Changes

  • ComposerFix Composer.Root losing its state under StrictMode or a hidden <Activity>, which drew the placeholder over a controlled value.
  • ComposerFix an embedded composer scrolling the page around it on clear(), setText() and ask-user step changes.
  • ComposerFix a trailing empty line in an overflowing composer not scrolling into view.
  • AskUserFix moving focus between options scrolling the page around an embedded question.
  • ComposerAdd focus options to the controller's focus(), such as { preventScroll: true }.
  • Remove the nanoid dependency.
  • AttachmentsUse the file's blob URL as the attachment id.
  • ComposerFix a hydration mismatch when Composer.Popover or an overlay Composer.Panel is server-rendered.
  • AskUserFix AskUser.Options and AskUser.Option writing to refs during render.
  • ComposerFix Composer.Command writing to a ref during render.
  • AskUserImprove re-renders: AskUser.Root, AskUser.Options and AskUser.Option memoize their context values.
  • ReasoningStepsImprove re-renders: their collapsible context is memoized.
  • TabsImprove re-renders: the anchored surface memoizes its context value.

0.5.2

Patch Changes

  • Add JSDoc to every part of Attachments, Chip, Message, Reasoning and Steps, so editors show the same reference as the docs.
  • Refresh the README to match the rewritten docs.

0.5.1

Patch Changes

  • ThreadFix losing the bottom while the container is resized.

0.5.0

Minor Changes

  • TabsFix dismissOnEscape closing the panel on an Escape another handler already prevented.
  • ComposerFix an Escape in one composer stopping generation in another.
  • ComposerBreakingEscape stops generation only from inside Composer.Root. To stop on any Escape, handle it on your chat container, such as Thread.Root.

0.4.0

Minor Changes

  • NavNew Nav.Toggle: a caret inside Nav.Trigger, so a branch row can also be a page.
  • NavAdd aria-current="page" to active Nav.Item and Nav.Trigger rows.
  • NavFix a disabled Nav.Trigger rendered as a link still navigating.
  • NavFix Space not following a link row.
  • TabsNew openOnHover, openDelay and closeDelay on Tabs.Trigger.
  • TabsAdd eventDetails to onValueChange and onItemsChange, with reason and cancel(), so a close can be cancelled.
  • TabsFix Escape from a floating Tabs.Popup dropping focus instead of returning it to its tab.
  • Breakingevent.preventBaseUIHandler() is now event.preventPrimitiveHandler(), and event.baseUIHandlerPrevented is now event.primitiveHandlerPrevented.

0.3.0

Minor Changes

  • ShellNew primitive: a collapsible, resizable sidebar with hover-peek.
  • NavNew primitive: a nav tree with roving focus, typeahead and a guide ladder.
  • TabsNew primitive: closable tabs whose panel renders in the layout or anchored to its tab.
  • ComposerFix a closing Composer.Panel staying mounted when there was nothing to animate.
  • Fix anchored surfaces animating in from before they were placed, and add --anchor-available-width.

0.2.1

Patch Changes

  • ThreadFix visibly scrolling to the bottom while the container animates open.
  • ThreadFix losing a few pixels of scroll position when the composer changes height.

0.2.0

Minor Changes

  • StepsReasoningFix the panel clipping content that grows after it opens.
  • StepsReasoningBreakingThe panel height variable --collapsible-panel-height is now --panel-height.
  • ThreadBreakingThread.Root no longer takes dockSelector. Put the composer in Thread.Composer and it is measured automatically.

Patch Changes

  • ComposerFix Composer.Textarea gaining phantom newlines during rapid editing.
  • Fix the npm registry listing exports paths the package doesn't ship. Installs were unaffected.
  • Point homepage and the README links at https://ui.intentface.com.

0.1.2

Patch Changes

  • Fix the package failing to load during server-side rendering.

0.1.1

Patch Changes

  • Fix a regex in parseChipSegments that could hang the browser on long messages.
  • ComposerFix a regex that could freeze the editor on large pasted text.

0.1.0

Minor Changes

  • Initial release: headless chat primitives for React. Composer, Thread, Message, Steps, Reasoning, Chip, Attachments and AskUser, plus the message types and utilities.