* Start scanner-mobile-checkout convoy for the cart-then-commit phone flow. Co-authored-by: Cursor <cursoragent@cursor.com> * Ship a cart-then-commit mobile scanner so phone sessions stay on the camera. Scan matches enqueue locally instead of auto-writing ownership, checkout happens in a sheet, and audit fixes cover stale commit detection, returnUrl open redirects, nested Escape, and ember detection chrome. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2.9 KiB
2.9 KiB
| convoy | brief_number | depends_on | recommended_model | model_tier | files | cross_brief_commitments | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| scanner-mobile-checkout | 1 | composer-2.5-fast | fast |
|
|
Brief 1: Layout immersive chrome
Goal (1 sentence)
Add a narrow chrome="immersive" prop to Layout that hides global app chrome on viewports < md without restyling the desktop sidebar.
Files in scope (do not edit anything else)
components/Layout.jstest/components/Layout.test.js
Conventions to follow
- Extend the existing
Layoutsignature:export default function Layout({ children, user = null, showSearch = false })→ addchrome = 'default'. - Immersive is mobile-only (
md:hidden/max-md:patterns). Atmd+, immersive behaves likedefault(sidebar + TopSearchBar unchanged per D3 desktop note). - Hide when
chrome === 'immersive'on< md:<MobileNavigation />(line ~674)<TopSearchBar />(line ~986)- Desktop
<aside>sidebar is alreadyhidden md:flex— no change needed atmd+; on mobile the drawer + bottom nav are the chrome to suppress.
- Main column: remove
pb-16bottom padding when immersive (no bottom nav). Usemax-md:pb-0on the main wrapper (flex-1 flex flex-col pb-16 md:pb-0). - Outer shell: optional
max-md:p-0when immersive so camera can be true full-bleed. - Do not change sidebar styles, nav items, or command palette behavior.
- Use CSS tokens only — no new hex in JSX.
Implementation shape (verified against Layout.js)
export default function Layout({
children,
user = null,
showSearch = false,
chrome = 'default',
}) {
const isImmersive = chrome === 'immersive';
// ...
// MobileNavigation: {!isImmersive && <MobileNavigation ... />}
// TopSearchBar: {user && !isImmersive && <TopSearchBar ... />}
// Main wrapper className: include isImmersive && 'max-md:pb-0'
}
Acceptance criteria
chrome="immersive"hidesMobileNavigationandTopSearchBarbelowmdbreakpointchrome="immersive"atmd+renders identical chrome tochrome="default"(sidebar + TopSearchBar visible)chrome="default"(or omitted) is unchanged from current behaviortest/components/Layout.test.jsadds regression tests: immersive hides mobile nav landmark; default still renders Sign-in CTA whenuser={null}(existing 5 assertions preserved)- No scope expansion (do not edit files outside
files:above)
Rationale (≤3 sentences)
Immersive chrome is isolated to Layout.js so visual-diff-sensitive sidebar code stays untouched. Mobile-only gating matches design-direction desktop exception. Brief 4 wires the prop from /scanner without further Layout changes.