diff --git a/examples/image-component/components/code.module.css b/examples/image-component/components/code.module.css new file mode 100644 index 000000000000..d1f6b4076502 --- /dev/null +++ b/examples/image-component/components/code.module.css @@ -0,0 +1,10 @@ +.root { + color: #be00ff; + font-size: 16px; + white-space: pre-wrap; +} + +.root::before, +.root::after { + content: '`'; +} diff --git a/examples/image-component/components/code.tsx b/examples/image-component/components/code.tsx new file mode 100644 index 000000000000..14029dfa6ba9 --- /dev/null +++ b/examples/image-component/components/code.tsx @@ -0,0 +1,6 @@ +import { PropsWithChildren } from 'react' +import styles from './code.module.css' + +export default function Code(props: PropsWithChildren) { + return +} diff --git a/examples/image-component/components/divider.module.css b/examples/image-component/components/divider.module.css new file mode 100644 index 000000000000..ee3aba42a728 --- /dev/null +++ b/examples/image-component/components/divider.module.css @@ -0,0 +1,5 @@ +.root { + border: 0; + border-top: 1px solid #333; + margin: 1.5rem 0; +} diff --git a/examples/image-component/components/divider.tsx b/examples/image-component/components/divider.tsx new file mode 100644 index 000000000000..6c137551530a --- /dev/null +++ b/examples/image-component/components/divider.tsx @@ -0,0 +1,5 @@ +import styles from './divider.module.css' + +export default function Divider() { + return
+} diff --git a/examples/image-component/components/view-source.module.css b/examples/image-component/components/layout.module.css similarity index 73% rename from examples/image-component/components/view-source.module.css rename to examples/image-component/components/layout.module.css index faca5af8557d..759fe82d9ccd 100644 --- a/examples/image-component/components/view-source.module.css +++ b/examples/image-component/components/layout.module.css @@ -1,8 +1,19 @@ +.card { + max-width: 60rem; + box-shadow: -10px 10px 80px rgba(255, 255, 255, 0.1); + border: 1px solid #333; + border-radius: 8px; + padding: 2rem; + margin: 0 auto; + background-color: rgba(0, 0, 0, 0.4); +} + .svg { position: absolute; top: 0; right: 0; } + .arm { transform-origin: 130px 106px; } diff --git a/examples/image-component/components/layout.tsx b/examples/image-component/components/layout.tsx new file mode 100644 index 000000000000..97f09309f742 --- /dev/null +++ b/examples/image-component/components/layout.tsx @@ -0,0 +1,33 @@ +import type { PropsWithChildren } from 'react' +import { useRouter } from 'next/router' +import styles from './layout.module.css' + +export default function Layout({ children }: PropsWithChildren) { + const { asPath } = useRouter() + const pagePath = `/pages/${asPath || 'index'}.tsx` + return ( + <> + + + + + + + +
{children}
+ + ) +} diff --git a/examples/image-component/components/view-source.js b/examples/image-component/components/view-source.js deleted file mode 100644 index be1d66f32389..000000000000 --- a/examples/image-component/components/view-source.js +++ /dev/null @@ -1,26 +0,0 @@ -import { svg, arm } from './view-source.module.css' - -const ViewSource = ({ pathname }) => ( - - - - - - - -) - -export default ViewSource diff --git a/examples/image-component/package.json b/examples/image-component/package.json index f9170ae254fa..9ad9fa8914c8 100644 --- a/examples/image-component/package.json +++ b/examples/image-component/package.json @@ -7,7 +7,12 @@ }, "dependencies": { "next": "latest", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "18.7.14", + "@types/react": "18.0.18", + "typescript": "4.8.2" } } diff --git a/examples/image-component/pages/_app.js b/examples/image-component/pages/_app.js deleted file mode 100644 index 14b610ee850f..000000000000 --- a/examples/image-component/pages/_app.js +++ /dev/null @@ -1,5 +0,0 @@ -import '../app.css' - -export default function MyApp({ Component, pageProps }) { - return -} diff --git a/examples/image-component/pages/_app.tsx b/examples/image-component/pages/_app.tsx new file mode 100644 index 000000000000..9711c680c7f8 --- /dev/null +++ b/examples/image-component/pages/_app.tsx @@ -0,0 +1,11 @@ +import '../styles/globals.css' +import type { AppProps } from 'next/app' +import Layout from '../components/layout' + +export default function MyApp({ Component, pageProps }: AppProps) { + return ( + + + + ) +} diff --git a/examples/image-component/pages/background.js b/examples/image-component/pages/background.js deleted file mode 100644 index b3e05ab83890..000000000000 --- a/examples/image-component/pages/background.js +++ /dev/null @@ -1,25 +0,0 @@ -import Image from 'next/image' -import ViewSource from '../components/view-source' -import { bgWrap, bgText } from '../styles.module.css' - -const Background = () => ( -
- -
- Mountains -
-

- Image Component -
- as a Background -

-
-) - -export default Background diff --git a/examples/image-component/pages/background.tsx b/examples/image-component/pages/background.tsx new file mode 100644 index 000000000000..5bec7d0a8e24 --- /dev/null +++ b/examples/image-component/pages/background.tsx @@ -0,0 +1,41 @@ +import Image from 'next/image' + +export default function BackgroundPage() { + return ( + <> +
+ Mountains +
+

+ Image Component +
+ as a Background +

+ + ) +} diff --git a/examples/image-component/pages/color.js b/examples/image-component/pages/color.js deleted file mode 100644 index dca5d6d3b972..000000000000 --- a/examples/image-component/pages/color.js +++ /dev/null @@ -1,42 +0,0 @@ -import Image from 'next/image' -import ViewSource from '../components/view-source' - -// Pixel GIF code adapted from https://stackoverflow.com/a/33919020/266535 -const keyStr = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' - -const triplet = (e1, e2, e3) => - keyStr.charAt(e1 >> 2) + - keyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) + - keyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) + - keyStr.charAt(e3 & 63) - -const rgbDataURL = (r, g, b) => - `data:image/gif;base64,R0lGODlhAQABAPAA${ - triplet(0, r, g) + triplet(b, 255, 255) - }/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==` - -const Color = () => ( -
- -

Image Component With Color Data URL

- Dog - Cat -
-) - -export default Color diff --git a/examples/image-component/pages/color.tsx b/examples/image-component/pages/color.tsx new file mode 100644 index 000000000000..f81161349b7b --- /dev/null +++ b/examples/image-component/pages/color.tsx @@ -0,0 +1,40 @@ +import Image from 'next/image' + +// Pixel GIF code adapted from https://stackoverflow.com/a/33919020/266535 +const keyStr = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + +const triplet = (e1: number, e2: number, e3: number) => + keyStr.charAt(e1 >> 2) + + keyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) + + keyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) + + keyStr.charAt(e3 & 63) + +const rgbDataURL = (r: number, g: number, b: number) => + `data:image/gif;base64,R0lGODlhAQABAPAA${ + triplet(0, r, g) + triplet(b, 255, 255) + }/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==` + +export default function ColorPage() { + return ( + <> +

Image Component With Color Data URL

+ Dog + Cat + + ) +} diff --git a/examples/image-component/pages/index.js b/examples/image-component/pages/index.tsx similarity index 87% rename from examples/image-component/pages/index.js rename to examples/image-component/pages/index.tsx index a676dc866602..a8e1b393f33b 100644 --- a/examples/image-component/pages/index.js +++ b/examples/image-component/pages/index.tsx @@ -1,15 +1,12 @@ -import styles from '../styles.module.css' import Image from 'next/image' import Link from 'next/link' -import ViewSource from '../components/view-source' +import Code from '../components/code' +import Divider from '../components/divider' import vercel from '../public/vercel.png' -const Code = (p) => - -const Index = () => ( -
- -
+export default function IndexPage() { + return ( + <>

Image Component with Next.js

This page demonstrates the usage of the{' '} @@ -25,7 +22,7 @@ const Index = () => ( {' '} images on-demand as the browser requests them.

-
+

Layout

The layout property tells the image to respond differently @@ -62,7 +59,7 @@ const Index = () => ( -


+

Placeholder

The placeholder property tells the image what to do while @@ -93,7 +90,7 @@ const Index = () => ( -


+

Internal Image

The following is an example of a reference to an internal image from the{' '} @@ -104,7 +101,7 @@ const Index = () => ( image.

Vercel logo -
+

External Image

The following is an example of a reference to an external image at{' '} @@ -120,7 +117,7 @@ const Index = () => ( width={1200} height={400} /> -


+

Learn More

You can optionally configure a cloud provider, device sizes, and more! @@ -132,8 +129,6 @@ const Index = () => ( {' '} to learn more.

-
-
-) - -export default Index + + ) +} diff --git a/examples/image-component/pages/layout-fill.js b/examples/image-component/pages/layout-fill.js deleted file mode 100644 index 526723d427f8..000000000000 --- a/examples/image-component/pages/layout-fill.js +++ /dev/null @@ -1,32 +0,0 @@ -import Image from 'next/image' -import ViewSource from '../components/view-source' -import mountains from '../public/mountains.jpg' - -const Fill = () => ( -
- -

Image Component With Layout Fill

-
- Mountains -
-
- Mountains -
-
- Mountains -
-
-) - -export default Fill diff --git a/examples/image-component/pages/layout-fill.tsx b/examples/image-component/pages/layout-fill.tsx new file mode 100644 index 000000000000..aaac387f1f71 --- /dev/null +++ b/examples/image-component/pages/layout-fill.tsx @@ -0,0 +1,35 @@ +import Image from 'next/image' +import mountains from '../public/mountains.jpg' + +export default function FillPage() { + return ( + <> +

Image Component With Layout Fill

+
+ Mountains +
+
+ Mountains +
+
+ Mountains +
+ + ) +} diff --git a/examples/image-component/pages/layout-fixed.js b/examples/image-component/pages/layout-fixed.js deleted file mode 100644 index cd5e26d8b4e3..000000000000 --- a/examples/image-component/pages/layout-fixed.js +++ /dev/null @@ -1,19 +0,0 @@ -import Image from 'next/image' -import ViewSource from '../components/view-source' -import mountains from '../public/mountains.jpg' - -const Fixed = () => ( -
- -

Image Component With Layout Fixed

- Mountains -
-) - -export default Fixed diff --git a/examples/image-component/pages/layout-fixed.tsx b/examples/image-component/pages/layout-fixed.tsx new file mode 100644 index 000000000000..b8911e12c2ac --- /dev/null +++ b/examples/image-component/pages/layout-fixed.tsx @@ -0,0 +1,17 @@ +import Image from 'next/image' +import mountains from '../public/mountains.jpg' + +export default function FixedPage() { + return ( + <> +

Image Component With Layout Fixed

+ Mountains + + ) +} diff --git a/examples/image-component/pages/layout-intrinsic.js b/examples/image-component/pages/layout-intrinsic.js deleted file mode 100644 index 1ebfeb98a773..000000000000 --- a/examples/image-component/pages/layout-intrinsic.js +++ /dev/null @@ -1,19 +0,0 @@ -import Image from 'next/image' -import ViewSource from '../components/view-source' -import mountains from '../public/mountains.jpg' - -const Intrinsic = () => ( -
- -

Image Component With Layout Intrinsic

- Mountains -
-) - -export default Intrinsic diff --git a/examples/image-component/pages/layout-intrinsic.tsx b/examples/image-component/pages/layout-intrinsic.tsx new file mode 100644 index 000000000000..bdf27da99387 --- /dev/null +++ b/examples/image-component/pages/layout-intrinsic.tsx @@ -0,0 +1,17 @@ +import Image from 'next/image' +import mountains from '../public/mountains.jpg' + +export default function Intrinsic() { + return ( + <> +

Image Component With Layout Intrinsic

+ Mountains + + ) +} diff --git a/examples/image-component/pages/layout-responsive.js b/examples/image-component/pages/layout-responsive.js deleted file mode 100644 index 4cfc6462afc7..000000000000 --- a/examples/image-component/pages/layout-responsive.js +++ /dev/null @@ -1,19 +0,0 @@ -import Image from 'next/image' -import ViewSource from '../components/view-source' -import mountains from '../public/mountains.jpg' - -const Responsive = () => ( -
- -

Image Component With Layout Responsive

- Mountains -
-) - -export default Responsive diff --git a/examples/image-component/pages/layout-responsive.tsx b/examples/image-component/pages/layout-responsive.tsx new file mode 100644 index 000000000000..a5468a2e78ac --- /dev/null +++ b/examples/image-component/pages/layout-responsive.tsx @@ -0,0 +1,17 @@ +import Image from 'next/image' +import mountains from '../public/mountains.jpg' + +export default function Responsive() { + return ( + <> +

Image Component With Layout Responsive

+ Mountains + + ) +} diff --git a/examples/image-component/pages/placeholder.js b/examples/image-component/pages/placeholder.js deleted file mode 100644 index f044b3138dd7..000000000000 --- a/examples/image-component/pages/placeholder.js +++ /dev/null @@ -1,19 +0,0 @@ -import Image from 'next/image' -import ViewSource from '../components/view-source' -import mountains from '../public/mountains.jpg' - -const PlaceholderBlur = () => ( -
- -

Image Component With Placeholder Blur

- Mountains -
-) - -export default PlaceholderBlur diff --git a/examples/image-component/pages/placeholder.tsx b/examples/image-component/pages/placeholder.tsx new file mode 100644 index 000000000000..e224f4cd888e --- /dev/null +++ b/examples/image-component/pages/placeholder.tsx @@ -0,0 +1,17 @@ +import Image from 'next/image' +import mountains from '../public/mountains.jpg' + +export default function PlaceholderPage() { + return ( + <> +

Image Component With Placeholder Blur

+ Mountains + + ) +} diff --git a/examples/image-component/pages/shimmer.js b/examples/image-component/pages/shimmer.js deleted file mode 100644 index f38e018e4ddc..000000000000 --- a/examples/image-component/pages/shimmer.js +++ /dev/null @@ -1,38 +0,0 @@ -import Image from 'next/image' -import ViewSource from '../components/view-source' - -const shimmer = (w, h) => ` - - - - - - - - - - - -` - -const toBase64 = (str) => - typeof window === 'undefined' - ? Buffer.from(str).toString('base64') - : window.btoa(str) - -const Shimmer = () => ( -
- -

Image Component With Shimmer Data URL

- Mountains -
-) - -export default Shimmer diff --git a/examples/image-component/pages/shimmer.tsx b/examples/image-component/pages/shimmer.tsx new file mode 100644 index 000000000000..bcdad7faff59 --- /dev/null +++ b/examples/image-component/pages/shimmer.tsx @@ -0,0 +1,36 @@ +import Image from 'next/image' + +const shimmer = (w: number, h: number) => + ` + + + + + + + + + + + ` + +const toBase64 = (str: string) => + typeof window === 'undefined' + ? Buffer.from(str).toString('base64') + : window.btoa(str) + +export default function Shimmer() { + return ( + <> +

Image Component With Shimmer Data URL

+ Mountains + + ) +} diff --git a/examples/image-component/styles.module.css b/examples/image-component/styles.module.css deleted file mode 100644 index 2e3e92d886a7..000000000000 --- a/examples/image-component/styles.module.css +++ /dev/null @@ -1,50 +0,0 @@ -.container { - padding: 4rem 1rem; -} - -.container p { - margin: 1.5rem 0; -} - -.card { - max-width: 60rem; - box-shadow: -10px 10px 80px rgba(255, 255, 255, 0.1); - border: 1px solid #333; - border-radius: 8px; - padding: 2rem; - margin: 0 auto; -} - -.inlineCode { - color: #be00ff; - font-size: 16px; - white-space: pre-wrap; -} - -.inlineCode::before, -.inlineCode::after { - content: '`'; -} - -.hr { - border: 0; - border-top: 1px solid #333; - margin: 1.5rem 0; -} - -.bgWrap { - position: fixed; - height: 100vh; - width: 100vw; - overflow: hidden; - z-index: -1; -} - -.bgText { - margin: 0; - font-size: 2rem; - line-height: 3rem; - text-align: center; - padding-top: 40vh; - text-shadow: 1px 1px 1px #3c5c5e; -} diff --git a/examples/image-component/app.css b/examples/image-component/styles/globals.css similarity index 81% rename from examples/image-component/app.css rename to examples/image-component/styles/globals.css index d26ed7583b62..d542ffb06a5b 100644 --- a/examples/image-component/app.css +++ b/examples/image-component/styles/globals.css @@ -6,6 +6,14 @@ body { color: white; } +#__next { + padding: 4rem 1rem; +} + +#__next p { + margin: 1.5rem 0; +} + a { cursor: pointer; color: #0076ff; diff --git a/examples/image-component/tsconfig.json b/examples/image-component/tsconfig.json new file mode 100644 index 000000000000..50bcb22f653d --- /dev/null +++ b/examples/image-component/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +}