fix(ui): default Reduced Motion on Calm and quiet decorative rails (#1622)

* fix(ui): default Reduced Motion on Calm and quiet decorative rails

Calm (and Reset to default) enables Reduced Motion; Signature clears it. Manual Motion stays independent of the visual-style card. Reduced Effects also stops decorative masthead rail animations. Related to #1614; does not close that issue.

* test(e2e): fix Calm Motion specs racing empty-create compose edit

Stop appearance init-script reseeding after mid-test mutations, and wait for Save and Deploy / mobile compose editor after empty create instead of assuming Anatomy Edit compose.
This commit is contained in:
Anso
2026-07-14 17:58:38 -04:00
committed by GitHub
parent b70a529656
commit c170c3f30c
13 changed files with 358 additions and 63 deletions
+6 -7
View File
@@ -2,6 +2,10 @@
* EditorView save-and-deploy: a failed PUT must abort the deploy. Verified by
* intercepting the PUT with a forced 500 and asserting that no POST to /deploy
* is observed, plus a "Failed to save file" toast surfaces.
*
* Empty-stack create opens an editable compose workspace immediately
* (startInComposeEdit), so this spec waits for Save & Deploy rather than
* clicking Anatomy "Edit compose".
*/
import { test, expect } from '@playwright/test';
import { loginAs, waitForStacksLoaded } from './helpers';
@@ -20,6 +24,8 @@ async function createTestStack(page: import('@playwright/test').Page) {
await page.locator('#create-stack-name').fill(TEST_STACK);
await page.locator('[role="dialog"]').getByRole('button', { name: 'Create' }).click();
await expect(page.getByRole('dialog')).toBeHidden({ timeout: 8_000 });
// Empty create auto-opens compose edit; wait for that before asserting.
await expect(page.getByRole('button', { name: 'Save & Deploy', exact: true })).toBeVisible({ timeout: 10_000 });
}
test.describe('EditorView save-and-deploy', () => {
@@ -32,8 +38,6 @@ test.describe('EditorView save-and-deploy', () => {
await loginAs(page);
await waitForStacksLoaded(page);
await createTestStack(page);
// Open the new stack in the editor.
await page.locator('[role="listbox"]').getByText(TEST_STACK, { exact: true }).click();
});
test.afterEach(async ({ page }) => {
@@ -57,11 +61,6 @@ test.describe('EditorView save-and-deploy', () => {
await route.continue();
});
// One click on Anatomy "Edit compose" opens an immediately editable Monaco
// workspace with Save & Deploy visible (no second Edit gate).
await page.getByTestId('anatomy-edit-compose-btn').click();
await expect(page.getByRole('button', { name: 'Save & Deploy', exact: true })).toBeVisible({ timeout: 5_000 });
// No need to modify Monaco content: saveFile fires the PUT regardless of
// dirty state. The route interceptor forces it to 500; the gated handler
// then must not call POST /deploy.