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.
-
+
**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
-
+
(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.