Changelog
Version 0.16.5
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
8593b60: Five fixes to how the chat feels: the composer no longer comes up ~200 px tall on a slow layout, a send glides to the top instead of jumping, an older message’s action bar sits under the message (in the existing gap, no reserved row), a selected button-group segment reads as selected at rest, and
<aparte-split single>shows one pane on demand.- Composer (#55). The editor sometimes rendered ~200 px tall while empty, in any host. The auto-grow read
scrollHeightat three fixed instants and then only on input; when one fell before the box had its width, the placeholder — a::beforethat counts inscrollHeight— wrapped over a dozen lines and the number stuck. AResizeObserverre-measures on width changes, and the placeholder never wraps (white-space: nowrap, clipped like a native input’s). - Send glide (#57). The new user message is meant to glide to the top; it jumped. Measured: five instant
scrollTopwrites in the send’s own frame (the spacer recalculation pins synchronously, the mutation observer queues another), so the smooth scroll found the view already teleported — and in framework-managed mode the observer’s instant pin ran before the wrapper’srequestSmoothScroll()was honoured (630 px in one frame on React). The glide now begins before the spacer recalculation; while it is in flight, every bottom-pin re-targets it with a second smoothscrollTo(scrollendcloses the window, 450 ms budget otherwise); a user bubble the observer sees arrive is a send whoever rendered it. Streaming is instant again after the glide. Reduced motion keeps the instant path. Three engines then refined it: WebKit firesscrollendwhen a smooth scroll is re-targeted, so only a scrollend that rested at the bottom closes the window; a batch that re-adds several bubbles (a branch swap) is a rebuild, not a send, and pins as it always did; and the reader’s hand ends the glide — wheel and touch stop the animation where it is, a scroll key only closes the window, because the engine animates key scrolls itself. A glide that never arrives is settled by its own timer. - Action bar placement (#56). An older message’s bar floated top-right over the header row, because the bubble is a paint-containment boundary and the inter-bubble gap was a flex
gapoutside every box. The gap is now each bubble’s ownpadding-block-end(same token, same distance), inside its box, and the bar hangs under the text overmessage padding-block + gap— 16 + 12 = 28 px at the default density for a 24 px bar. The last reply keeps its always-visible bar in the flow. Two theme tokens appear:--aparte-message-padding-blockand--aparte-message-padding-inline;--aparte-message-paddingis now derived from them, so a theme that overrode the shorthand should override the two parts instead. - Button group (#53).
aria-pressed="true",aria-selected="true"oraria-currenton a segment of.aparte-btn-grouppaints it solid in the group’s intent (neutral for--surface), at rest, and hover leaves it alone; a toggled--outline/--softbutton outside a group is washed at 30 %, deeper than its 22 % hover. Before, the toggled wash was--aparte-btn-bg-toggled(surface-2), invisible on dark, and hover read as the state. - Split (#54).
single(boolean) shows one pane — the onepanenames — whatever the width: the seam and the other pane are gone, as under the breakpoint, and the seam loses its tab stop.collapsedstill folds the primary pane to--aparte-split-minand keeps the seam; the CSS route.aparte-split--only-start/--only-endis unchanged.
Measured with two new browser specs (the send’s per-frame
scrollTopcurve and every write to it, on vanilla, React and WebKit; the older reply’s bar geometry, hovered, on vanilla and React) plus 16 unit tests; the scroll-button, overlay, bubble-actions and framework-smoke geometry specs stay green. Thecheck:derived-varsceiling on responsive sizes moves 8 → 9 for the split padding token.@aparte/core - Composer (#55). The editor sometimes rendered ~200 px tall while empty, in any host. The auto-grow read
Version-only bumps (no changes of their own): @aparte/engine, @aparte/provider-ai-sdk, @aparte/provider-openai-compat, @aparte/provider-scenario, @aparte/provider-transformers, @aparte/plugin-approval, @aparte/plugin-artifacts, @aparte/plugin-ask-user, @aparte/plugin-compaction, @aparte/plugin-marked, @aparte/plugin-model-selector, @aparte/plugin-shiki, @aparte/plugin-streaming-markdown, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locale-fr, @aparte/docs-mcp.