diff --git a/.gitignore b/.gitignore index 2688f6a9e8..5a7913995a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ _cache/ _site/ +.cache .*-cache .*-metadata .buildlog diff --git a/eleventy.config.js b/eleventy.config.js index d5b37e17d2..f5b7df41bb 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -19,6 +19,7 @@ import yaml from 'js-yaml'; import * as path from 'node:path'; import * as sass from 'sass'; +import {eleventyImageTransformPlugin} from '@11ty/eleventy-img'; // noinspection JSUnusedGlobalSymbols /** @@ -27,6 +28,7 @@ import * as sass from 'sass'; */ export default function (eleventyConfig) { const isProduction = process.env.PRODUCTION === 'true'; + const shouldOptimize = process.env.OPTIMIZE === 'true'; eleventyConfig.on('eleventy.before', async () => { await configureHighlighting(markdown); @@ -71,7 +73,7 @@ export default function (eleventyConfig) { } const result = sass.compileString(inputContent, { - style: isProduction ? 'compressed' : 'expanded', + style: shouldOptimize ? 'compressed' : 'expanded', quietDeps: true, loadPaths: [parsedPath.dir, 'src/_sass'], }); @@ -101,7 +103,7 @@ export default function (eleventyConfig) { 'src/content/guides/language/specifications', ); - if (isProduction) { + if (shouldOptimize) { // If building for production, minify/optimize the HTML output. // Doing so during serving isn't worth the extra build time. eleventyConfig.addTransform('minify-html', async function (content) { @@ -118,6 +120,37 @@ export default function (eleventyConfig) { return content; }); + + // Optimize all images, generate an avif, webp, and png version, + // and indicate they should be lazily loaded. + // Save in `_site/assets/img` and update links to there. + eleventyConfig.addPlugin(eleventyImageTransformPlugin, { + extensions: 'html', + formats: ['avif', 'webp', 'png', 'svg'], + svgShortCircuit: true, + widths: ['auto'], + defaultAttributes: { + loading: 'lazy', + decoding: 'async', + }, + urlPath: '/assets/img/', + outputDir: '_site/assets/img/', + }); + } else { + // To be more consistent with the production build, + // don't optimize images but still indicate they should be lazily loaded. + // Then save in `_site/assets/img` and update links to there. + eleventyConfig.addPlugin(eleventyImageTransformPlugin, { + extensions: 'html', + formats: ['auto'], + widths: ['auto'], + defaultAttributes: { + loading: 'lazy', + decoding: 'async', + }, + urlPath: '/assets/img/', + outputDir: '_site/assets/img/', + }); } eleventyConfig.setQuietMode(true); diff --git a/firebase.json b/firebase.json index 043238b22d..aaacc35808 100644 --- a/firebase.json +++ b/firebase.json @@ -5,12 +5,19 @@ "trailingSlash": false, "headers": [ { - "source": "**/*.@(jpg|jpeg|gif|png|md|txt|json|webp|webm|svg|css|js)", + "source": "**/*.@(avif|jpg|jpeg|gif|png|md|txt|json|webp|webm|svg|css|js)", "headers": [ { "key": "Cache-Control", "value": "max-age=28800" }, { "key": "Access-Control-Allow-Origin", "value": "*" } ] }, + { + "source": "/assets/img/*.@(jpg|jpeg|png|webp|avif)", + "headers": [ + { "key": "Cache-Control", "value": "max-age=604800" }, + { "key": "Access-Control-Allow-Origin", "value": "*" } + ] + }, { "source": "**", "headers": [ diff --git a/package.json b/package.json index abee540aef..7aa9e50de2 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ }, "scripts": { "serve": "PRODUCTION=false eleventy --serve", - "build-site-for-staging": "PRODUCTION=false eleventy", - "build-site-for-production": "PRODUCTION=true eleventy" + "build-site-for-staging": "PRODUCTION=false OPTIMIZE=true eleventy", + "build-site-for-production": "PRODUCTION=true OPTIMIZE=true eleventy" }, "engines": { "node": ">=20.10.0", @@ -23,6 +23,7 @@ }, "devDependencies": { "@11ty/eleventy": "3.0.0-alpha.10", + "@11ty/eleventy-img": "^4.0.2", "firebase-tools": "^13.10.2", "hast-util-from-html": "^2.0.1", "hast-util-select": "^6.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b460261885..4a2f4b8c3f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,9 @@ devDependencies: '@11ty/eleventy': specifier: 3.0.0-alpha.10 version: 3.0.0-alpha.10 + '@11ty/eleventy-img': + specifier: ^4.0.2 + version: 4.0.2 firebase-tools: specifier: ^13.10.2 version: 13.10.2 @@ -97,6 +100,35 @@ packages: - utf-8-validate dev: true + /@11ty/eleventy-fetch@4.0.1: + resolution: {integrity: sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==} + engines: {node: '>=14'} + dependencies: + debug: 4.3.4 + flat-cache: 3.2.0 + node-fetch: 2.7.0 + p-queue: 6.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@11ty/eleventy-img@4.0.2: + resolution: {integrity: sha512-MSCkZRJk9rWa7nojx9HBMZJePOrm+V3XNpT091qguj61SG5UsgXbxAkoeejO3npmKIQJTyVIV/rrA6d7xZYOvw==} + engines: {node: '>=18'} + dependencies: + '@11ty/eleventy-fetch': 4.0.1 + brotli-size: 4.0.0 + debug: 4.3.4 + entities: 4.5.0 + image-size: 1.1.1 + p-queue: 6.6.2 + sharp: 0.33.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@11ty/eleventy-plugin-bundle@2.0.2: resolution: {integrity: sha512-zGyPp1g6bi+VC2I5ylwj4w29nivDmx4Uki5gWY6v3MT/1muK0JTtnc1KOMC7yUurv6YwtwdiLYyFK2eFyKv2wg==} engines: {node: '>=18'} @@ -203,6 +235,14 @@ packages: kuler: 2.0.0 dev: true + /@emnapi/runtime@1.1.1: + resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: true + optional: true + /@google-cloud/cloud-sql-connector@1.3.0: resolution: {integrity: sha512-PPJgqTliwkpdC3iMWgG/rjh17VGL/UEYLyvcMtfWCUtFQ+DQFr7UV8gxrDKM7H0d0yEjai32uBkd4fMuijPKjQ==} engines: {node: '>=14'} @@ -291,6 +331,194 @@ packages: yargs: 17.7.2 dev: true + /@img/sharp-darwin-arm64@0.33.3: + resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.2 + dev: true + optional: true + + /@img/sharp-darwin-x64@0.33.3: + resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.2 + dev: true + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.2: + resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.2: + resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.2: + resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-arm@1.0.2: + resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.2: + resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linux-x64@1.0.2: + resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.2: + resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.2: + resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-linux-arm64@0.33.3: + resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.2 + dev: true + optional: true + + /@img/sharp-linux-arm@0.33.3: + resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.2 + dev: true + optional: true + + /@img/sharp-linux-s390x@0.33.3: + resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.2 + dev: true + optional: true + + /@img/sharp-linux-x64@0.33.3: + resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.2 + dev: true + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.3: + resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + dev: true + optional: true + + /@img/sharp-linuxmusl-x64@0.33.3: + resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + dev: true + optional: true + + /@img/sharp-wasm32@0.33.3: + resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.1.1 + dev: true + optional: true + + /@img/sharp-win32-ia32@0.33.3: + resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@img/sharp-win32-x64@0.33.3: + resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -966,6 +1194,13 @@ packages: fill-range: 7.0.1 dev: true + /brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} + dependencies: + duplexer: 0.1.1 + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true @@ -1199,6 +1434,14 @@ packages: color-string: 1.9.1 dev: true + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: true + /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true @@ -1534,6 +1777,11 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: true + /dev-ip@1.0.1: resolution: {integrity: sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==} engines: {node: '>= 0.8.0'} @@ -1596,6 +1844,10 @@ packages: is-obj: 2.0.0 dev: true + /duplexer@0.1.1: + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} + dev: true + /duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} dependencies: @@ -1778,6 +2030,10 @@ packages: engines: {node: '>=6'} dev: true + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + /events-listener@1.1.0: resolution: {integrity: sha512-Kd3EgYfODHueq6GzVfs/VUolh2EgJsS8hkO3KpnDrxVjU3eq63eXM2ujXkhPP+OkeUOhL8CxdfZbQXzryb5C4g==} dev: true @@ -2044,6 +2300,19 @@ packages: - utf-8-validate dev: true + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + /fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} dev: true @@ -2576,6 +2845,14 @@ packages: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true + /image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + dependencies: + queue: 6.0.2 + dev: true + /immutable@4.3.5: resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} dev: true @@ -2896,6 +3173,10 @@ packages: bignumber.js: 9.1.2 dev: true + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + /json-parse-helpfulerror@1.0.3: resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} dependencies: @@ -2973,6 +3254,12 @@ packages: safe-buffer: 5.2.1 dev: true + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -3715,6 +4002,11 @@ packages: engines: {node: '>=8'} dev: true + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3731,11 +4023,26 @@ packages: dev: true optional: true + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + /p-throttle@5.1.0: resolution: {integrity: sha512-+N+s2g01w1Zch4D0K3OpnPDqLOKmLcQ4BvIFq3JC0K29R28vUOjWpO+OJZBNt8X9i3pFCksZJZ0YXkUGjaFE6g==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + /pac-proxy-agent@7.0.1: resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} engines: {node: '>= 14'} @@ -4114,6 +4421,12 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + dev: true + /railroad-diagrams@1.0.0: resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} dev: true @@ -4448,6 +4761,36 @@ packages: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true + /sharp@0.33.3: + resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==} + engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.0 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.3 + '@img/sharp-darwin-x64': 0.33.3 + '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-linux-arm': 0.33.3 + '@img/sharp-linux-arm64': 0.33.3 + '@img/sharp-linux-s390x': 0.33.3 + '@img/sharp-linux-x64': 0.33.3 + '@img/sharp-linuxmusl-arm64': 0.33.3 + '@img/sharp-linuxmusl-x64': 0.33.3 + '@img/sharp-wasm32': 0.33.3 + '@img/sharp-win32-ia32': 0.33.3 + '@img/sharp-win32-x64': 0.33.3 + dev: true + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} diff --git a/src/_includes/head.html b/src/_includes/head.html index 189023111b..a1715c5328 100644 --- a/src/_includes/head.html +++ b/src/_includes/head.html @@ -29,11 +29,11 @@ {% endif -%} - - - - - + + + + + @@ -53,7 +53,7 @@ {% assign og_image_start = og_image_path | slice: 0 -%} {% unless og_image_start == '/' %}{% capture og_image_path %}{{page.url}}/{{og_image_path}}{% endcapture %}{% endunless -%} - + {% if og_type -%} diff --git a/src/_sass/_site.scss b/src/_sass/_site.scss index 36b32a29f3..37ab8050b4 100644 --- a/src/_sass/_site.scss +++ b/src/_sass/_site.scss @@ -78,6 +78,10 @@ $font-weight-light-bold: (bootstrap.$font-weight-normal + bootstrap.$font-weight font-family: $site-font-family-alt; font-size: $font-size-small; + .brand { + width: 176px; + } + .footer-section { display: flex; flex-direction: row; @@ -343,6 +347,17 @@ main .content { } } +.list-image { + width: 48px; + margin: 0.25rem; +} + +.text-icon { + margin: 0 0.25rem; + width: 20px; + height: 20px; +} + .cols3 { list-style: none; column-count: 3; diff --git a/src/content/libraries/convert/converters-and-codecs.md b/src/content/libraries/convert/converters-and-codecs.md index d7be2e986a..7e9b8c59b5 100644 --- a/src/content/libraries/convert/converters-and-codecs.md +++ b/src/content/libraries/convert/converters-and-codecs.md @@ -132,7 +132,7 @@ method is invoked with an output- sink as argument. The method then returns an input sink into which the caller puts data. -![Chunked conversion](/assets/img/converters-and-codecs/chunked-conversion.png) +![Chunked conversion](/assets/img/articles/converters-and-codecs/chunked-conversion.png) **Note**: An asterisk (`*`) in the diagram represents optional multiple calls. diff --git a/src/content/terms.md b/src/content/terms.md index ac3eaf7aca..c5ff8084bc 100644 --- a/src/content/terms.md +++ b/src/content/terms.md @@ -10,7 +10,7 @@ you consent to be bound by Google's general [Terms of Service][] and Google's general [Privacy Policy.][Privacy Policy] The "Dart" name and the Dart logo -Dart logo +Dart logo (the "Dart Marks") are trademarks owned by Google and are not included within the assets licensed under the Creative Commons Attribution 4.0 International License. Google grants you a non-transferable, diff --git a/src/content/tools/index.md b/src/content/tools/index.md index c216dbb8bd..d3e5cc3a3b 100644 --- a/src/content/tools/index.md +++ b/src/content/tools/index.md @@ -50,17 +50,16 @@ Dart plugins exist for these commonly used IDEs. @@ -70,15 +69,15 @@ thanks to the Dart community. diff --git a/src/content/tools/pub/custom-package-repositories.md b/src/content/tools/pub/custom-package-repositories.md index 653e8d857a..22a249d38f 100644 --- a/src/content/tools/pub/custom-package-repositories.md +++ b/src/content/tools/pub/custom-package-repositories.md @@ -209,19 +209,19 @@ your own custom package repository: diff --git a/src/content/tools/pub/publishing.md b/src/content/tools/pub/publishing.md index 88912e7712..da46a8d2ec 100644 --- a/src/content/tools/pub/publishing.md +++ b/src/content/tools/pub/publishing.md @@ -105,7 +105,7 @@ Using a verified publisher has the following advantages: * You can avoid having pub.dev display your personal email address. Instead, pub.dev displays the publisher domain and contact address. * The pub.dev site displays a verified publisher badge - pub.dev verified publisher logo + pub.dev verified publisher logo next to your package name on search pages and individual package pages. ### Create a verified publisher {:#create-verified-publisher} diff --git a/src/content/tools/pub/verified-publishers.md b/src/content/tools/pub/verified-publishers.md index e1b7514037..251d7f5b2d 100644 --- a/src/content/tools/pub/verified-publishers.md +++ b/src/content/tools/pub/verified-publishers.md @@ -3,7 +3,7 @@ title: Verified publishers description: Learn what verified publishers are, and they're verified. --- -The pub.dev verified publisher badge pub.dev verified publisher logo +The pub.dev verified publisher badge pub.dev verified publisher logo lets you know that the pub.dev site verified the identity of the publisher of a package. For example, [dart.dev]({{site.pub}}/publishers/dart.dev/) @@ -24,8 +24,7 @@ plus additional details such as the publisher's contact email. To visit the publisher page, click the publisher identity link (for example, `dart.dev`) next to the verified publisher badge pub.dev verified publisher logo. diff --git a/src/content/web/debugging.md b/src/content/web/debugging.md index 3f59179fd4..b8971403a4 100644 --- a/src/content/web/debugging.md +++ b/src/content/web/debugging.md @@ -118,7 +118,7 @@ but you'll need to adjust the instructions to match your app. * If Dart Debug Extension is installed and you used the `--debug-extension` flag to `webdev`, click the Dart logo - Dart logo + Dart logo at the top right of the browser window. * If you used the `--debug` flag to `webdev`,