dsh-ui-zoom-regions
Per-region UI zoom for DeepSeek Harness — Ctrl + wheel sets independent zoom levels for the conversation header, the left sidebar, the conversation body and the right sidebar (sidebars 25%-300%), and dragging the header bottom edge makes that header shorter or taller, growing by height only so label
Install
dsh plugin --profile web add dsh-ui-zoom-regions
Sandbox test
This plugin has not been tested yet. Submit a test →
README
dsh-ui-zoom-regions
Per-region UI zoom for DeepSeek Harness (dsh).
The shell's regions get independent zoom levels instead of one page-wide scale, and the
conversation header's whole bottom edge can be dragged — nothing is painted there, the cursor just
changes — to make that header shorter or taller.
[中文说明](#中文说明) · [Install](#install) · [Controls](#controls) · [How it works](#how-it-works)
Regions
Region · What it zooms · Notes
Top · the conversation header: title row (session title, preset badge, header actions) and the view tab row (Chat / trajectory / plugin views) · one level for both rows, so every label stays on screen
Left · the sidebar column · skipped while the sidebar is collapsed to the icon rail, restored on expand
Centre · the conversation body (scroll area + composer) · deliberately not the whole column, so the header above it can never be dragged along
Right · the right sidebar column (files, terminal, browser, document preview …) · independent of the centre column
Zoom is applied as CSS zoom on the target element, so a region keeps its width: content reflows
and scales, neighbouring columns are untouched, and the splitter drag handles stay where they are.
Controls
Ctrl+ mouse wheel — zoom the region under the pointer (captured, so the page never scrolls)Ctrl++/=— zoom that region in ·Ctrl+-— out ·Ctrl+0— reset it to 100%- Range 50 %–200 % for the centre column; the two sidebars (and the header's font) go
25 %–300 %; wheel step 5 %, key/button step 10 %
- The header's bottom edge is a second, independent control — drag it down to give the
header more room, drag it up to collapse it (down to 24 px; a row that no longer fits vanishes
whole, so no line is ever cut in half), without touching the font; double-click hands the
height back to the stylesheet
The readout in the bottom-right corner shows all four levels. It is hidden by default and only
appears for about two seconds after a change (pointer-events: none while hidden, so it never
blocks the UI). Its last chip cycles the readout mode — auto / always / off — and Ctrl + Alt + 0
does the same from the keyboard.
The header: two independent controls
The conversation header carries two separate channels — this is the whole point of 1.2.0:
· Font size · How much room it takes
Control · Ctrl + wheel / Ctrl + + - 0 over the header · drag the header's bottom edge
Stored in · dsh-ui-zoom-regions/levels (top) · dsh-ui-zoom-regions/headerHeight (px)
Range · 25 % – 300 % · 24 px … half the conversation panel
Effect · title row + tab row scale · min-height when growing; height plus whole rows dropped when collapsing
They never interfere: shrinking the labels no longer shrinks the bar, and making the bar taller no
longer enlarges the labels.
The bottom edge. Its entire width is the drag target: an invisible 9 px band just inside the
bottom edge that paints nothing and only switches the cursor to ns-resize. No handle to hunt for.
- The pointer moves the edge one pixel per pixel — drag 20 px and the header is 20 px taller or
shorter.
- Dragging up really shrinks it, one whole row at a time.
min-heightis only a floor: it can
never make the header shorter than its content, which is why pulling up used to do nothing at all.
Below the natural height the plugin writes height and drops the rows that no longer fit whole
(display: none; the tab row goes first, then the title row) — a row that stays on screen keeps
its own font size, its padding and its share of the layout, and nothing is ever sliced through the
middle of a line. overflow: hidden stays on only as a backstop.
- Limits are measured on every drag: at least 24 px, at most half the conversation panel
(the panel is resolved through *_centerCol, then the nearest ancestor meaningfully taller than
the header, then the window). The live numbers are recorded as headerHeight / headerLimits
in the diag receipt.
- Double-click returns the header to the stylesheet's own height (removes the inline
min-height, height and overflow).
Install
dsh plugin --profile web add github:FurinaEsE/dsh-ui-zoom-regions # desktop profile dsh plugin --profile desktop add github:FurinaEsE/dsh-ui-zoom-regions
The package ships plain JavaScript and runs no install scripts, so there is no build-approval step.
Storage
Everything is local and per browser origin:
Key · Contents
dsh-ui-zoom-regions/levels · { top, left, center, right } zoom factors
dsh-ui-zoom-regions/headerHeight · the header occupancy in px (absent = the stylesheet height)
dsh-ui-zoom-regions/diag · a small diagnostic receipt (version, timestamp, which regions resolved, applied zoom values, headerHeight, headerLimits)
The readout mode is deliberately session-only: every page load starts in auto, so a mode picked
earlier can never lock you out of the readout.
How it works
lib/index.js is an empty host half. All behaviour lives in the browser half, which resolves the
shell's regions from stable hooks — [class="_sidebarCol"], [class="_centerCol"],
[data-rightbar-col], [class*="_titleRow"], [data-conversation-tabs"] — and re-resolves them on
a slow interval plus a mutation observer, so panels that React re-creates (the right sidebar, the
header after a session switch) get their level re-applied and a target that disappears never leaves a
stale zoom behind.
Credit and licence
MIT. The browser half started from imdeniil/dsh-ui-zoom
(MIT), which zooms the whole document. Thi
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::5,最后更新 2026-10-19