Repository navigation
Releases: Physicolor/dsh-ui-harmonizer
Release list
v0.9.1
v0.9.1 — smooth panel toggle, header badge fit, one settings-header skeleton
Published as a patch at the owner's call: it carries new behaviour, which semver would normally file
as a minor, and it removes an optional visual layer that 0.9.0 shipped.
New — the right sidebar's open/close stops re-laying out the whole frame ("Smooth Panel Toggle", default on)
- The product eases
grid-template-columnson the frame, and that is a layout property: the center
track travels 1427px → 659px over 300ms, re-laying out the entire frame on every frame of it. Measured
with the switch on and off over nine toggles each: long-task blocking 285.2ms → 205.7ms (−28%),
long tasks 58 → 43. Treat these as directional; the isolated mechanism measurements are the causal
evidence, and they are in the README. - The track is snapped in one frame while
transitionrun/transitionstart/transitionendall still
fire (other plugins read that beat), and the motion is re-added as covers that do not force layout:
transformon the transcript column,lefton the composer capsule. - Nothing transforms the composer or its ancestors:
dsh-widgetskeeps threeposition: fixednodes in
that subtree, and atransformrewrites their containing block and drags the rail into the viewport
(measured 1247 → 412.4). Withleft, rail drift reads 0px in every sample. - Overlapping toggles leave no residue: each click gets a generation token and a stale step bails.
New — the top bar glides with the panel, and its badges retire before the title is crushed
- The header used to snap inside the click's own commit while the transcript glided. It cannot be covered
like the column — its geometry is a width, not an offset — so the same driver grew awidthmode. - Measured on the three-badge reference session: 12 distinct painted widths, 1427 → 659 on open, and
nothing inside needs a cover of its own. - The header's other half of the report was wrapping, and the badges were not the cause: the tab strip
was squeezed until its labels wrapped. Oneflex: nonemoves the deficit onto the crumb cluster, which
the product already ships withmin-width: 0; overflow: hidden. - Badges now retire in the order asked for (标准模式 → 智能体团队 → 子智能体) once
_crumbsdrops below a
160px legibility floor, with 24px of hysteresis; title 0px → 165px with two of three retired, and
closing restores everything.
Refactor — the settings page header is ONE skeleton with ONE geometry, on every page
Fixed
- The sidebar account popup was narrower than the row it hangs from.
- A third-party settings page rendered completely unstyled (a bug in the loader's claim pass).
Removed — the center-column rounded card
- The "Rounded Card" switch (Settings → General → UI Customization) is gone, with its
shell.overlay
cover, its stylesheet and its state field. It was a visual opinion rather than a normalization: it
added a corner radius and a shadow the product does not have, and it occupied a second surface inside
the center column that every other co-tenant had to route around. What remains in that block removes a
defect instead of adding a look: chat width, font stack and panel glide. - The removal is residue-free: the root class is no longer written,
disposeDynamicStylestill clears
enhc-center-card-on(so a page running an older build during a hot update cannot keep a card nothing
paints), and the persistedcardkey is dropped when state is read. - The plugin's own declared surface count drops from two to one; the Doctor's inventory follows.
Guards
scripts/verify-frame-track.cjs (12 checks), scripts/verify-rapid-toggle.cjs (28),
scripts/verify-header-fit.cjs (14), scripts/verify/settings-page.cjs, and the compiled-stylesheet
baseline (28 sheets, no drift).
v0.9.1 — 侧栏开合平顺、顶栏徽章让位、设置页表头收成一套骨架;删除圆角卡片
按车主决定以 patch 发布:这一版带新行为,严格按语义化应为 minor;同时删掉了 0.9.0 里的一个可选视觉层。
- 新增「侧栏开合平顺」(默认开):右栏开合不再逐帧重排整个界面。九次开合对比实测:长任务阻塞 285.2ms → 205.7ms(−28%),长任务条数 58 → 43。轨道一帧到位而三个过渡事件照常触发,位移改由不触发强制布局的 cover 承担(正文列
transform、输入框胶囊left——因为 dsh-widgets 在那棵子树里有三个position: fixed节点,实测加transform会把导轨从 1247 拖到 412.4)。 - 新增顶栏跟手 + 徽章让位:顶栏的几何是宽度不是偏移量,所以同一条驱动长出
width模式;实测 12 个不同的绘制宽度(1427 → 659)。页签条换行是另一条独立缺陷,一条flex: none修掉。徽章按 标准模式 → 智能体团队 → 子智能体 退场,标题宽度 0px → 165px。 - 重构:设置页表头全站一套骨架、一套几何。
- 修复:侧栏账号浮层比挂靠的行更窄;某个第三方设置页完全没上样式(loader 认领通道的 bug)。
- 删除中栏圆角卡片:它是视觉主张而不是规范化,且在中栏多占一块别的插件要绕开的表面。删除零残留(根类不再写、dispose 仍清、持久化的
card键丢弃),表面申报从两个降为一个。 - 门禁:
verify-frame-track.cjs(12)、verify-rapid-toggle.cjs(28)、verify-header-fit.cjs(14)、verify/settings-page.cjs、编译样式表基线(28 张表,无漂移)。
v0.9.0 — organised by target, and the audit findings repaired
v0.9.0 — one interface language for the Harness, and a layout per target
Refactor — every source file now belongs to exactly one layer
- The plugin is organised by TARGET:
core/(infrastructure true regardless of DSH or any plugin),harness/(normalizations aimed at the DSH shell),plugins/<package>/(adaptations written for one community plugin),self/(this plugin's own UI).src/client/now holds nothing butindex.tsandservices.d.ts. - The 1253-line stylesheet is split into 23
.module.cssfragments behind ONE entry (src/client/styles/index.ts) whose import order is the cascade order; the split was proven byte-identical to the original, andscripts/tools/css-baseline.mjsnow pins the compiled result. npx tsc --noEmitwent from 52 errors to 0, andbuildrunstscsolib/types/really exists (it was advertised infilesbut never emitted).
Fixed — dead and wrong selectors, found by an adversarial pass over the live DOM
- The dropdown-menu recipe had never applied:
[role='menu'] [class^='_list_']is both a descendant and a prefix match, while the product putsroleand the list class on the SAME element with the list class not first (_surface… _list_4ub78_7 …). Measured with a menu open — descendant 0, prefix 0, contains 1. Fixed to[role='menu'][class*='_list_']; list / item / icon / label rules now land (padding 4px, min-width 218px, item min-height 40px). - Sidebar rows that carry a modifier class (
_brand _wide) silently stopped matching[class$='_brand']; the anchors now read "the class list CONTAINS a_branditem". - The brand wordmark is no longer resized at all — 0.2 renders it as TWO svgs (whale + HARNESS badge), so one
svg { width:182px }stretched the whale 7.6×. menu-anchormust not treat the shell's settings button (aria-haspopup="dialog",aria-expandedtrue for as long as the dialog is open) as a menu trigger — it was force-sizing the product's own popups to a sidebar row.- The Doctor's
deadInThisViewwas declared twice (a count and a row array), so its Markdown export printed[object Object]; a deadmarket-hashrule and a misattributeddata-dsh-*coupling are gone.
Fixed — the frame's column track actually animates on DSH 0.2
- 0.2 moved the AppFrame's
transition: grid-template-columnsbehind[data-animating], which React sets in a layout effect on the same commit that writes the new track — the before-change style therefore carries no transition, so none ever ran and the conversation column SNAPPED. Measured: 1640px → 776px in one frame, no transition events,data-animatingcleared by the component's own 600ms fallback timer. - The stylesheet now keeps the transition on the frame permanently (the product's own
[data-dragging]/[data-rightbar-instant]rules still win), andframe-track.tsowns the one exclusion the product implements in JS — a window resize.
Fixed — lifecycle
- The two DOM relocations (session tabs, bottom-workbench toggle) put their nodes back on dispose; the center card's unconditional 1Hz
setIntervalis gone (ResizeObserver + resize + transition events already cover it); the settings-header fingerprint hashes TEXT instead of its length (equal-length rewrites used to freeze the title).
v0.8.3
v0.8.3
Perf — conversation squeeze animation now runs at full frame rate:
- Content-visibility: auto on every conversation flowItem (
_flowItem): off-screen items skip layout entirely, so the 0.3s margin squeeze animation reflows only the handful of visible items instead of the entire conversation tree. - Measured (playwright + local Edge, heavy sessions, widget rail open): dropped frames 20–31% → 0%; left-edge drift 0px (always aligned); rail↔conversation lockstep std=0px; scrollHeight 0% shift after jump-to-bottom.
- Left-edge always pinned, right-edge glides progressively — no "jump to final width, then slide" compromise.
README English-only cleanup:
- All Chinese component names replaced with English equivalents.
v0.8.1 — dsh-genui width compatibility
v0.8.1 — dsh-genui width compatibility (适配更新)
Optimised plugin: @omdsh-dev/dsh-genui (render_ui 面板与工具卡片)
- Panels & tool cards now follow the conversation content width (
--enhancer-content-width, e.g. 840px) instead of inflating to the full composer seat — width follows the live chat-width slider instantly. - Fixed the fold-bar overflow root cause (flex nowrap title missing
min-width:0) and unified 11px/16px padding, matching the official task-row look. banner/stepshorizontal blocks get a 16px inset standard (no negative-margin box expansion); svg/pre/canvas/img/mermaid are all width-guarded.- All via hash-agnostic CSS overrides; zero modification of dsh-genui source; fully reversible on uninstall.
v0.8.0
dsh-ui-harmonizer v0.8.0
One new harmonizer capability and two visual-contract fixes. Includes the never-released v0.7.1 fixes.
Feature — unified native-title tooltips
- Elements that only carry the raw HTML
titleattribute (the model selector trigger, assorted product controls) used to pop the OS-native tooltip, breaking the visual language kept by every surface routed through the official Tooltip primitive. Hover/focus is now intercepted: the title is lifted for the interaction and re-rendered as the official bubble —--dsw-alias-tooltip-bgchip, padding 3px 7px, radius 8px, 13px/20px type, 50vw width cap, 500ms hover delay, immediate on keyboard focus, placed 8px below the anchor (flips above when clipped), clamped to a 12px viewport margin, z-index 100 popup band. - Rollback safety: an ancestor carrying
data-enhc-no-tooltipopts a subtree out; the lifted attribute is restored verbatim on leave/blur/plugin stop; the fade-in respects reduced motion.
Fix — rounded card wraps the session header
- The AppFrame's shell.overlay outlet is itself a z-20 stacking context, so card chrome inside it can never out-draw the z-21 session header. Zero-pixel split-paint model (no white slab): the header draws the card's top edge as an inset hairline (a real border-top grew the header 1px and misaligned it against out-of-flow controls) plus the 18px top-left radius; the overlay box demotes to a pure shadow caster with a custom left/top-emphasized recipe (official lv3 offsets down-right and its contact halo painted a stray edge line). Header-less routes fall back to the classic self-drawn card.
Fix — toggle cluster seat
- The floating better-sidebar toggle cluster got an opaque whole-height seat matching the header band (buttons/seat/header read as one flush right edge); while a better-sidebar right panel is open (
html.enhc-panel-open) the seat collapses back to a compact chip that cannot jut into the panel area.
Included from the never-released v0.7.1
- better-sidebar Files tab strip fills its 44px bar; right seat widened to 90px for the larger toggle cluster.
- Dark mode: active tab / widgets capsule keep white glyphs on the brand-blue fill.
Roadmap
- Phase 3 adds a Liquid Glass exploration entry with an explicit contract: token/CSS-layer only, opt-in switch, ≤2 large backdrop surfaces, reduced-transparency/reduced-motion aware, solid-fill fallback, no plugin sources touched, readability as the bottom line.
中文摘要:新增「原生 title 悬浮提示统一」(裸 title 元素改为官方气泡样式);圆角卡片改为包裹会话 header 的零像素分工模型(header 自绘上沿线+18px 圆角,悬浮层纯投影);better-sidebar 按钮簇获得整高不透明座位(面板打开时自动收回紧凑形态);并入未发布的 v0.7.1 两项修复;路线图新增液态玻璃探索方向。
v0.7.0
Renamed: harness-ui-enhancer to dsh-ui-harmonizer
Meta release - package, bundle id and positioning renamed. The plugin is now described as a UI harmonizer for DeepSeek Harness: it normalizes the unfinished/self-contradictory official UI, reconciles style conflicts between plugins, and unifies the visual language via official design tokens - not just polish.
- npm package: harness-ui-enhancer -> dsh-ui-harmonizer (old package deprecated, redirects here)
- GitHub repo: Physicolor/harness-ui-enhancer -> Physicolor/dsh-ui-harmonizer (old URL auto-redirects)
- Install: dsh plugin --profile web add dsh-ui-harmonizer
- Positioning: UI harmonizer for DeepSeek Harness (normalize / reconcile / unify via official tokens)
- No data impact: client-only plugin, no persisted keys
v0.6.3
Meta only - no code change.
- npm keywords added (deepseek-harness, dsh, cordis, plugin, web-ui, ui-enhancement) so the package is discoverable in npm search.
- GitHub repo topics expanded for GitHub search/discovery.
- 元数据版:新增 npm keywords + 扩充 GitHub topics,无代码变更。
v0.6.2
- Fix: opaque header rectangle above the overlay layer
- Docs: bilingual README (EN primary + zh-CN)
- 增加顶栏不透明层修复 + 双语 README
v0.6.1
Fixes
- Fully neutralize #root (margin-right: 0 + width: 100%) to remove the double-squeeze gap when the better-sidebar panel opens (#1)
- Collapse-state icon button sizing override
Includes the never-published 0.5.0 / 0.6.0
- Rounded center-column card toggle (Settings > 界面定制)
- Removed MCP server management and task automation
- 修复 better-sidebar 展开时双重扣减导致的空白间隙
v0.4.1
- Fix: better-sidebar panel layout — tab bar 44px, header transition
- 修复 better-sidebar 面板布局问题