Skip to main content
C

dsh-page-zoom

centaurea5547196/dsh-page-zoom

Page zoom for the DSH Web UI: Ctrl+mouse wheel scales the entire interface in 5% steps (30%-200%), remembers the zoom level locally, and shows a magnifier with the percentage in the bottom-right corner.

Install

dsh plugin --profile web add github:centaurea5547196/dsh-page-zoom

README

dsh-page-zoom

Page zoom for DeepSeek Harness / DSH Desktop.

Hold Ctrl and scroll the mouse wheel to scale the entire interface — sidebar, menus, settings, overlays and conversation alike. A magnifier glyph with the current percentage sits in the bottom-right corner.

English | 简体中文

Controls

GestureResult
Ctrl + mouse wheel upZoom in one step
Ctrl + mouse wheel downZoom out one step
  • Step: 5% per wheel notch
  • Range: 30% – 200%
  • The level is remembered (localStorage), so it survives a reload.

There are no buttons, no menus and no keyboard shortcuts — the readout is display-only.

The readout

  • Bottom-right corner, 12px / 10px from the edges.

  • A magnifier glyph, then the number. A bare 100% in a corner means nothing on its own; the glyph is the convention browsers and phones already use for this exact reading.

  • Display only: pointer-events: none, so it never intercepts a click and never gets in the way of the UI underneath.

  • No box, no border, no background — it borrows the app's own font stack (--dsw-font-family) and its muted tertiary label colour (--dsw-alias-label-tertiary), so it reads as part of the chrome rather than as a floating widget.

  • Scaled with the page, not against it. The readout grows and shrinks with everything else, and so does its gap from the corner, so it stays proportional to the app's own layout: 47×13 at 100%, 93×26 at 200%, 12×4 at 30%. Whatever it does not cover at 100%, it does not cover at 200% either.

    This works without any arithmetic because a fixed box's visual offset is the declared value multiplied by its own zoom and by every ancestor zoom. Keeping the element's zoom at 1 and the declared inset constant is therefore already linear in the page zoom. Multiplying the value by the level as well makes it quadratic — a declared 24px renders as 48px at 200%.

  • role="img" with an aria-label, deliberately not role="status". status is a live region, so a screen reader would interrupt with "Page zoom 105%", "Page zoom 110%" on every wheel notch.

Install

dsh plugin --profile desktop add github:Centaurea5547196/dsh-page-zoom
dsh plugin --profile web     add github:Centaurea5547196/dsh-page-zoom

If git is not available on the machine, install from the release tarball instead — dsh accepts a remote archive spec:

dsh plugin --profile desktop add https://github.com/Centaurea5547196/dsh-page-zoom/archive/refs/heads/main.tar.gz

How it works

Zoom is the CSS zoom property set on the document element, not transform: scale. zoom reflows layout exactly like the browser's own zoom, so fixed-position chrome keeps working. transform would leave fixed elements clipped and would additionally turn the root into a containing block for every position: fixed descendant.

DeepSeek Harness ships no page zoom of its own: the only typography setting is ui-theme.fontSize, which affects conversation body text only — sidebar labels, menus and settings chrome are fixed pixel sizes. This plugin adds the missing gesture.

The listener sits on window in the bubble phase with { passive: false }, and it yields to any surface that already claimed the event (event.defaultPrevented). That ordering matters: the sidebar's document preview binds its own cursor-anchored Ctrl+wheel zoom on its scrollport and calls preventDefault(). A capture-phase listener on document would fire before that handler ever ran, and stopPropagation() there would kill the preview's zoom outright. Being last in line keeps the preview working while every other surface still falls through to page zoom. It also overrides the browser's native zoom when the Harness is opened in a plain browser tab.

The whole thing is plain DOM — no React surface, no host-side code, no network access, no storage beyond one localStorage key.

License

MIT

Related plugins