Skip to content

Releases: Sddft97/dsh-client-ui-skin-verdandi

0.1.8

Choose a tag to compare

@github-actions github-actions released this 25 Oct 19:39

[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 legacy data-pane layout. 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-avatar the 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

Choose a tag to compare

@Sddft97 Sddft97 released this 09 Oct 18:19

[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-region is unused;
    adding a drag band 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 the no-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 carries data-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: drag on the header and its rows, no-drag
    on each control) and that property is inherited, so every decoration the skin mounted
    into the header inherited drag and 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: elementFromPoint skips
    pointer-events: none layers, 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-strip decoration that is drag again 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: drag declaration.
  • 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 is button + button too.
  • The header's own dropdown is clickable again. dsh 0.2.0 moved the title row one slot
    deeper (conversation.session.header, a display: contents seat), which made the
    skin's z-index: 3 rule 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 to z-index: 15 and 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

Choose a tag to compare

@Sddft97 Sddft97 released this 25 Sep 20:24

[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 individual scale property, which composes with
    it.
  • The clock pill no longer hugs its round edge: a constant, hover-independent
    padding-left: 10px moves 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 own transition: all that 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 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 earlier transform: scale(1.12) on the badge had
    silently overridden (the arrow stopped turning) — the badge now scales via
    the individual scale property, 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 --noEmit clean, anchor parity
    holds, skin-center catalog PASS, live fingerprint PASS.

Verdandi · White Vow v0.1.4

Choose a tag to compare

@Sddft97 Sddft97 released this 25 Sep 09:02

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 on data-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, and tests/anchor-parity.spec.ts fails 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

Choose a tag to compare

@Sddft97 Sddft97 released this 25 Sep 06:10

Fixed

  • Keep the "new session" chip readable on the dsh 0.1.7 shell. The sidebar button
    now wraps its label in newSessionLabel / newSessionContent and 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 stable newSession class 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
    _turnStatus class 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 a data-verdandi-running marker, 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

Choose a tag to compare

@Sddft97 Sddft97 released this 25 Sep 06:01

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: hidden cut 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

Choose a tag to compare

@Sddft97 Sddft97 released this 22 Aug 13:36

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.