chore: merge executor worktree (worktree-agent-ad448992e936c77aa)
This commit is contained in:
@@ -199,6 +199,40 @@ test.describe('Rule 2 — No horizontal overflow', () => {
|
||||
});
|
||||
});
|
||||
|
||||
// ── D-01 Regression Guard: FAB does not overlap BottomTabBar (Workstream A) ──
|
||||
//
|
||||
// Permanent overlap assertion for the seed defect: New Event FAB was landing on the
|
||||
// Admin tab at 390×844, clipping the color-legend chips behind the BottomTabBar.
|
||||
// Fixed by calc(var(--bottom-chrome-h) + var(--space-6)) in CalendarShell.tsx.
|
||||
// Runs on iphone + pixel (the profiles that exposed the issue); skipped on desktop.
|
||||
|
||||
test.describe('D-01 regression guard — FAB does not overlap BottomTabBar', () => {
|
||||
test('New Event FAB does not overlap BottomTabBar (A — phone only)', async ({
|
||||
page,
|
||||
}, testInfo) => {
|
||||
test.skip(testInfo.project.name === 'desktop', 'Phone-only assertion');
|
||||
|
||||
await page.goto('/calendar');
|
||||
|
||||
const fab = page.getByRole('button', { name: 'New Event' });
|
||||
const nav = page.getByRole('navigation', { name: 'Main navigation' });
|
||||
|
||||
await expect(fab).toBeVisible();
|
||||
await expect(nav).toBeVisible();
|
||||
|
||||
const fabBox = await fab.boundingBox();
|
||||
const navBox = await nav.boundingBox();
|
||||
|
||||
expect(fabBox, 'New Event FAB bounding box must not be null').not.toBeNull();
|
||||
expect(navBox, 'BottomTabBar bounding box must not be null').not.toBeNull();
|
||||
|
||||
expect(
|
||||
fabBox!.y + fabBox!.height,
|
||||
`FAB bottom edge (${fabBox!.y + fabBox!.height}) must be ≤ BottomTabBar top edge (${navBox!.y}) — no overlap`,
|
||||
).toBeLessThanOrEqual(navBox!.y);
|
||||
});
|
||||
});
|
||||
|
||||
// ── Harness self-validation — injected-defect proofs (TEST-01 acceptance bar) ──
|
||||
//
|
||||
// Each test is a PASSING test that proves the assertion would have failed under a
|
||||
|
||||
@@ -160,6 +160,8 @@ export default function App() {
|
||||
flexDirection: 'column',
|
||||
overflow: 'hidden',
|
||||
position: 'relative',
|
||||
// Phone-only: reserve space for the fixed BottomTabBar so content is not occluded
|
||||
...(phone ? { paddingBottom: 'var(--bottom-chrome-h)' } : {}),
|
||||
};
|
||||
|
||||
// Setup gate: while setup status is loading, render nothing (prevent flash).
|
||||
|
||||
@@ -467,7 +467,7 @@ export function CalendarShell() {
|
||||
onClick={() => setEventForm(true, 'create')}
|
||||
style={{
|
||||
position: 'fixed',
|
||||
bottom: 'var(--space-6)',
|
||||
bottom: 'calc(var(--bottom-chrome-h) + var(--space-6))',
|
||||
right: 'var(--space-6)',
|
||||
width: '56px',
|
||||
height: '56px',
|
||||
|
||||
Reference in New Issue
Block a user