Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
8 changes: 3 additions & 5 deletions playwright/helpers/app-test-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -305,10 +305,8 @@
.then(text => text.trim())
}

export const getCollapseButton = (
page: Page,
panelName: 'component' | 'styles' | 'preview',
) => page.locator(`#collapse-${panelName}`)
export const getCollapseButton = (page: Page, panelName: 'preview') =>
page.locator(`#collapse-${panelName}`)

export const getToolsButton = (page: Page, panelName: 'component' | 'styles') =>
page.locator(`#tools-${panelName}`)
Expand Down Expand Up @@ -552,7 +550,7 @@
await ensureWorkspacesDrawerClosed(page)

const repoSelect = page.getByLabel('Pull request repository')
await expect(repoSelect).toHaveValue('knightedcodemonkey/develop')

Check failure on line 553 in playwright/helpers/app-test-helpers.ts

View workflow job for this annotation

GitHub Actions / E2E (Playwright, chromium)

[chromium] › playwright/github-byot-ai.spec.ts:918:1 › clearing chat removes previous conversation context from new request

1) [chromium] › playwright/github-byot-ai.spec.ts:918:1 › clearing chat removes previous conversation context from new request Error: expect(locator).toHaveValue(expected) failed Locator: getByLabel('Pull request repository') Expected: "knightedcodemonkey/develop" Received: "" Timeout: 90000ms Call log: - Expect "toHaveValue" with timeout 90000ms - waiting for getByLabel('Pull request repository') 93 × locator resolved to <select disabled id="github-pr-repo-select" aria-label="Pull request repository">…</select> - unexpected value "" at helpers/app-test-helpers.ts:553 551 | 552 | const repoSelect = page.getByLabel('Pull request repository') > 553 | await expect(repoSelect).toHaveValue('knightedcodemonkey/develop') | ^ 554 | await expect(repoSelect).toBeDisabled() 555 | 556 | await expect( at connectByotWithSingleRepo (/home/runner/work/develop/develop/playwright/helpers/app-test-helpers.ts:553:28) at /home/runner/work/develop/develop/playwright/github-byot-ai.spec.ts:950:3

Check failure on line 553 in playwright/helpers/app-test-helpers.ts

View workflow job for this annotation

GitHub Actions / E2E (Playwright, webkit, shard 1/4)

[webkit] › playwright/github-byot-ai.spec.ts:853:1 › AI chat falls back to non-streaming response when streaming fails

3) [webkit] › playwright/github-byot-ai.spec.ts:853:1 › AI chat falls back to non-streaming response when streaming fails Error: expect(locator).toHaveValue(expected) failed Locator: getByLabel('Pull request repository') Expected: "knightedcodemonkey/develop" Received: "" Timeout: 90000ms Call log: - Expect "toHaveValue" with timeout 90000ms - waiting for getByLabel('Pull request repository') 93 × locator resolved to <select disabled id="github-pr-repo-select" aria-label="Pull request repository">…</select> - unexpected value "" at helpers/app-test-helpers.ts:553 551 | 552 | const repoSelect = page.getByLabel('Pull request repository') > 553 | await expect(repoSelect).toHaveValue('knightedcodemonkey/develop') | ^ 554 | await expect(repoSelect).toBeDisabled() 555 | 556 | await expect( at connectByotWithSingleRepo (/home/runner/work/develop/develop/playwright/helpers/app-test-helpers.ts:553:28) at /home/runner/work/develop/develop/playwright/github-byot-ai.spec.ts:898:3

Check failure on line 553 in playwright/helpers/app-test-helpers.ts

View workflow job for this annotation

GitHub Actions / E2E (Playwright, webkit, shard 1/4)

[webkit] › playwright/github-byot-ai.spec.ts:181:1 › AI chat drawer opens and closes

2) [webkit] › playwright/github-byot-ai.spec.ts:181:1 › AI chat drawer opens and closes ────────── Error: expect(locator).toHaveValue(expected) failed Locator: getByLabel('Pull request repository') Expected: "knightedcodemonkey/develop" Received: "" Timeout: 90000ms Call log: - Expect "toHaveValue" with timeout 90000ms - waiting for getByLabel('Pull request repository') 93 × locator resolved to <select disabled id="github-pr-repo-select" aria-label="Pull request repository">…</select> - unexpected value "" at helpers/app-test-helpers.ts:553 551 | 552 | const repoSelect = page.getByLabel('Pull request repository') > 553 | await expect(repoSelect).toHaveValue('knightedcodemonkey/develop') | ^ 554 | await expect(repoSelect).toBeDisabled() 555 | 556 | await expect( at connectByotWithSingleRepo (/home/runner/work/develop/develop/playwright/helpers/app-test-helpers.ts:553:28) at /home/runner/work/develop/develop/playwright/github-byot-ai.spec.ts:183:3

Check failure on line 553 in playwright/helpers/app-test-helpers.ts

View workflow job for this annotation

GitHub Actions / E2E (Playwright, webkit, shard 1/4)

[webkit] › playwright/github-byot-ai.spec.ts:86:1 › GitHub token info panel reflects missing and present token states

1) [webkit] › playwright/github-byot-ai.spec.ts:86:1 › GitHub token info panel reflects missing and present token states Error: expect(locator).toHaveValue(expected) failed Locator: getByLabel('Pull request repository') Expected: "knightedcodemonkey/develop" Received: "" Timeout: 90000ms Call log: - Expect "toHaveValue" with timeout 90000ms - waiting for getByLabel('Pull request repository') 93 × locator resolved to <select disabled id="github-pr-repo-select" aria-label="Pull request repository">…</select> - unexpected value "" at helpers/app-test-helpers.ts:553 551 | 552 | const repoSelect = page.getByLabel('Pull request repository') > 553 | await expect(repoSelect).toHaveValue('knightedcodemonkey/develop') | ^ 554 | await expect(repoSelect).toBeDisabled() 555 | 556 | await expect( at connectByotWithSingleRepo (/home/runner/work/develop/develop/playwright/helpers/app-test-helpers.ts:553:28) at /home/runner/work/develop/develop/playwright/github-byot-ai.spec.ts:118:3
await expect(repoSelect).toBeDisabled()

await expect(
Expand All @@ -564,7 +562,7 @@

export const expectCollapseButtonState = async (
page: Page,
panelName: 'component' | 'styles' | 'preview',
panelName: 'preview',
{
axis,
direction,
Expand Down
57 changes: 20 additions & 37 deletions playwright/layout-panels.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,49 +162,32 @@ test('expanded component and styles can shrink consistently in fixed layout', as
test('panel collapse axis and direction match fixed layout', async ({ page }) => {
await waitForInitialRender(page)
await expect(page.getByRole('main')).toHaveClass(/app-grid--preview-right/)
await expect(page.locator('#collapse-component')).toHaveCount(0)
await expect(page.locator('#collapse-styles')).toHaveCount(0)

await expectCollapseButtonState(page, 'component', {
axis: 'vertical',
direction: 'none',
collapsed: false,
})
await expectCollapseButtonState(page, 'styles', {
axis: 'vertical',
direction: 'none',
collapsed: false,
})
await expectCollapseButtonState(page, 'preview', {
axis: 'horizontal',
direction: 'right',
collapsed: false,
})
})

test('prevents collapsing all three panels at once', async ({ page }) => {
test('preview panel can collapse and expand', async ({ page }) => {
await waitForInitialRender(page)
const componentPanel = page.locator('#editor-panel-component')
const stylesPanel = page.locator('#editor-panel-styles')

await getCollapseButton(page, 'component').click()
await page.getByRole('button', { name: 'Open tab app.css' }).click()
await getCollapseButton(page, 'styles').click()
const previewPanel = page.locator('#preview-panel')

await expect(componentPanel).toHaveClass(/panel--collapsed-vertical/)
await expect(stylesPanel).toHaveClass(/panel--collapsed-vertical/)
await getCollapseButton(page, 'preview').click()
await expect(previewPanel).toHaveClass(/panel--collapsed-horizontal/)

await expectCollapseButtonState(page, 'preview', {
axis: 'horizontal',
direction: 'right',
collapsed: false,
disabled: true,
collapsed: true,
disabled: false,
})
await expect(getCollapseButton(page, 'preview')).toHaveAttribute(
'title',
'At least one panel must remain expanded.',
)

await page.getByRole('button', { name: 'Open tab App.tsx' }).click()
await getCollapseButton(page, 'component').click()
await getCollapseButton(page, 'preview').click()
await expect(previewPanel).not.toHaveClass(/panel--collapsed-horizontal/)
await expectCollapseButtonState(page, 'preview', {
axis: 'horizontal',
direction: 'right',
Expand All @@ -215,25 +198,25 @@ test('prevents collapsing all three panels at once', async ({ page }) => {

test('does not persist panel collapse state across reload', async ({ page }) => {
await waitForInitialRender(page)
const componentPanel = page.locator('#editor-panel-component')
const previewPanel = page.locator('#preview-panel')

await getCollapseButton(page, 'component').click()
await expect(componentPanel).toHaveClass(/panel--collapsed-vertical/)
await expectCollapseButtonState(page, 'component', {
axis: 'vertical',
direction: 'none',
await getCollapseButton(page, 'preview').click()
await expect(previewPanel).toHaveClass(/panel--collapsed-horizontal/)
await expectCollapseButtonState(page, 'preview', {
axis: 'horizontal',
direction: 'right',
collapsed: true,
})

await page.reload()
await waitForInitialRender(page)

await expect(componentPanel).not.toHaveClass(
await expect(previewPanel).not.toHaveClass(
/panel--collapsed-horizontal|panel--collapsed-vertical/,
)
await expectCollapseButtonState(page, 'component', {
axis: 'vertical',
direction: 'none',
await expectCollapseButtonState(page, 'preview', {
axis: 'horizontal',
direction: 'right',
collapsed: false,
})
})
Expand Down
2 changes: 0 additions & 2 deletions playwright/workspace-tabs.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -414,8 +414,6 @@ test('active tab remains source of truth for visible editor panel', async ({ pag
).toHaveAttribute('aria-current', 'true')
await expect(componentPanel).not.toHaveAttribute('hidden', '')
await expect(stylesPanel).toHaveAttribute('hidden', '')

await page.locator('#collapse-component').click()
await page.getByRole('button', { name: 'Open tab app.css' }).click()

await expect(page.getByRole('button', { name: 'Open tab app.css' })).toHaveAttribute(
Expand Down
34 changes: 0 additions & 34 deletions src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -383,23 +383,6 @@ <h2 id="editor-header-component" class="panel-header__title-with-status">
</svg>
</h2>
<div class="controls controls--quick-actions panel-header-quick-actions">
<button
class="panel-collapse-toggle"
id="collapse-component"
type="button"
data-panel-collapse="component"
data-collapse-axis="vertical"
data-collapsed="false"
aria-expanded="true"
aria-controls="editor-panel-content-component"
aria-label="Collapse editor panel"
title="Collapse editor panel"
>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="m6 9 6 6 6-6"></path>
</svg>
<span class="panel-collapse-toggle__label">Collapse</span>
</button>
<button
class="icon-button editor-tools-toggle"
id="tools-component"
Expand Down Expand Up @@ -515,23 +498,6 @@ <h2 id="editor-header-styles" class="panel-header__title-with-status">
</svg>
</h2>
<div class="controls controls--quick-actions panel-header-quick-actions">
<button
class="panel-collapse-toggle"
id="collapse-styles"
type="button"
data-panel-collapse="styles"
data-collapse-axis="vertical"
data-collapsed="false"
aria-expanded="true"
aria-controls="editor-panel-content-styles"
aria-label="Collapse editor panel"
title="Collapse editor panel"
>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="m6 9 6 6 6-6"></path>
</svg>
<span class="panel-collapse-toggle__label">Collapse</span>
</button>
<button
class="icon-button editor-tools-toggle"
id="tools-styles"
Expand Down
86 changes: 7 additions & 79 deletions src/modules/app-core/layout-diagnostics-setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ const createLayoutDiagnosticsSetup = ({
compactAiControlsUi,
appGrid,
previewPanel,
componentEditorPanel,
stylesEditorPanel,
panelCollapseButtons,
editorKinds,
Comment thread
knightedcodemonkey marked this conversation as resolved.
editorPanelsByKind,
Expand All @@ -20,19 +18,15 @@ const createLayoutDiagnosticsSetup = ({
cssEditor,
}) => {
const getPanelCollapseAxis = panelName => {
if (compactAiControlsUi.isCompactViewport()) {
if (panelName !== 'preview') {
return 'vertical'
}

if (panelName === 'preview') {
return 'horizontal'
}

if (panelName === 'component' || panelName === 'styles') {
if (compactAiControlsUi.isCompactViewport()) {
return 'vertical'
}

return 'vertical'
return 'horizontal'
}

const getPanelCollapseDirection = panelName => {
Expand All @@ -45,20 +39,10 @@ const createLayoutDiagnosticsSetup = ({
return 'right'
}

if (panelName === 'component') {
return 'left'
}

if (panelName === 'styles') {
return 'right'
}

return 'right'
}

const panelCollapseState = {
component: false,
styles: false,
preview: false,
}

Expand Down Expand Up @@ -91,19 +75,7 @@ const createLayoutDiagnosticsSetup = ({
}
}

const normalizePanelCollapseState = () => {
const collapsedPanels = Object.entries(panelCollapseState)
.filter(([, isCollapsed]) => isCollapsed)
.map(([panelName]) => panelName)

if (collapsedPanels.length === Object.keys(panelCollapseState).length) {
panelCollapseState.preview = false
}
}

const syncPanelCollapseButtons = () => {
const collapsedCount = Object.values(panelCollapseState).filter(Boolean).length

for (const button of panelCollapseButtons) {
const panelName = button.dataset.panelCollapse
if (!panelName || !Object.hasOwn(panelCollapseState, panelName)) {
Expand All @@ -114,57 +86,26 @@ const createLayoutDiagnosticsSetup = ({
const direction = getPanelCollapseDirection(panelName)
const isCollapsed = panelCollapseState[panelName] === true
const panelTitle = `${panelName.charAt(0).toUpperCase()}${panelName.slice(1)}`
const canCollapse = isCollapsed || collapsedCount < 2

button.dataset.collapseAxis = axis
button.dataset.collapseDirection = direction
button.dataset.collapsed = isCollapsed ? 'true' : 'false'
button.setAttribute('aria-expanded', isCollapsed ? 'false' : 'true')
button.disabled = !canCollapse
button.setAttribute('aria-disabled', canCollapse ? 'false' : 'true')
button.disabled = false
button.setAttribute('aria-disabled', 'false')
button.setAttribute(
'aria-label',
`${isCollapsed ? 'Expand' : 'Collapse'} ${panelTitle.toLowerCase()} panel`,
)
button.setAttribute(
'title',
canCollapse
? `${isCollapsed ? 'Expand' : 'Collapse'} ${panelTitle.toLowerCase()} panel`
: 'At least one panel must remain expanded.',
`${isCollapsed ? 'Expand' : 'Collapse'} ${panelTitle.toLowerCase()} panel`,
)
}
}

const applyPanelCollapseState = () => {
normalizePanelCollapseState()

const previewAxis = getPanelCollapseAxis('preview')
const componentAxis = getPanelCollapseAxis('component')
const stylesAxis = getPanelCollapseAxis('styles')

if (componentEditorPanel) {
const isCollapsed = panelCollapseState.component
componentEditorPanel.classList.toggle(
'panel--collapsed-vertical',
isCollapsed && componentAxis === 'vertical',
)
componentEditorPanel.classList.toggle(
'panel--collapsed-horizontal',
isCollapsed && componentAxis === 'horizontal',
)
}

if (stylesEditorPanel) {
const isCollapsed = panelCollapseState.styles
stylesEditorPanel.classList.toggle(
'panel--collapsed-vertical',
isCollapsed && stylesAxis === 'vertical',
)
stylesEditorPanel.classList.toggle(
'panel--collapsed-horizontal',
isCollapsed && stylesAxis === 'horizontal',
)
}

if (previewPanel) {
const isCollapsed = panelCollapseState.preview
Expand All @@ -183,25 +124,12 @@ const createLayoutDiagnosticsSetup = ({
panelCollapseState.preview && previewAxis === 'horizontal',
)
appGrid.classList.toggle('app-grid--preview-collapsed', panelCollapseState.preview)
appGrid.classList.toggle(
'app-grid--component-collapsed',
panelCollapseState.component,
)
appGrid.classList.toggle('app-grid--styles-collapsed', panelCollapseState.styles)
appGrid.classList.toggle(
'app-grid--component-collapsed-horizontal',
panelCollapseState.component && componentAxis === 'horizontal',
)
appGrid.classList.toggle(
'app-grid--styles-collapsed-horizontal',
panelCollapseState.styles && stylesAxis === 'horizontal',
)

syncPanelCollapseButtons()
}

const togglePanelCollapse = panelName => {
if (!Object.hasOwn(panelCollapseState, panelName)) {
if (panelName !== 'preview') {
return
}

Expand Down
4 changes: 2 additions & 2 deletions src/styles/ai-controls.css
Original file line number Diff line number Diff line change
Expand Up @@ -1029,7 +1029,7 @@
accent-color: var(--accent);
}

@media (max-width: 1090px) {
@media (width <= 1090px) {
.app-grid-layout-controls {
flex-wrap: nowrap;
}
Expand All @@ -1045,7 +1045,7 @@
}
}

@media (max-width: 900px) {
@media (width <= 900px) {
.app-grid-layout-controls {
flex-wrap: nowrap;
}
Expand Down
2 changes: 1 addition & 1 deletion src/styles/base.css
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ body {
color: var(--shell-text);
}

@media (max-width: 900px) {
@media (width <= 900px) {
body {
height: auto;
min-height: 100dvh;
Expand Down
2 changes: 1 addition & 1 deletion src/styles/diagnostics.css
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@
}
}

@media (max-width: 900px) {
@media (width <= 900px) {
.diagnostics-drawer {
top: auto;
right: 24px;
Expand Down
4 changes: 2 additions & 2 deletions src/styles/dialogs-overlays.css
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
outline-offset: 1px;
}

@media (max-width: 900px) {
@media (width <= 900px) {
.panel-header-main-actions .controls,
.controls--actions {
justify-content: flex-start;
Expand Down Expand Up @@ -128,7 +128,7 @@
transform: translateY(0);
}

@media (max-width: 900px) {
@media (width <= 900px) {
.app-toast {
left: 12px;
right: 12px;
Expand Down
Loading
Loading