@utility list-morph { :root[data-list-switch] & > * { view-transition-name: match-element; view-transition-class: list-shell; } } :root[data-list-switch] { view-transition-name: none; & [data-vt="move"] { view-transition-name: match-element; view-transition-class: list-move; } & [data-vt="fade"] { view-transition-name: match-element; view-transition-class: list-fade; } } ::view-transition { pointer-events: none; } ::view-transition-group(.list-shell), ::view-transition-group(.list-move), ::view-transition-group(.list-fade) { animation-duration: 420ms; animation-timing-function: cubic-bezier(0.32, 0.72, 0, 1); } ::view-transition-group(.list-shell) { background: var(--color-background-default); border-radius: var(--radius-md); box-shadow: 0 0 0 1px var(--color-shadow-ring); } ::view-transition-old(.list-shell), ::view-transition-new(.list-shell) { display: none; } ::view-transition-old(.list-move), ::view-transition-new(.list-move), ::view-transition-old(.list-fade), ::view-transition-new(.list-fade) { height: 100%; width: auto; object-fit: none; object-position: left top; } ::view-transition-old(.list-fade) { animation: 150ms cubic-bezier(0.33, 1, 0.68, 1) both list-fade-out; } ::view-transition-new(.list-fade) { animation: 210ms cubic-bezier(0.33, 1, 0.68, 1) 105ms both list-fade-in; } @media (prefers-reduced-motion: reduce) { ::view-transition-group(*), ::view-transition-image-pair(*) { animation-duration: 0s !important; animation-delay: 0s !important; } ::view-transition-old(*) { animation: 150ms cubic-bezier(0.33, 1, 0.68, 1) both list-dissolve-out !important; } ::view-transition-new(*) { animation: 150ms cubic-bezier(0.33, 1, 0.68, 1) both list-dissolve-in !important; } } @keyframes list-fade-in { from { opacity: 0; filter: blur(3px); } } @keyframes list-fade-out { to { opacity: 0; filter: blur(3px); } } @keyframes list-dissolve-in { from { opacity: 0; } } @keyframes list-dissolve-out { to { opacity: 0; } }