Repository navigation
Releases: Sddft97/dsh-client-ui-skin-verdandi
Releases · Sddft97/dsh-client-ui-skin-verdandi
Release list
0.1.8
[0.1.8] - 2026-10-26
Fixed
- Adapt the standalone plugin's sidebar, conversation and right-panel detection
to the DSH 0.2 shell, while retaining the legacydata-panelayout. The skin
uses its own region markers and removes details decoration when the right
panel closes, without changing the host panel's positioning. This selectively
incorporates the region adapter from PR #1
and preserves the existing running timer, navigation, trajectory, overlay and
desktop drag-region fixes. - Lay the composer dock out as one flex row, like the stock shell: detailed
mode's two stat anchors and compact mode's single anchor share the same line
instead of stacking, and the live tok/s element keeps its seat at the far end. - Drop the gold capsule rings on session-header buttons, trace-timeline
buttons, workspace-row controls and composer toolbar buttons — controls the
stock shell leaves bare stayed bare, so plugin-mounted buttons no longer
inherit a shape the host never draws. The stock's one capsule, on the
file-manager split control, is kept, as are the chapter chevron badge and the
clock slip pills. - Rebuild the avatars as pre-composed framed assets, on the session-header
crest, assistant-message avatars and the collapsed-rail avatar. Measuring the
frame art showed its ring is centred on the canvas (r≈99 outer, inner hole
median 71 with a 55-84 angular spread) while the old CSS seat derived from a
decoration-biased bounding box, so the ring rendered off centre and the
portrait layers poked past the ring. The portrait is now a circular crop of
verdandi-wedding-avatar(character centred by a capture-centre sweep — the
face sits at the circle centre, radius 76 against the hole's median 71, the
lace resting on the rim where the hole narrows) composited into the frame
with a white hole matte
(verdandi-bridal-avatar-framed; the rail avatar composites
verdandi-q-avatarthe same way), and each avatar draws that single asset at
162% — the measured ring outer edge lands on the element edge, so nothing
renders outside the ring.
0.1.7
[0.1.7] - 2026-10-10
Fixed
- The window-drag handle is only mounted where the shell actually uses a drag region.
The shell's own drag-region rules are platform-gated ([data-platform="darwin"]), so
on a platform whose window has a native title bar-webkit-app-regionis unused;
adding adragband there would invent an area the host never reserved, which is the
same class of bug this round fixed. The hook checks the header's computed region and
skips (or removes) the strip where the shell has none -- on top of theno-drag
opt-out, which is a no-op on such platforms anyway. - The character art no longer covers plugin surfaces. The stage is
position: absolute; z-index: 0, which beats a static page in paint order, so on the
MCP connector and similar plugin pages the figures sat on top of the cards. Whenever
the main slot hands out a page surface instead of the conversation seat -- the
conversation is the only occupant that carriesdata-slot-- the stage drops to
z-index: -1-- above the pane's own background (it is a stacking context), below
the page's content -- so a page with its own background hides it outright and a page
without one shows it behind the content instead of over it. - The top bar is clickable again on the desktop app. Its top bar is an Electron
window-drag region (-webkit-app-region: dragon the header and its rows,no-drag
on each control) and that property is inherited, so every decoration the skin mounted
into the header inheriteddragand re-declared the whole band -- over the controls
included -- as draggable. A real mouse press on the overflow menu or the panel toggle
started a window drag instead of reaching the button. Only the desktop app was
affected, and nothing in-page can see it:elementFromPointskips
pointer-events: nonelayers, and injected clicks never enter the native drag path.
The skin's own layers opt out now. Because the shell computes a region as "each drag
element's rect minus its own no-drag descendants", four full-band opt-outs also carved
the window drag out of the top bar, so the skin hands one handle back: a single
header-drag-stripdecoration that isdragagain and covers only the empty middle
of the bar (left 40%, width 20%), measured to overlap zero controls. Tests pin the
invariant that this is the sheet's only-webkit-app-region: dragdeclaration. - A split header control is one pill again. The shell's "open with " control is
two buttons in one box (div > button + button); the blanket rule that gives every
header button a capsule gave each half its own, so the seam showed a notch and two
inset rings butting together. The pair's box is the pill now and the halves stay
square, borderless and transparent inside it -- structural selection (a container
holding two adjacent buttons), minus the tab list, which isbutton + buttontoo. - The header's own dropdown is clickable again. dsh 0.2.0 moved the title row one slot
deeper (conversation.session.header, adisplay: contentsseat), which made the
skin'sz-index: 3rule for the header rows score 0-3-0 and pushed the 0-2-0
title-row lift below it -- so the tab row (later in DOM order) painted over the top
of the更多操作menu and swallowed the clicks meant for its first item. The lift is
spelled out at 0-3-0 or above and matched structurally
(> :has([aria-haspopup])) as well as by class, so it no longer depends on the
host's nesting depth or on source order. - Decorative layers no longer outrank host popovers. The composer seal (an absolutely
positioned ornament that floats above the composer card) covered the model picker,
because the skin had lifted the composer seat toz-index: 15and the header to
z-index: 20: a popover the host renders inside a lower context cannot win against
a two-digit lift. Skin-carried layers stay in the single digits now (header 4,
composer seat 3, seal 1) and the seal sits below the composer's own content.
Pinned by a test: no skin lift reaches double digits, and the seal stays under the
seat.
0.1.5
[0.1.5] - 2026-09-26
Fixed
- The chapter title reads as a title, without a separator. The turn-process
label ("用时 …") now sets in the brand colour — crimson in light, gold in
dark, through the official token — on its opaque warm paper, and the crimson
chapter bar widens to 4px; the fold labels stay in meta ink, so the
hierarchy is literally "the heading takes the brand colour, the entries do
not". The soft fading gold rule under the row is removed: at any opacity it
stayed invisible over the light artwork, and an invisible ornament is not a
hierarchy. - The fold chevron is a paper disc inside a gold ring, and the arrow is
ink-dark in both themes. Colouring the arrow per-theme put near-white ink on
the gold badge in dark mode (~1.9:1) — the arrow vanished exactly where the
user looked for it — and the old hover rule repainted it gold-on-gold. The
badge's hover feedback is now the ring brightening from 55% translucent
1.5px to full-strength 2px: no colour inversion anywhere, so nothing can
blend into anything. Rotation stays with the host's own data-open rule; the
badge scales through the individualscaleproperty, which composes with
it. - The clock pill no longer hugs its round edge: a constant, hover-independent
padding-left: 10pxmoves the timestamp off the pill's rounded end (the
host's own padding is 0). The geometry-guard tests now allow exactly this
one constant declaration and keep banning everything else.
Fixed
- The copy tooltip no longer exists. The host's action tooltip (复制) is a flex
child of the clock rows whose width animates open, so the pill grew by ~66px
while the pointer rested on the button and snapped back on leave — with the
row's owntransition: allthat animated the buttons under the pointer. A
first fix lifted the bubble out of the flow, but a floating card over live
conversation is its own problem (it covers messages and its text hugged the
border), so the bubble is simply not rendered inside these rows: the copy
icon with its gold hover tint is self-explanatory, and the jitter mechanism
dies with the bubble. A real pointer-path trace confirms the pill's geometry
never changes. - The finished process rows are legible over the artwork again. Measured on the
live dsh 0.1.7-rc.2 app, the bare process ink (--vd-ink-meta, light rose-brown)
sat on artwork bands as dark as luminance 0.007, so "已协调子智能体" and its
siblings rendered at 1.37:1–2.4:1 in light mode — below every threshold the
skin's own readability guard promises. Two paint-only corrections:- The turn-process label's paper wash no longer fades to transparent at its
tail — the last characters of "用时 21分28秒" were landing on bare artwork.
The gradient now holds 72% of the slip at 100% (worst case ≈5.5:1 under the
glyphs, ≈7:1 where the wash is full), while still easing towards the row's
end so it reads as a soft ground rather than a filled bar. - The work-steps fold labels (
[data-process-activity], dsh 0.1.7) had no
wash at all; they now carry the turn label's paper wash and radius. The
label is the disclosure button's last child, so the inline padding shifts no
sibling, and the row box the host drew stays where it is.
- The turn-process label's paper wash no longer fades to transparent at its
- The chapter hierarchy inside a turn is readable at a glance. The stock host
titles the turn-process row ("用时 …", which may fold many step groups) with
a full-width separator; the skin keeps that title grammar without the hard
line: the label sets in full ink on opaque warm paper marked by a crimson
chapter bar and capped by a solid gold ring, and a soft gold rule fades in
and out across the column under it (one per turn; the running state keeps
its own brighter rule with the sweep riding it). The fold labels keep the
lighter translucent wash. The fold-state chevron — a 14px 1px-stroke svg in
the host's caption grey, previously invisible on the paper pill — reads as
an ink arrow on a solid gold badge; its rotation is the host's own
data-open rule, which an earliertransform: scale(1.12)on the badge had
silently overridden (the arrow stopped turning) — the badge now scales via
the individualscaleproperty, which composes with the host's transform.
The 14px box is untouched, so nothing around it moves. - The ladder of gold hairlines under an expanded fold is gone. The old chapter
rule drew a 1px gold border under every[data-step-process][data-chat-paging-anchor]
row, but every step row carries that anchor — the rows inside an expanded
body and the virtualizer's compressed stubs included — so a fold rendered a
stack of hairlines, loudest in dark mode. The hairline was removed; the fold
labels' wash pills carry the chapter language instead. - The expanded work-step body no longer glues its rows together: the host
stacked the call rows directly under the disclosure and against the next
fold, so the crimson command rows read as attached to the title. The body
gets a 4px top margin and a 7px rhythm between its rows — they are static
content the user explicitly opened, not hover-revealed chrome, so the
geometry is safe to set. - The session navigation rail (the host's turn mini-map at the pane's right
edge) is findable again. It drew every turn as a 20×2 tick in
--dsw-alias-border-l4, which dissolved over the artwork; the rail now gets
a paper seat fading in from the pane edge, loaded turns read in the skin's
ink, unloaded ones stay fainter, and the current turn takes the brand colour
(crimson in light, gold in dark). Anchored through
[data-slot='conversation.view'] nav:has([class*='_marks']), so no CSS-module
hash is load-bearing. - The asset form (dsh-skins
skins/verdandi) re-declared the old fading
gradient in its later status-swap rule, which would have silently overridden
the chapter rule; the duplicate declaration is removed so both forms resolve
through the same single rule.
Verified
- Live, on the running app with the asset form served from the skin center:
computed styles carry the new wash (tail alpha 0.649), the floating tooltip
measures 58×42 centred on the button axis over the row, and screenshots in
both themes show the finished process rows on their paper pills, the
badged chevron, and the rail. Dark mode was already healthy (12.3:1 bare,
15.5:1 triggers, 10.5:1 clock pill) and is unchanged apart from sharing the
same wash tokens. Gates: 43/43 tests,tsc --noEmitclean, anchor parity
holds, skin-center catalog PASS, live fingerprint PASS.
Verdandi · White Vow v0.1.4
Fixed
- One avatar per assistant node. dsh 0.1.7 renders the reasoning block and the
folded work-steps body inside the transcript, and both contain markdown of their
own, so the avatar decoration was attached to those too and expanding either
block grew a second and third avatar. - The tail clock and copy/branch row no longer jitter on hover. The host fades that
row in through[data-actions-reveal=hover]:hover, and the skin had been
resizing it (width, height, margin, padding, border), so the buttons slid under
the pointer while the fade ran and the two hover states fought each other. The
row is now painted and never resized; the harness proves the geometry is
identical before and after a forced hover. - The rows the host draws without a surface are readable again. The session header
was never marked at all — the hook looked for
[data-slot='conversation.session.header'] > header, which 0.1.7 no longer
renders — so the header surface, its agent-team and mode chips and its 对话/轨迹
tabs stayed unstyled; the trigger rows (收到执行请求, 继续执行目标) lost their
surface on hover because the skin's translucent tint replaced the host's opaque
fill; and the user message's clock row lives beside the bubble instead of inside
the turn tail, so it never received the slip. All three are covered now, and every
hover-revealed row stays paint-only. The context notice row is marked for the slip
through its own[data-context-source]/[data-context-summary]attributes.
Changed
- Light mode no longer washes the conversation. The stage veil was white at 30%,
which pushed the whole column towards paper white and read as an overlay over the
artwork; it is now a warm neutral at 18% that darkens instead of washing. The
caption seat also joins the ink family, so the clock, the copy icons and the tool
captions stop resolving to a cool grey over this skin's ivory surfaces. - The running status is an in-flow status line instead of a floating white bar: no
fill, no radius, the label as the chapter's own caption, and the gold hairline
under the row carrying the sweep. The copy keeps a paper wash that fades out,
because bare ink over the artwork's darkest band measures 1.14:1. - The folded work-steps group (dsh 0.1.7
[data-step-process], which the skin had
no rule for at all) now carries the same chapter language as the turn row, with
its label addressed through the host's own[data-process-activity]anchor.
Notes
- The two forms are back in anchor parity. The asset port had anchored the turn
tail ondata-dsh-part="turn-tail", an attribute the shell never emits, so its
tail rules were dead in the real app while the plugin form worked. It now uses
data-turn-tail, andtests/anchor-parity.spec.tsfails when the forms drift
apart again, including on a fresh checkout where the port is not present. - Backward compatible with the pre-0.1.7 shell: the new rules are inert there, and
the 0.1.5 mirror renders 0 differing pixels against 0.1.3 in both forms.
npm: https://www.npmjs.com/package/@hjbztlbr/dsh-client-ui-skin-verdandi/v/0.1.4
Verdandi · White Vow v0.1.3
Fixed
- Keep the "new session" chip readable on the dsh 0.1.7 shell. The sidebar button
now wraps its label innewSessionLabel/newSessionContentand appends a
shortcut hint, so the exact-text hook stopped matching and the chip fell back to
the host default — near-white on the skin's ivory sidebar in light mode. The
chip is now tagged by the stablenewSessionclass suffix, with the text rule
kept as the fallback for older shells. - Keep the running status on the dsh 0.1.7 shell. The host removed the
_turnStatusclass when it moved the live status into the turn-process ribbon,
which silently retired the skin's copy swap; the host wording came back. The
swap is now anchored on[data-turn-process] [class*="_label"]and scoped to
the running state by adata-verdandi-runningmarker, so the running line shows
the skin's own wording while the finished states keep the host's.
Notes
- Backward compatible with the pre-0.1.7 shell. The change set is additive: no
legacy selector or text rule was removed, and the new logic stays inert where
the new structures are absent. Verified against a DOM reconstructed from the
0.1.5 runtime in both skin forms, light and dark: 0 differing pixels versus
0.1.2, while the 0.1.7 structures pick up the fix.
npm: https://www.npmjs.com/package/@hjbztlbr/dsh-client-ui-skin-verdandi/v/0.13
Verdandi · White Vow v0.1.2
Fixed
- Contain wide tables inside the message card instead of letting the host's
full-bleed wrapper push them past the card edge, where the official
overflow-x: hiddencut them off.
Changed
- Rewrote §15 of the design document for a public audience.
- Ignore the
.external/working directory and scope the test runner to
tests/, so a local clone of a related repository cannot join the test run.
npm: https://www.npmjs.com/package/@hjbztlbr/dsh-client-ui-skin-verdandi/v/0.12
Verdandi · White Vow v0.1.0
Verdandi · White Vow v0.1.0
首个公开版本 / Initial public release.
安装 / Install
From npm:
dsh plugin --profile web add @hjbztlbr/dsh-client-ui-skin-verdandi
From GitHub:
dsh plugin --profile web add github:Sddft97/dsh-client-ui-skin-verdandi
安装后请在 DSH 皮肤管理界面启用“薇儿丹蒂 · 纯白圣誓”,并按 Ctrl+F5 强制刷新。
Enable “Verdandi · White Vow” in the DSH skin manager, then press Ctrl+F5 to force-refresh.
Highlights
- 薇儿丹蒂誓约婚礼主题的侧边栏、顶栏、输入区、消息卡及详情栏设计。
- 昼夜背景与亮色/暗色模式适配。
- 响应式双侧角色立绘与窄屏降级。
- Compatible presentation-layer integration that does not inject services or alter model requests.
完整安装说明、截图和版权说明见仓库 README。
See the repository README for full installation instructions, screenshots, and rights notices.