* { overscroll-behavior: none; } /* Keep app chrome non-selectable so iOS long-press doesn't open the edit menu (AutoFill/Copy/Siri). Inputs and opted-in regions stay selectable. */ body { -webkit-touch-callout: none; -webkit-user-select: none; user-select: none; } input, textarea, [contenteditable="true"], [contenteditable=""], [data-selectable], [data-selectable] * { -webkit-touch-callout: default; -webkit-user-select: text; user-select: text; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .app { transition: transform 500ms cubic-bezier(0.32, 0.72, 0, 1), border-radius 500ms cubic-bezier(0.32, 0.72, 0, 1); transform: scale(1) translateY(0); border-radius: 0; will-change: transform; } .app.drawer-scaling, [data-drawer-level].drawer-scaling { transform: scale(0.94) translateY(-8px); border-radius: 12px; overflow: hidden; } [data-drawer-level="2"].drawer-scaling { transform: scale(0.92) translateY(-6px); } [data-drawer-level="3"].drawer-scaling { transform: scale(0.90) translateY(-4px); } ::view-transition-old(root), ::view-transition-new(root), ::view-transition-old(page), ::view-transition-new(page), ::view-transition-old(app-header), ::view-transition-new(app-header) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.32, 0.72, 0, 1); } html[data-nav-direction="forward"]::view-transition-old(page) { animation: 300ms cubic-bezier(0.32, 0.72, 0, 1) both flxn-page-under-out; } html[data-nav-direction="forward"]::view-transition-new(page) { animation: 300ms cubic-bezier(0.32, 0.72, 0, 1) both flxn-page-over-in; } html[data-nav-direction="back"]::view-transition-old(page) { animation: 300ms cubic-bezier(0.32, 0.72, 0, 1) both flxn-page-over-out; z-index: 1; } html[data-nav-direction="back"]::view-transition-new(page) { animation: 300ms cubic-bezier(0.32, 0.72, 0, 1) both flxn-page-under-in; } html[data-nav-direction="forward"][data-header-vt="exit"]::view-transition-old(app-header) { animation: 300ms cubic-bezier(0.32, 0.72, 0, 1) both flxn-header-out; } html[data-nav-direction="back"][data-header-vt="exit"]::view-transition-old(app-header) { animation: 300ms cubic-bezier(0.32, 0.72, 0, 1) both flxn-page-over-out; } html[data-nav-direction="forward"][data-header-vt="enter"]::view-transition-new(app-header) { animation: 300ms cubic-bezier(0.32, 0.72, 0, 1) both flxn-page-over-in; } html[data-nav-direction="back"][data-header-vt="enter"]::view-transition-new(app-header) { animation: 300ms cubic-bezier(0.32, 0.72, 0, 1) both flxn-header-in; } @keyframes flxn-page-over-in { from { transform: translateX(100%); } } @keyframes flxn-page-over-out { to { transform: translateX(100%); } } @keyframes flxn-page-under-out { to { transform: translateX(-25%); opacity: 0.8; } } @keyframes flxn-page-under-in { from { transform: translateX(-25%); opacity: 0.8; } } @keyframes flxn-header-out { 45% { opacity: 0; } to { transform: translateX(-25%); opacity: 0; } } @keyframes flxn-header-in { from { transform: translateX(-25%); opacity: 0; } } @keyframes flxn-vt-fade-out { to { opacity: 0; } } @keyframes flxn-vt-fade-in { from { opacity: 0; } } @media (prefers-reduced-motion: reduce) { ::view-transition-group(*), ::view-transition-image-pair(*) { animation: none !important; } ::view-transition-old(*) { animation: 120ms ease both flxn-vt-fade-out !important; z-index: auto !important; } ::view-transition-new(*) { animation: 120ms ease both flxn-vt-fade-in !important; } .app, [data-drawer-level] { transition: none; } .app.drawer-scaling, [data-drawer-level].drawer-scaling { transform: none; border-radius: 0; } [data-vaul-drawer], [data-vaul-overlay] { animation: none !important; transition: none !important; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(0deg); } } }