@@ -691,6 +715,15 @@ onBeforeUnmount(() => {
min-width: 0;
height: 100%;
position: relative;
+ transition: grid-template-columns 220ms var(--ease, ease);
+}
+
+/* TAB-toggle: collapse the side columns so the stage takes the
+ full width. The asides themselves slide off via the .sidebar /
+ .properties transform rules below for a pop-out feel; the grid
+ transition smooths the stage's resize. */
+.app.panels-hidden {
+ grid-template-columns: 0 1fr 0;
}
.topbar {
@@ -856,6 +889,13 @@ onBeforeUnmount(() => {
flex-direction: column;
min-height: 0;
overflow: hidden;
+ transition: transform 220ms var(--ease, ease), opacity 180ms var(--ease, ease);
+}
+
+.app.panels-hidden .sidebar {
+ transform: translateX(-100%);
+ opacity: 0;
+ pointer-events: none;
}
.sidebar-scroll {
@@ -920,6 +960,13 @@ onBeforeUnmount(() => {
background: var(--panel);
border-left: 1px solid var(--border);
overflow: auto;
+ transition: transform 220ms var(--ease, ease), opacity 180ms var(--ease, ease);
+}
+
+.app.panels-hidden .properties {
+ transform: translateX(100%);
+ opacity: 0;
+ pointer-events: none;
}
.timeline {
diff --git a/src/devtools/tests.ts b/src/devtools/tests.ts
index 1a2fdf3..3dbaa4b 100644
--- a/src/devtools/tests.ts
+++ b/src/devtools/tests.ts
@@ -4621,6 +4621,48 @@ export function registerAllTests(): void {
const btn = document.querySelector('button[aria-label="Create a new track group"]')
expect(btn).toBeTruthy()
})
+
+ test('TAB toggles .panels-hidden on the .app grid', async () => {
+ // Pressing TAB from the document root flips a class on .app
+ // that collapses the side / props grid columns. A second TAB
+ // restores them. Skipped while the user is typing in an input.
+ const app = document.querySelector('.app') as HTMLElement
+ expect(app).toBeTruthy()
+ // Reset to a known baseline — preceding tests may have left
+ // the panels in either state.
+ while (app.classList.contains('panels-hidden')) {
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Tab', bubbles: true }))
+ await nextTick()
+ }
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Tab', bubbles: true }))
+ await nextTick()
+ expect(app.classList.contains('panels-hidden')).toBe(true)
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Tab', bubbles: true }))
+ await nextTick()
+ expect(app.classList.contains('panels-hidden')).toBe(false)
+ })
+
+ test('TAB inside an input does not toggle the panels', async () => {
+ // Typed-text inputs need TAB for focus traversal; the global
+ // toggle bails out via isEditable().
+ const app = document.querySelector('.app') as HTMLElement
+ while (app.classList.contains('panels-hidden')) {
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Tab', bubbles: true }))
+ await nextTick()
+ }
+ const input = document.createElement('input')
+ input.type = 'text'
+ document.body.appendChild(input)
+ try {
+ input.dispatchEvent(
+ new KeyboardEvent('keydown', { key: 'Tab', bubbles: true }),
+ )
+ await nextTick()
+ expect(app.classList.contains('panels-hidden')).toBe(false)
+ } finally {
+ document.body.removeChild(input)
+ }
+ })
})
suite('app — arrow-key nudge', () => {
diff --git a/src/version.ts b/src/version.ts
index 660b842..a221450 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1,2 +1,2 @@
-export const APP_VERSION = '1.1.6'
+export const APP_VERSION = '1.1.7'
export const APP_NAME = 'RUWIO'