Apply hover scrollbars to project internals

This commit is contained in:
2026-07-20 12:13:57 +08:00
parent d15ca2eb5f
commit a65012c1b3
2 changed files with 73 additions and 6 deletions

View File

@@ -32,8 +32,11 @@ const collectMetrics = async () => page.evaluate(() => {
const rail = document.querySelector('.project-rail') const rail = document.querySelector('.project-rail')
const railChildren = rail?.querySelector('.arco-layout-sider-children') const railChildren = rail?.querySelector('.arco-layout-sider-children')
const sidebar = document.querySelector('.channel-sidebar') const sidebar = document.querySelector('.channel-sidebar')
const channelList = document.querySelector('.channel-list')
const stage = document.querySelector('.stage') const stage = document.querySelector('.stage')
const inspector = document.querySelector('.inspector') const inspector = document.querySelector('.inspector')
const inspectorTabsContent = document.querySelector('.inspector .arco-tabs-content')
const propertyList = document.querySelector('.property-list')
const workspaceActions = [...document.querySelectorAll('.workspace-page .overview-head .arco-btn')] const workspaceActions = [...document.querySelectorAll('.workspace-page .overview-head .arco-btn')]
.map((button) => button.textContent?.trim()) .map((button) => button.textContent?.trim())
const dashboard = document.querySelector('.dashboard-button') const dashboard = document.querySelector('.dashboard-button')
@@ -91,8 +94,11 @@ const collectMetrics = async () => page.evaluate(() => {
projectRailOverflow: overflowState(rail), projectRailOverflow: overflowState(rail),
projectRailChildrenOverflow: overflowState(railChildren), projectRailChildrenOverflow: overflowState(railChildren),
channelSidebarOverflow: overflowState(sidebar), channelSidebarOverflow: overflowState(sidebar),
channelListOverflow: overflowState(channelList),
stageOverflow: overflowState(stage), stageOverflow: overflowState(stage),
inspectorOverflow: overflowState(inspector), inspectorOverflow: overflowState(inspector),
inspectorTabsContentOverflow: overflowState(inspectorTabsContent),
propertyListOverflow: overflowState(propertyList),
overflowX: document.documentElement.scrollWidth > document.documentElement.clientWidth, overflowX: document.documentElement.scrollWidth > document.documentElement.clientWidth,
viewportWidth: window.innerWidth, viewportWidth: window.innerWidth,
} }
@@ -117,6 +123,15 @@ await page.locator('.stage').hover()
const stageHoverMetrics = await collectMetrics() const stageHoverMetrics = await collectMetrics()
await page.locator('.inspector').hover() await page.locator('.inspector').hover()
const inspectorHoverMetrics = await collectMetrics() const inspectorHoverMetrics = await collectMetrics()
await page.locator('.channel-list').hover()
const channelListHoverMetrics = await collectMetrics()
await page.locator('.inspector .arco-tabs-content').hover()
const inspectorTabsContentHoverMetrics = await collectMetrics()
await page.getByText('属性', { exact: true }).click()
await page.waitForTimeout(200)
const propertyMetrics = await collectMetrics()
await page.locator('.property-list').hover()
const propertyListHoverMetrics = await collectMetrics()
await page.locator('.topbar-actions .arco-btn').first().click() await page.locator('.topbar-actions .arco-btn').first().click()
await page.screenshot({ path: 'test-results/project-react-acro-dark.png', fullPage: true }) await page.screenshot({ path: 'test-results/project-react-acro-dark.png', fullPage: true })
@@ -124,7 +139,18 @@ await page.screenshot({ path: 'test-results/project-react-acro-dark.png', fullPa
await browser.close() await browser.close()
await server.close() await server.close()
console.log(JSON.stringify({ workspaceMetrics, projectMetrics, channelSidebarHoverMetrics, stageHoverMetrics, inspectorHoverMetrics, errors }, null, 2)) console.log(JSON.stringify({
workspaceMetrics,
projectMetrics,
channelSidebarHoverMetrics,
stageHoverMetrics,
inspectorHoverMetrics,
channelListHoverMetrics,
inspectorTabsContentHoverMetrics,
propertyMetrics,
propertyListHoverMetrics,
errors,
}, null, 2))
const failures = [] const failures = []
const metrics = workspaceMetrics const metrics = workspaceMetrics
@@ -226,8 +252,10 @@ if (!projectMetrics.projectRail || !projectMetrics.channelSidebar || !projectMet
} }
for (const [name, overflow] of [ for (const [name, overflow] of [
['channel sidebar', projectMetrics.channelSidebarOverflow], ['channel sidebar', projectMetrics.channelSidebarOverflow],
['channel list', projectMetrics.channelListOverflow],
['stage', projectMetrics.stageOverflow], ['stage', projectMetrics.stageOverflow],
['inspector', projectMetrics.inspectorOverflow], ['inspector', projectMetrics.inspectorOverflow],
['inspector tabs content', projectMetrics.inspectorTabsContentOverflow],
]) { ]) {
if (!overflow || overflow.overflowX !== 'hidden' || overflow.overflowY !== 'auto') { if (!overflow || overflow.overflowX !== 'hidden' || overflow.overflowY !== 'auto') {
failures.push(`expected ${name} to hide horizontal scrollbars and show vertical scrollbars only when needed, got ${JSON.stringify(overflow)}`) failures.push(`expected ${name} to hide horizontal scrollbars and show vertical scrollbars only when needed, got ${JSON.stringify(overflow)}`)
@@ -238,13 +266,19 @@ for (const [name, overflow] of [
} }
for (const [name, overflow] of [ for (const [name, overflow] of [
['channel sidebar hover', channelSidebarHoverMetrics.channelSidebarOverflow], ['channel sidebar hover', channelSidebarHoverMetrics.channelSidebarOverflow],
['channel list hover', channelListHoverMetrics.channelListOverflow],
['stage hover', stageHoverMetrics.stageOverflow], ['stage hover', stageHoverMetrics.stageOverflow],
['inspector hover', inspectorHoverMetrics.inspectorOverflow], ['inspector hover', inspectorHoverMetrics.inspectorOverflow],
['inspector tabs content hover', inspectorTabsContentHoverMetrics.inspectorTabsContentOverflow],
['property list hover', propertyListHoverMetrics.propertyListOverflow],
]) { ]) {
if (overflow?.scrollbarWidth !== 'thin') { if (overflow?.scrollbarWidth !== 'thin') {
failures.push(`expected ${name} scrollbar to appear on hover, got ${JSON.stringify(overflow)}`) failures.push(`expected ${name} scrollbar to appear on hover, got ${JSON.stringify(overflow)}`)
} }
} }
if (propertyMetrics.propertyListOverflow?.scrollbarWidth !== 'none') {
failures.push(`expected property list scrollbar to be hidden until hover, got ${JSON.stringify(propertyMetrics.propertyListOverflow)}`)
}
if (failures.length) { if (failures.length) {
throw new Error(failures.join('\n')) throw new Error(failures.join('\n'))

View File

@@ -373,6 +373,10 @@
.channel-list { .channel-list {
display: grid; display: grid;
gap: 4px; gap: 4px;
overflow-x: hidden;
overflow-y: auto;
scrollbar-width: none;
scrollbar-color: color-mix(in srgb, var(--senlin-muted) 45%, transparent) transparent;
} }
.channel-button { .channel-button {
@@ -567,34 +571,49 @@
.channel-sidebar:hover, .channel-sidebar:hover,
.stage:hover, .stage:hover,
.inspector:hover { .inspector:hover,
.channel-list:hover,
.inspector .arco-tabs-content:hover,
.property-list:hover {
scrollbar-width: thin; scrollbar-width: thin;
} }
.channel-sidebar::-webkit-scrollbar, .channel-sidebar::-webkit-scrollbar,
.stage::-webkit-scrollbar, .stage::-webkit-scrollbar,
.inspector::-webkit-scrollbar { .inspector::-webkit-scrollbar,
.channel-list::-webkit-scrollbar,
.inspector .arco-tabs-content::-webkit-scrollbar,
.property-list::-webkit-scrollbar {
width: 0; width: 0;
height: 0; height: 0;
} }
.channel-sidebar:hover::-webkit-scrollbar, .channel-sidebar:hover::-webkit-scrollbar,
.stage:hover::-webkit-scrollbar, .stage:hover::-webkit-scrollbar,
.inspector:hover::-webkit-scrollbar { .inspector:hover::-webkit-scrollbar,
.channel-list:hover::-webkit-scrollbar,
.inspector .arco-tabs-content:hover::-webkit-scrollbar,
.property-list:hover::-webkit-scrollbar {
width: 8px; width: 8px;
height: 8px; height: 8px;
} }
.channel-sidebar::-webkit-scrollbar-thumb, .channel-sidebar::-webkit-scrollbar-thumb,
.stage::-webkit-scrollbar-thumb, .stage::-webkit-scrollbar-thumb,
.inspector::-webkit-scrollbar-thumb { .inspector::-webkit-scrollbar-thumb,
.channel-list::-webkit-scrollbar-thumb,
.inspector .arco-tabs-content::-webkit-scrollbar-thumb,
.property-list::-webkit-scrollbar-thumb {
border-radius: 999px; border-radius: 999px;
background: color-mix(in srgb, var(--senlin-muted) 45%, transparent); background: color-mix(in srgb, var(--senlin-muted) 45%, transparent);
} }
.channel-sidebar::-webkit-scrollbar-track, .channel-sidebar::-webkit-scrollbar-track,
.stage::-webkit-scrollbar-track, .stage::-webkit-scrollbar-track,
.inspector::-webkit-scrollbar-track { .inspector::-webkit-scrollbar-track,
.channel-list::-webkit-scrollbar-track,
.inspector .arco-tabs-content::-webkit-scrollbar-track,
.property-list::-webkit-scrollbar-track {
background: transparent; background: transparent;
} }
@@ -602,6 +621,13 @@
margin-bottom: 12px; margin-bottom: 12px;
} }
.inspector .arco-tabs-content {
overflow-x: hidden;
overflow-y: auto;
scrollbar-width: none;
scrollbar-color: color-mix(in srgb, var(--senlin-muted) 45%, transparent) transparent;
}
.discussion-panel { .discussion-panel {
display: grid; display: grid;
} }
@@ -653,6 +679,13 @@
width: 100%; width: 100%;
} }
.property-list {
overflow-x: hidden;
overflow-y: auto;
scrollbar-width: none;
scrollbar-color: color-mix(in srgb, var(--senlin-muted) 45%, transparent) transparent;
}
.property-row { .property-row {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;