dsh-web
zhu1090093659
DeepSeek Harness (DSH) Web 插件聚合生态 · 万物皆插件,通过创意工坊分发||DeepSeek Harness (DSH) Web Plugin Aggregation Ecosystem · Everything is a plugin, distributed via the Creative Workshop
Physicolor/dsh-ui-harmonizer
Web UI polish layer for DeepSeek Harness: normalizes unfinished or self-contradictory official UI, reconciles style conflicts between installed plugins, and unifies the visual language via official design tokens.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:Physicolor/dsh-ui-harmonizer
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
English · 简体中文
UI harmonizer for DeepSeek Harness.
Normalizes the official UI · reconciles every plugin · settings auto-normalizer · UI customization (incl. rounded card)
TL;DR: You installed a bunch of DSH plugins but the UI looks inconsistent? DSH UI Harmonizer uses CSS overrides + runtime DOM coordination to bring them back to the official design language — non-destructive, fully reversible, zero model cost.
DSH UI Harmonizer is a client-only DSH bundle plugin. It adds no model tools and modifies no session logs — it adjusts the UI purely through official slots (settings.section / settings.general.item) and the --dsw-* semantic token system.
| Capability | Detail |
|---|---|
| Single-line header | Moves the conversation / trajectory selector into the title row; the header collapses to one line |
| Button capsule family | Session log, widgets, and toggle buttons unified into 32px capsules |
| Right-rail flush rounded rect | better-sidebar panel overlay layout; the header stays put |
| Unified settings header | Title 18/600 + description 13px + hairline divider |
| Native-title tooltips | Raw title attributes render as the official dark tooltip bubble instead of the OS-native popup |
| Target | Approach |
|---|---|
dsh-better-sidebar |
Capsule-ize toggle buttons, unify panel backgrounds, coordinate layout, smooth transitions |
dsh-widgets |
Matching stat capsule family, header utilities alignment |
@omdsh-dev/dsh-genui |
render_ui panels & tool cards: width follows the conversation content width (--enhancer-content-width, e.g. 840px) instead of inflating across the whole seat; fold bar long-title shrink fix with unified 11px/16px padding; 16px side-padding standard for full-width blocks (banner/steps, no box expansion); width guardrails for svg/pre/canvas/img/mermaid |
| Third-party settings pages | Auto-fill headings, drop redundant icons, normalize spacing |
When any third-party plugin adds a page to settings.section that doesn't follow the official spec, this plugin auto-corrects it:
| Auto-check | Fix |
|---|---|
| Missing page title | Injects an 18/600 title (from the nav label or a known mapping) |
| Redundant icon beside the title | Removes the title-row logo, keeps plain text |
| Title/description too tight | Unifies to 4px spacing + hairline divider |
| Inconsistent type/size | Title 18/600, description 13/20 + border-bottom |
The "UI Customization" block under Settings → General: chat width, markdown font size, workspace scale, UI font stack, and rounded card all adjust live. The "rounded card" renders the conversation area as a card with a rounded top-left corner and a drop shadow, auto-resizing with the sidebar width / details column.
--dsw-* semantic tokens and follow light/dark themes automatically;<style data-plugin> tags;settings.general.item / settings.section / shell.overlay (rounded-card overlay).# via npm (plugin market)
dsh plugin --profile web add dsh-ui-harmonizer
# local development (link)
dsh plugin --profile web add link:D:/dsh-home/plugins/harness-ui-enhancer
After installing, hard-refresh the browser (Ctrl+Shift+R); the "UI Customization" block appears under Settings → General.
pnpm install
pnpm run build # tsdown builds lib/
pnpm run check # typecheck + build
peerDependencies: @deepseek-ai/dsh-client-ui-slots, dsh-client-runtime (provided by the DSH web profile);cordis.patch.yml inserts the ui-enhancer row; the browser half is declared by dsh.client;npx tsdown rebuild → sync into profiles/web/node_modules/dsh-ui-harmonizer/lib/ → hard-refresh the browser.0.1.0-rc.6 and compatible later 0.1.x;dsh-better-sidebar, dsh-widgets, dsh-notification, dshmarket;Perf — the sidebar squeeze keeps its smooth progressive glide at full frame rate (companion to dsh-widgets v1.2.3):
viewArea, composerSeat, header) animate margin-right: var(--dsh-sidebar-width) over 0.3s — a per-frame reflow of the WHOLE conversation DOM — which on long sessions (thousands of nodes) dropped to 20–31% dropped frames and visibly desynced from the compositor-driven widget rail and panel slide.*_flowItem) now gets content-visibility: auto + contain-intrinsic-size: auto 120px, so off-screen items skip layout entirely and each animation frame reflows only the handful of visible items. auto lets the browser remember each item's last rendered height, so scrollbar height stays stable; browsers without support simply ignore the rule.scripts/verify-glide.cjs (npm i -D playwright-core && node scripts/verify-glide.cjs [session]).Feature (i18n — Chinese/English locale adaptation):
zh-*.src/client/i18n.ts module centralizes every user-facing string; language detection is responsive — re-evaluated on every render call, so switching Settings → Language takes effect immediately without a page reload.localStorage('dsh-language') (written by the official Settings panel) → <html lang="..."> attribute → navigator.language fallback.KNOWN_TITLES fallback table (used by the settings-section title-inject logic for third-party pages without a heading) is now locale-aware, matching both Chinese and English intro prefixes, and re-evaluated on each call so language switches take effect for injected titles too.Fix (cross-plugin width hygiene — @omdsh-dev/dsh-genui render_ui panels & tool cards):
.panelToggle title span (long nowrap text such as "opencode-go Multi-key Mini Pool — Final Architecture") is a flex child missing min-width:0; flex default min-width:auto refuses to shrink, so the title's max-content width inflates the fold bar and the whole panel beyond the conversation column. Harmonizer adds a hash-agnostic flex: 1 1 0%; min-width: 0 shrink baseline (so ellipsis engages) and caps the panel/fold bar width; the same family is covered for .toolFallbackMeta (tool fallback long meta) and .tlTime (timeline long timestamps). Pure CSS overrides, zero modification of dsh-genui source; the rules survive upstream CSS-module rebuilds (class-substring matching).--enhancer-content-width (currently 840px), matching the official Md3f7G_column conversation-content column — not the input box and not the outer composer seat. Final rule: [data-genui-panel]{ display:block; width:100% !important; max-width: var(--enhancer-content-width, 748px) !important; margin:10px auto 2px !important; contain:inline-size; box-sizing:border-box } — adapts live to the chat-width slider and centers horizontally in the conversation column. The earlier "measured input-box width via --enhc-message-maxw" approach was dropped (baseline drift). Lesson: width:auto + margin:auto triggers shrink-to-fit on a flex cross axis and collapses the panel into a vertical sliver (regression); always pair an explicit width:100% with a max-width instead.banner reuses the fold bar's width format: content width with 16px side insets (text starts at the same x as the panelToggle title), never a negative-margin box expansion (which pushed padding past the card edge), in every container (panel body / inline / tool card); steps gets 16px side padding inside padding-less inline/tool-card containers; svg/pre/canvas/img/mermaid are all width-guarded; block components (callout/card/list) keep their own shape untouched.Feature (native-title tooltip harmonizer):
title attribute (the model selector trigger, assorted product controls) used to pop the OS-native tooltip and break 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-bg chip, 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.data-enhc-no-tooltip opts a subtree out; the lifted attribute is restored verbatim on leave/blur/plugin stop (if the app rewrote the title mid-hover, its newer value wins); the fade-in respects reduced motion.Fix (toggle cluster seat):
bg-base. Default (panel closed): a whole-height block spanning the session header band (top 0 → 56px), so buttons/seat/header read as one flush right edge and widgets-rail cards can no longer show through. While a better-sidebar right panel is open (html.enhc-panel-open, kept in sync by the client half) the seat collapses back to a compact floating chip, because the panel's top edge deliberately sits below the page top and a tall seat would jut into it.Fix (rounded card wraps the session header):
Fix (better-sidebar Files tab strip):
height: 36px broke better-sidebar's native align-items: stretch chain, leaving ~8px of dead space at the strip's bottom. Reverted to height: auto + explicit align-self: stretch — the 14px label and icons stay vertically centered inside the taller strip.right: 12px = 82px total), so the old seat let the rightmost tab / + button slide under the capsules. 90px = 82px cluster + 8px breathing room. The bottom panel's 40px seat is untouched.max() path).Fix (dark-mode active-state glyphs):
--dsw-alias-label-primary-inverted, which resolves to a near-black bluish-800 on dark themes — black text on the blue fill.state-business-primary + #fff): an earlier override in this plugin had replaced that white with the same near-black token (dark-mode only). That override is dropped, so both buttons read as blue fill + white glyphs in light AND dark themes, matching the official nav-cell pattern.Meta — renamed package to dsh-ui-harmonizer:
harness-ui-enhancer → dsh-ui-harmonizer (dsh- prefix + "harmonizer" naming matches the ecosystem norm and search; old package deprecated, redirects here).Physicolor/harness-ui-enhancer → Physicolor/dsh-ui-harmonizer (old URL auto-redirects; stars/issues preserved).dsh plugin --profile web add dsh-ui-harmonizer. No data impact (client-only plugin, no persisted keys).Meta:
keywords (deepseek-harness / dsh / cordis / plugin / web-ui / ui-enhancement) so the package shows up in npm search; no code change.Fix:
--dsw-alias-bg-base) and sits one step above the shell's overlay layer (z-index: 21, still below better-sidebar's panels at 40 and modals): the dsh-widgets rail and its magnify overlay slide UNDER the header's white rectangle instead of visually stacking onto the header buttons. Header rules stay in the enhancer (the widgets plugin no longer touches official elements).Fix:
margin-right. The #root neutralization previously cleared only margin-right, leaving better-sidebar's width: calc(100% - var(--dsh-sidebar-width)) active — the width squeeze first narrowed the column to the panel's left edge, then the viewArea/composerSeat margin squeezed a second time, pushing the conversation one full panel-width short of the panel. Added width: 100% to fully neutralize #root, so the inner margin is now the single, correct squeeze (the chat's right edge meets the panel's left edge, minus the 8px scrollbar gutter).Removed:
New:
shell.overlay cover (top border + top-left radius + --dsw-shadow-lv3 shadow); the shadow bleeds left into the sidebar (card thickness), the top moves down 1px for the shadow gap; right/bottom are natural window edges with no drawn border; the left edge borrows the sidebar's own border-right; a ResizeObserver tracks the center column so it follows sidebar drags / collapse / details-column changes; the content's top-left is masked round by the center column's own border-radius; pure CSS gating (html.enhc-center-card-on), togglable and residue-free.Fix:
max(): gives 80px to the toggle cluster when the sidebar is closed, follows the sidebar width when open;margin-right;W-zNGW → nArs4W;top: 6px.CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: ui-enhancement、ui-harmonizer、web-ui。