Repository navigation
Releases
Releases · A-Meng-E/dsh-two-pane-sidebar
v0.2.0
Changelog
All notable changes to this project are documented here. The format follows
Keep a Changelog, and the project adheres to
Semantic Versioning.
[0.2.0] — 2026-10-21
First packaged release. The rail is now a permanent fixture of the layout instead of a
three-state mode switch.
Added
- Persistent plugin rail rendered from the host's
sidebar.panellistregistry — new navigation
entries appear without any change to this plugin. - Icon-only (52 px) and icon + label (208 px) widths, with a single toggle button at the bottom of
the rail and the choice persisted inlocalStorage. - Themed tooltips via the host's
Tooltipprimitive (portal: true, so the rail'soverflow: hidden
cannot clip them); falls back to the nativetitleattribute when the primitive is unavailable. - Per-entry error boundary: a failing icon component degrades to a neutral placeholder instead of
taking down the rail. - Skin following: the rail copies the native sidebar column's background, texture and text colour at
runtime and re-syncs on theme/skin changes, so third-party skins apply with no per-skin code. prefers-reduced-motionsupport.
Changed
- Registration goes through
slots.inject(slotName, () => slots.register(...)), and all wiring runs
in a child fiber derived fromctx.inject(['slots'], …); entry options are limited to
{ name, id, order }. A failure can now only cost the panel, never app boot. injectnarrowed to['slots', 'locale'];layoutis resolved opportunistically at call time.- Icons are rendered from the entry's own component, because the host only injects
renderSlotinto
entries that declare children. - Row foreground colour uses
inheritand hover/active backgrounds use
color-mix(in srgb, currentColor …), so contrast follows whatever the active skin defines. - Locale strings and the plugin-page title/description now live in
locale/*.json.
Removed
- The three display modes (both / rail only / sidebar only), the top-bar mode control, the
sidebar.footer.actionfallback button, theCtrl+Alt+1/2shortcuts and the narrow-window
degradation. - Startup synchronisation through
ctx.layout.toggleSidebar(), which reset a user-dragged sidebar
width to the 280 px default on every boot.
Fixed
- App failed to boot (
web boot: 1 entry did not activate) because the slot was registered without
theinjectwrapper — the error is no longer possible:applynever throws. - Blank icons in the rail.
- Light background / dark text rail under dark skins.