Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions patches/@deepseek-ai+dsh-client-ui-layout+0.1.0-rc.6.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
diff --git a/node_modules/@deepseek-ai/dsh-client-ui-layout/lib/client.js b/node_modules/@deepseek-ai/dsh-client-ui-layout/lib/client.js
index a85b668..8d2bccf 100644
--- a/node_modules/@deepseek-ai/dsh-client-ui-layout/lib/client.js
+++ b/node_modules/@deepseek-ai/dsh-client-ui-layout/lib/client.js
@@ -11,6 +11,7 @@ window.__ModuleLoader__.load({
* LG breakpoint); a manual toggle below it re-expands over the squeezed center
* (stores.ts narrowExpanded). */
const SIDEBAR_AUTO_COLLAPSE = 1024;
+ const COLLAPSED_SIDEBAR_WIDTH = navigator.userAgent.includes("Macintosh") ? 80 : 56;
/**
* Clamp a panel width into its contract range.
* @param px - requested width.
@@ -32,7 +33,7 @@ window.__ModuleLoader__.load({
* @returns resolved widths; details 0 means visually closed (never unmounted), while a closed sidebar keeps its compact rail.
*/
function computeColumns(viewport, sidebar, details) {
- const s = sidebar === 0 ? 56 : clampWidth(sidebar, 264, 420);
+ const s = sidebar === 0 ? COLLAPSED_SIDEBAR_WIDTH : clampWidth(sidebar, 264, 420);
const d0 = details === 0 ? 0 : clampWidth(details, 300, 520);
if (s + d0 + 640 <= viewport) return {
sidebar: s,
6 changes: 3 additions & 3 deletions patches/@deepseek-ai+dsh-client-ui-sidebar+0.1.0-rc.6.patch
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
diff --git a/node_modules/@deepseek-ai/dsh-client-ui-sidebar/lib/client.js b/node_modules/@deepseek-ai/dsh-client-ui-sidebar/lib/client.js
index 629e313..d9d3fa4 100644
index 629e313..27a52a1 100644
--- a/node_modules/@deepseek-ai/dsh-client-ui-sidebar/lib/client.js
+++ b/node_modules/@deepseek-ai/dsh-client-ui-sidebar/lib/client.js
@@ -23,16 +23,19 @@ window.__ModuleLoader__.load({
}
//#endregion
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-sidebar/src/client/SidebarRoot.module.css.mjs
- const css = ".hHd-Xa_root{--dsh-sidebar-inline-padding:12px;height:100%;padding:6px var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:14px;display:flex}.hHd-Xa_root.hHd-Xa_collapsed{padding:18px 10px 6px}.hHd-Xa_root.hHd-Xa_quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.hHd-Xa_fading>*{opacity:0;transition:opacity .15s var(--ds-ease-in-out)}.hHd-Xa_wide{animation:hHd-Xa_wide-in .2s var(--ds-ease-in-out)}@keyframes hHd-Xa_wide-in{0%{opacity:0}}.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_regionArea{animation:hHd-Xa_rail-in .15s var(--ds-ease-in-out) backwards}.hHd-Xa_railIn .hHd-Xa_footArea{animation:hHd-Xa_rail-fade-in .15s var(--ds-ease-in-out) backwards}@keyframes hHd-Xa_rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes hHd-Xa_rail-fade-in{0%{opacity:0}}.hHd-Xa_logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:8px;height:60px;margin-bottom:8px;padding:8px 0 8px 4px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_logoRow{justify-content:flex-start;height:36px;margin-bottom:12px;padding:0}.hHd-Xa_brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}.hHd-Xa_iconButton{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.hHd-Xa_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_collapsed .hHd-Xa_iconButton{width:36px;height:36px}.hHd-Xa_collapsed .hHd-Xa_toggle .hHd-Xa_panelIcon{display:none}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_panelIcon{display:inline}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_railFish{display:none}.hHd-Xa_collapsed .hHd-Xa_iconButton{color:var(--dsw-alias-label-primary)}.hHd-Xa_newSession{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:12px;flex:none;justify-content:center;align-items:center;gap:6px;margin:0 2px 8px;padding:8px 16px;font-size:14px;font-weight:500;line-height:22px;display:flex;overflow:hidden}.hHd-Xa_newSession:hover{background:var(--dsw-alias-button-floating-hover)}.hHd-Xa_collapsed .hHd-Xa_newSession{background:0 0;border-color:#0000;align-self:flex-start;gap:0;width:36px;height:36px;margin:0 0 12px;padding:0}.hHd-Xa_collapsed .hHd-Xa_newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_newSessionLabel{white-space:nowrap;max-width:200px;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_newSessionLabel{max-width:0}.hHd-Xa_regionArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:4px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_regionArea{margin-left:0;margin-right:0;padding-left:0}.hHd-Xa_footArea{flex-direction:column;flex:none;display:flex}.hHd-Xa_settingsArea,.hHd-Xa_footerActions{flex:none;width:100%;min-width:0}.hHd-Xa_footerActions{display:flex}.hHd-Xa_collapsed .hHd-Xa_footArea{align-items:center}.hHd-Xa_collapsed .hHd-Xa_settingsArea,.hHd-Xa_collapsed .hHd-Xa_footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.hHd-Xa_wide,.hHd-Xa_fading>*,.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_footArea,.hHd-Xa_railIn .hHd-Xa_regionArea{transition:none;animation:none}}";
+ const css = ".hHd-Xa_root{--dsh-sidebar-inline-padding:12px;height:100%;padding:6px var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:14px;display:flex}.hHd-Xa_root.hHd-Xa_collapsed{padding:18px 10px 6px}.hHd-Xa_root.hHd-Xa_quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.hHd-Xa_fading>*{opacity:0;transition:opacity .15s var(--ds-ease-in-out)}.hHd-Xa_wide{animation:hHd-Xa_wide-in .2s var(--ds-ease-in-out)}@keyframes hHd-Xa_wide-in{0%{opacity:0}}.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_regionArea{animation:hHd-Xa_rail-in .15s var(--ds-ease-in-out) backwards}.hHd-Xa_railIn .hHd-Xa_footArea{animation:hHd-Xa_rail-fade-in .15s var(--ds-ease-in-out) backwards}@keyframes hHd-Xa_rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes hHd-Xa_rail-fade-in{0%{opacity:0}}.hHd-Xa_logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:8px;height:56px;margin-bottom:8px;padding:8px 2px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_logoRow{justify-content:flex-start;height:36px;margin-bottom:12px;padding:0}.hHd-Xa_brand{min-width:0;height:40px;color:inherit;cursor:pointer;background:0 0;border:none;border-radius:10px;flex:1;align-items:center;padding:3px 6px;display:inline-flex;overflow:hidden}.hHd-Xa_brand:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_brandLockup{min-width:0;align-items:center;gap:9px;display:inline-flex}.hHd-Xa_brandMark{width:34px;height:34px;flex:none;justify-content:center;align-items:center;display:inline-flex}.hHd-Xa_brandWordmark{width:158px;height:24px;color:var(--dsw-alias-label-primary);flex:none;display:inline-flex;overflow:hidden}.hHd-Xa_brandWordmark>svg{max-width:none;flex:none;transform:translateX(-24px)}.hHd-Xa_iconButton{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.hHd-Xa_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_collapsed .hHd-Xa_iconButton{width:36px;height:36px}.hHd-Xa_collapsed .hHd-Xa_toggle .hHd-Xa_panelIcon{display:none}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_panelIcon{display:inline}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_railFish{display:none}.hHd-Xa_collapsed .hHd-Xa_iconButton{color:var(--dsw-alias-label-primary)}.hHd-Xa_newSession{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:12px;flex:none;justify-content:center;align-items:center;gap:6px;margin:0 2px 8px;padding:8px 16px;font-size:14px;font-weight:500;line-height:22px;display:flex;overflow:hidden}.hHd-Xa_newSession:hover{background:var(--dsw-alias-button-floating-hover)}.hHd-Xa_collapsed .hHd-Xa_newSession{background:0 0;border-color:#0000;align-self:flex-start;gap:0;width:36px;height:36px;margin:0 0 12px;padding:0}.hHd-Xa_collapsed .hHd-Xa_newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_newSessionLabel{white-space:nowrap;max-width:200px;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_newSessionLabel{max-width:0}.hHd-Xa_regionArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:4px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_regionArea{margin-left:0;margin-right:0;padding-left:0}.hHd-Xa_footArea{flex-direction:column;flex:none;display:flex}.hHd-Xa_settingsArea,.hHd-Xa_footerActions{flex:none;width:100%;min-width:0}.hHd-Xa_footerActions{display:flex}.hHd-Xa_collapsed .hHd-Xa_footArea{align-items:center}.hHd-Xa_collapsed .hHd-Xa_settingsArea,.hHd-Xa_collapsed .hHd-Xa_footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.hHd-Xa_wide,.hHd-Xa_fading>*,.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_footArea,.hHd-Xa_railIn .hHd-Xa_regionArea{transition:none;animation:none}}";
+ const css = ".hHd-Xa_root{--dsh-sidebar-inline-padding:12px;height:100%;padding:6px var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:14px;display:flex}.hHd-Xa_root.hHd-Xa_collapsed{padding:18px 10px 6px}.hHd-Xa_root.hHd-Xa_quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.hHd-Xa_fading>*{opacity:0;transition:opacity .15s var(--ds-ease-in-out)}.hHd-Xa_wide{animation:hHd-Xa_wide-in .2s var(--ds-ease-in-out)}@keyframes hHd-Xa_wide-in{0%{opacity:0}}.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_regionArea{animation:hHd-Xa_rail-in .15s var(--ds-ease-in-out) backwards}.hHd-Xa_railIn .hHd-Xa_footArea{animation:hHd-Xa_rail-fade-in .15s var(--ds-ease-in-out) backwards}@keyframes hHd-Xa_rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes hHd-Xa_rail-fade-in{0%{opacity:0}}.hHd-Xa_logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:8px;height:56px;margin-bottom:8px;padding:8px 2px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_logoRow{justify-content:flex-start;height:36px;margin-bottom:12px;padding:0}.hHd-Xa_brand{min-width:0;height:40px;color:inherit;cursor:pointer;background:0 0;border:none;border-radius:10px;flex:1;align-items:center;padding:3px 6px;display:inline-flex;overflow:hidden}.hHd-Xa_brand:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_brandLockup{min-width:0;align-items:center;gap:4px;display:inline-flex}.hHd-Xa_brandMark{width:34px;height:34px;flex:none;justify-content:center;align-items:center;display:inline-flex}.hHd-Xa_brandWordmark{width:158px;height:24px;color:var(--dsw-alias-label-primary);flex:none;display:inline-flex;overflow:hidden}.hHd-Xa_brandWordmark>svg{max-width:none;flex:none;transform:translateX(-24px)}.hHd-Xa_iconButton{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.hHd-Xa_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_collapsed .hHd-Xa_iconButton{width:36px;height:36px}.hHd-Xa_collapsed .hHd-Xa_toggle .hHd-Xa_panelIcon{display:none}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_panelIcon{display:inline}.hHd-Xa_collapsed .hHd-Xa_toggle:hover .hHd-Xa_railFish{display:none}.hHd-Xa_collapsed .hHd-Xa_iconButton{color:var(--dsw-alias-label-primary)}.hHd-Xa_newSession{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:12px;flex:none;justify-content:center;align-items:center;gap:6px;margin:0 2px 8px;padding:8px 16px;font-size:14px;font-weight:500;line-height:22px;display:flex;overflow:hidden}.hHd-Xa_newSession:hover{background:var(--dsw-alias-button-floating-hover)}.hHd-Xa_collapsed .hHd-Xa_newSession{background:0 0;border-color:#0000;align-self:flex-start;gap:0;width:36px;height:36px;margin:0 0 12px;padding:0}.hHd-Xa_collapsed .hHd-Xa_newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.hHd-Xa_newSessionLabel{white-space:nowrap;max-width:200px;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_newSessionLabel{max-width:0}.hHd-Xa_regionArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:4px;display:flex;overflow:hidden}.hHd-Xa_collapsed .hHd-Xa_regionArea{margin-left:0;margin-right:0;padding-left:0}.hHd-Xa_footArea{flex-direction:column;flex:none;display:flex}.hHd-Xa_settingsArea,.hHd-Xa_footerActions{flex:none;width:100%;min-width:0}.hHd-Xa_footerActions{display:flex}.hHd-Xa_collapsed .hHd-Xa_footArea{align-items:center}.hHd-Xa_collapsed .hHd-Xa_settingsArea,.hHd-Xa_collapsed .hHd-Xa_footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.hHd-Xa_wide,.hHd-Xa_fading>*,.hHd-Xa_railIn .hHd-Xa_iconButton,.hHd-Xa_railIn .hHd-Xa_newSession,.hHd-Xa_railIn .hHd-Xa_footArea,.hHd-Xa_railIn .hHd-Xa_regionArea{transition:none;animation:none}}";
const tagId = "@deepseek-ai/dsh-client-ui-sidebar/SidebarRoot.module.css";
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
const tag = document.createElement("style");
tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-sidebar";
tag.dataset.pluginCss = tagId;
- tag.textContent = css;
+ tag.textContent = css + ".hHd-Xa_root:not(.hHd-Xa_collapsed){padding-top:22px}";
+ tag.textContent = css + ".hHd-Xa_root:not(.hHd-Xa_collapsed){padding-top:32px}" + (navigator.userAgent.includes("Macintosh") ? ".hHd-Xa_root.hHd-Xa_collapsed{padding:46px 22px 6px}" : "");
document.head.appendChild(tag);
}
var SidebarRoot_module_css_default = {
Expand Down
41 changes: 7 additions & 34 deletions src/main/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,37 +28,13 @@ let failureDialogVisible = false
async function syncNativeTheme(window: BrowserWindow): Promise<void> {
if (window.isDestroyed()) return

// The traffic-light strip remains dark in both Harness appearances. Harness
// exposes its resolved appearance on body[data-ds-dark-theme], which the
// sidebar branding follows directly.
nativeTheme.themeSource = 'dark'
window.setBackgroundColor('#141416')
await window.webContents.executeJavaScript(`
(() => {
if (${process.platform === 'darwin'}) {
let style = document.getElementById('dsh-desktop-titlebar-style')
if (!style) {
style = document.createElement('style')
style.id = 'dsh-desktop-titlebar-style'
document.head.appendChild(style)
}
style.textContent = \`
html { --dsh-desktop-titlebar-height: 30px; }
body { box-sizing: border-box; padding-top: var(--dsh-desktop-titlebar-height); }
html::before {
content: '';
position: fixed;
z-index: 2147483647;
inset: 0 0 auto 0;
height: var(--dsh-desktop-titlebar-height);
background: #141416;
-webkit-app-region: drag;
}
\`
}

})()
`)
// The sidebar already reserves enough room for macOS traffic lights. Read
// Harness's resolved theme before showing the window so the native surface
// matches the first rendered frame without injecting a second titlebar.
const isDark = await window.webContents.executeJavaScript(
"document.body.hasAttribute('data-ds-dark-theme')"
)
window.setBackgroundColor(isDark ? '#141416' : '#ffffff')
}

function dshEntryPath(): string {
Expand All @@ -83,9 +59,6 @@ function desktopIconPath(): string {
}

function createWindow(): BrowserWindow {
// Harness restores its own theme after navigation. Start macOS in dark mode so
// the native traffic-light strip never flashes light before that state is readable.
if (process.platform === 'darwin') nativeTheme.themeSource = 'dark'
const window = new BrowserWindow({
width: 1380,
height: 900,
Expand Down
28 changes: 20 additions & 8 deletions test/branding-patch.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,17 @@ import { describe, expect, it } from 'vitest'
const projectRoot = path.resolve(import.meta.dirname, '..')

describe('DSH Desktop sidebar branding', () => {
it('keeps macOS chrome dark while tracking the page theme for branding', async () => {
it('matches the native window surface to the initial Harness theme', async () => {
const main = await readFile(path.join(projectRoot, 'src', 'main', 'index.ts'), 'utf8')

expect(main).toContain("frame: process.platform !== 'darwin'")
expect(main).toContain("if (process.platform === 'darwin') nativeTheme.themeSource = 'dark'")
expect(main).toContain("window.setBackgroundColor('#141416')")
expect(main).toContain("document.body.hasAttribute('data-ds-dark-theme')")
expect(main).toContain("window.setBackgroundColor(isDark ? '#141416' : '#ffffff')")
expect(main).toContain('window.setWindowButtonVisibility(true)')
expect(main).toContain('window.setWindowButtonPosition({ x: 12, y: 9 })')
expect(main).toContain('body[data-ds-dark-theme]')
expect(main).not.toContain('new MutationObserver')
expect(main).not.toContain('detectDarkPage')
expect(main).toContain('background: #141416')
expect(main).not.toContain('dsh-desktop-titlebar-style')
expect(main).not.toContain('--dsh-desktop-titlebar-height')
expect(main).not.toContain('body { box-sizing: border-box; padding-top:')
})

it('pairs the DSH logo with the original Harness wordmark in the expanded sidebar', async () => {
Expand All @@ -31,16 +30,29 @@ describe('DSH Desktop sidebar branding', () => {
expect(patch).toContain('/dsh-desktop-logo-light.png')
expect(patch).toContain('/dsh-desktop-logo-dark.png')
expect(patch).toContain('brandWordmark')
expect(patch).toContain('gap:4px')
expect(patch).toContain('transform:translateX(-24px)')
expect(patch).not.toContain('children: "DSH Desktop"')
expect(patch).toContain('height = 20')
expect(patch).toContain('height: 18')
expect(patch).toContain('.hHd-Xa_brand:hover')
expect(patch).toContain('padding-top:22px')
expect(patch).toContain('padding-top:32px')
expect(patch).toContain('navigator.userAgent.includes("Macintosh")')
expect(patch).toContain('.hHd-Xa_root.hHd-Xa_collapsed{padding:46px 22px 6px}')
expect(patch).toContain('body[data-ds-dark-theme] .dshDesktopLogoLight')
expect(patch).toContain('body[data-ds-dark-theme] .dshDesktopLogoDark')
})

it('uses an 80px macOS rail that clears the traffic lights', async () => {
const patch = await readFile(
path.join(projectRoot, 'patches', '@deepseek-ai+dsh-client-ui-layout+0.1.0-rc.6.patch'),
'utf8'
)

expect(patch).toContain('navigator.userAgent.includes("Macintosh") ? 80 : 56')
expect(patch).toContain('sidebar === 0 ? COLLAPSED_SIDEBAR_WIDTH')
})

it('installs the source logo into the Harness static frontend', async () => {
const packageJson = JSON.parse(
await readFile(path.join(projectRoot, 'package.json'), 'utf8')
Expand Down
Loading