{details.title}
-{details.description}
- > - ); -} - -function VideoInfoFallback() { - return ( - <> - - - > - ); -} - -export default function Details() { - const { url, navigateBack } = useRouter(); - const videoId = url.split("/").pop(); - const video = use(fetchVideo(videoId)); - - return ( -{details.title}
-{details.description}
- > - ); -} - -function VideoInfoFallback() { - return ( - <> - - - > - ); -} - -export default function Details() { - const { url, navigateBack } = useRouter(); - const videoId = url.split("/").pop(); - const video = use(fetchVideo(videoId)); - - return ( -{details.title}
-{details.description}
- > - ); -} - -function VideoInfoFallback() { - return ( - <> - - - > - ); -} - -export default function Details() { - const { url, navigateBack } = useRouter(); - const videoId = url.split("/").pop(); - const video = use(fetchVideo(videoId)); - - return ( -{details.title}
-{details.description}
-{details.title}
+{details.description}
+ > + ); } -@keyframes slide-from-left { - from { - transform: translateX(-50px); - } - to { - transform: translateX(0); - } +function VideoInfoFallback() { + return ( + <> + + + > + ); } -/* Default .slow-fade. */ -::view-transition-old(.slow-fade) { - animation-duration: 500ms; +export default function Details() { + const { url, navigateBack } = useRouter(); + const videoId = url.split("/").pop(); + const video = use(fetchVideo(videoId)); + + return ( +{details.title}
+{details.description}
+ > ); } @@ -7604,7 +2322,7 @@ export default function Details() { navigateBack("/"); }} > -{details.title}
-{details.description}
- > - ); -} ``` ```js src/Home.js hidden @@ -7641,7 +2352,7 @@ function SearchInput({ value, onChange }) { return ({details.title}
-{details.description}
- > - ); +::view-transition-new(.slide-back) { + /* when sliding back, the "new" page should slide in from left. */ + animation: 210ms cubic-bezier(0, 0, 0.2, 1) 150ms both fade-in, + 400ms cubic-bezier(0.4, 0, 0.2, 1) both slide-from-left; } -``` - -```js src/Home.js -import { useId, useState, use, useDeferredValue, ViewTransition } from "react";import { Video } from "./Videos";import Layout from "./Layout";import { fetchVideos } from "./data";import { IconSearch } from "./Icons"; -function SearchList({searchText, videos}) { - // Activate with useDeferredValue ("when") - const deferredSearchText = useDeferredValue(searchText); - const filteredVideos = filterVideos(videos, deferredSearchText); - return ( -{details.title}
+{details.description}
+ > ); } +``` -export function Video({ video }) { - const { navigate } = useRouter(); +```js src/Home.js +import { useId, useState, use, useDeferredValue, ViewTransition } from "react";import { Video } from "./Videos";import Layout from "./Layout";import { fetchVideos } from "./data";import { IconSearch } from "./Icons"; +function SearchList({searchText, videos}) { + // Ativa com useDeferredValue ("quando") + const deferredSearchText = useDeferredValue(searchText); + const filteredVideos = filterVideos(videos, deferredSearchText); return ( -{details.title}
+{details.description}
+ > + ); +} +``` + +```js src/Home.js +import { useId, useState, use, useDeferredValue, ViewTransition } from "react";import { Video } from "./Videos";import Layout from "./Layout";import { fetchVideos } from "./data";import { IconSearch } from "./Icons"; + +function SearchList({searchText, videos}) { + // Ativa com useDeferredValue ("quando") + const deferredSearchText = useDeferredValue(searchText); + const filteredVideos = filterVideos(videos, deferredSearchText); + return ( +