diff --git a/docs/configuration.md b/docs/configuration.md
index 1408f71e6..6c4c92850 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -28,8 +28,9 @@ This part of the configuration concerns anything that can affect the whole site.
- `{ provider: 'google', tagId: '' }`: use Google Analytics;
- `{ provider: 'plausible' }` (managed) or `{ provider: 'plausible', host: '' }` (self-hosted): use [Plausible](https://plausible.io/);
- `{ provider: 'umami', host: '', websiteId: '' }`: use [Umami](https://umami.is/);
- - `{ provider: 'goatcounter', websiteId: 'my-goatcounter-id' }` (managed) or `{ provider: 'goatcounter', websiteId: 'my-goatcounter-id', host: 'my-goatcounter-domain.com', scriptSrc: 'https://my-url.to/counter.js' }` (self-hosted) use [GoatCounter](https://goatcounter.com)
+ - `{ provider: 'goatcounter', websiteId: 'my-goatcounter-id' }` (managed) or `{ provider: 'goatcounter', websiteId: 'my-goatcounter-id', host: 'my-goatcounter-domain.com', scriptSrc: 'https://my-url.to/counter.js' }` (self-hosted) use [GoatCounter](https://goatcounter.com);
- `{ provider: 'posthog', apiKey: '', host: '' }`: use [Posthog](https://posthog.com/);
+ - `{ provider: 'tinylytics', siteId: '' }`: use [Tinylytics](https://tinylytics.app/);
- `locale`: used for [[i18n]] and date formatting
- `baseUrl`: this is used for sitemaps and RSS feeds that require an absolute URL to know where the canonical 'home' of your site lives. This is normally the deployed URL of your site (e.g. `quartz.jzhao.xyz` for this site). Do not include the protocol (i.e. `https://`) or any leading or trailing slashes.
- This should also include the subpath if you are [[hosting]] on GitHub pages without a custom domain. For example, if my repository is `jackyzha0/quartz`, GitHub pages would deploy to `https://jackyzha0.github.io/quartz` and the `baseUrl` would be `jackyzha0.github.io/quartz`.
diff --git a/docs/features/recent notes.md b/docs/features/recent notes.md
index 9236b7ce2..75406e504 100644
--- a/docs/features/recent notes.md
+++ b/docs/features/recent notes.md
@@ -9,6 +9,7 @@ Quartz can generate a list of recent notes based on some filtering and sorting c
- Changing the title from "Recent notes": pass in an additional parameter to `Component.RecentNotes({ title: "Recent writing" })`
- Changing the number of recent notes: pass in an additional parameter to `Component.RecentNotes({ limit: 5 })`
+- Display the note's tags (defaults to true): `Component.RecentNotes({ showTags: false })`
- Show a 'see more' link: pass in an additional parameter to `Component.RecentNotes({ linkToMore: "tags/components" })`. This field should be a full slug to a page that exists.
- Customize filtering: pass in an additional parameter to `Component.RecentNotes({ filter: someFilterFunction })`. The filter function should be a function that has the signature `(f: QuartzPluginData) => boolean`.
- Customize sorting: pass in an additional parameter to `Component.RecentNotes({ sort: someSortFunction })`. By default, Quartz will sort by date and then tie break lexographically. The sort function should be a function that has the signature `(f1: QuartzPluginData, f2: QuartzPluginData) => number`. See `byDateAndAlphabetical` in `quartz/components/PageList.tsx` for an example.
diff --git a/docs/plugins/CNAME.md b/docs/plugins/CNAME.md
index b81faee47..bc12b5acc 100644
--- a/docs/plugins/CNAME.md
+++ b/docs/plugins/CNAME.md
@@ -8,7 +8,7 @@ This plugin emits a `CNAME` record that points your subdomain to the default dom
If you want to use a custom domain name like `quartz.example.com` for the site, then this is needed.
-See [[Hosting]] for more information.
+See [[hosting|Hosting]] for more information.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
diff --git a/docs/showcase.md b/docs/showcase.md
index 4860e0be1..c33f34c8e 100644
--- a/docs/showcase.md
+++ b/docs/showcase.md
@@ -27,5 +27,6 @@ Want to see what Quartz can do? Here are some cool community gardens:
- [sspaeti.com's Second Brain](https://brain.sspaeti.com/)
- [🪴Aster's notebook](https://notes.asterhu.com)
- [🥷🏻🌳🍃 Computer Science & Thinkering Garden](https://notes.yxy.ninja)
+- [A Pattern Language - Christopher Alexander (Architecture)](https://patternlanguage.cc/)
If you want to see your own on here, submit a [Pull Request adding yourself to this file](https://github.com/jackyzha0/quartz/blob/v4/docs/showcase.md)!
diff --git a/package-lock.json b/package-lock.json
index 4b86ffbde..58d334df3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,7 +22,7 @@
"github-slugger": "^2.0.0",
"globby": "^14.0.1",
"gray-matter": "^4.0.3",
- "hast-util-to-html": "^9.0.0",
+ "hast-util-to-html": "^9.0.1",
"hast-util-to-jsx-runtime": "^2.3.0",
"hast-util-to-string": "^3.0.0",
"is-absolute-url": "^4.0.1",
@@ -33,7 +33,7 @@
"mdast-util-to-string": "^4.0.0",
"micromorph": "^0.4.5",
"preact": "^10.20.1",
- "preact-render-to-string": "^6.4.0",
+ "preact-render-to-string": "^6.4.2",
"pretty-bytes": "^6.1.1",
"pretty-time": "^1.1.0",
"reading-time": "^1.5.0",
@@ -53,16 +53,16 @@
"remark-rehype": "^11.1.0",
"remark-smartypants": "^2.1.0",
"rfdc": "^1.3.1",
- "rimraf": "^5.0.5",
+ "rimraf": "^5.0.7",
"serve-handler": "^6.1.5",
- "shiki": "^1.2.3",
+ "shiki": "^1.6.0",
"source-map-support": "^0.5.21",
"to-vfile": "^8.0.0",
"toml": "^3.0.0",
"unified": "^11.0.4",
"unist-util-visit": "^5.0.0",
"vfile": "^6.0.1",
- "workerpool": "^9.1.0",
+ "workerpool": "^9.1.1",
"ws": "^8.15.1",
"yargs": "^17.7.2"
},
@@ -74,15 +74,15 @@
"@types/d3": "^7.4.3",
"@types/hast": "^3.0.4",
"@types/js-yaml": "^4.0.9",
- "@types/node": "^20.11.29",
+ "@types/node": "^20.12.5",
"@types/pretty-time": "^1.1.5",
"@types/source-map-support": "^0.5.10",
"@types/ws": "^8.5.10",
"@types/yargs": "^17.0.32",
"esbuild": "^0.19.9",
"prettier": "^3.2.4",
- "tsx": "^4.7.1",
- "typescript": "^5.4.3"
+ "tsx": "^4.9.3",
+ "typescript": "^5.4.5"
},
"engines": {
"node": ">=18.14",
@@ -820,9 +820,9 @@
}
},
"node_modules/@shikijs/core": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.3.tgz",
- "integrity": "sha512-SM+aiQVaEK2P53dEcsvhq9+LJPr0rzwezHbMQhHaSrPN4OlOB4vp1qTdhVEKfMg6atdq8s9ZotWW/CSCzWftwg=="
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.6.0.tgz",
+ "integrity": "sha512-NIEAi5U5R7BLkbW1pG/ZKu3eb1lzc3/+jD0lFsuxMT7zjaf9bbNwdNyMr7zh/Zl8EXQtQ+MYBAt5G+JLu+5DlA=="
},
"node_modules/@sindresorhus/merge-streams": {
"version": "2.3.0",
@@ -1170,9 +1170,9 @@
}
},
"node_modules/@types/node": {
- "version": "20.11.29",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.29.tgz",
- "integrity": "sha512-P99thMkD/1YkCvAtOd6/zGedKNA0p2fj4ZpjCzcNiSCBWgm3cNRTBfa/qjFnsKkkojxu4vVLtWpesnZ9+ap+gA==",
+ "version": "20.12.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.5.tgz",
+ "integrity": "sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
@@ -2432,9 +2432,9 @@
}
},
"node_modules/get-tsconfig": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
- "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+ "version": "4.7.4",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.4.tgz",
+ "integrity": "sha512-ofbkKj+0pjXjhejr007J/fLf+sW+8H7K5GCm+msC8q3IpvgjobpyPqSRFemNyIMxklC0zeJpi7VDFna19FacvQ==",
"dev": true,
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
@@ -2710,9 +2710,9 @@
"integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
},
"node_modules/hast-util-to-html": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz",
- "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.1.tgz",
+ "integrity": "sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==",
"dependencies": {
"@types/hast": "^3.0.0",
"@types/unist": "^3.0.0",
@@ -4705,9 +4705,9 @@
}
},
"node_modules/preact-render-to-string": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.4.0.tgz",
- "integrity": "sha512-pzDwezZaLbK371OiJjXDsZJwVOALzFX5M1wEh2Kr0pEApq5AV6bRH/DFbA/zNA7Lck/duyREPQLLvzu2G6hEQQ==",
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.4.2.tgz",
+ "integrity": "sha512-Sio5SvlyZSAXHuvnMgYzVQd67lNIuQe4uSjJ+2gfpJNC6L8zoHQR5xV7B/EjIqrAYWVyJ2eACkTCxVrIzZi6Vw==",
"dependencies": {
"pretty-format": "^3.8.0"
},
@@ -5419,9 +5419,9 @@
"integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg=="
},
"node_modules/rimraf": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz",
- "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==",
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz",
+ "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==",
"dependencies": {
"glob": "^10.3.7"
},
@@ -5429,7 +5429,7 @@
"rimraf": "dist/esm/bin.mjs"
},
"engines": {
- "node": ">=14"
+ "node": ">=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -5571,11 +5571,11 @@
}
},
"node_modules/shiki": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.3.tgz",
- "integrity": "sha512-+v7lO5cJMeV2N2ySK4l+51YX3wTh5I49SLjAOs1ch1DbUfeEytU1Ac9KaZPoZJCVBGycDZ09OBQN5nbcPFc5FQ==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.6.0.tgz",
+ "integrity": "sha512-P31ROeXcVgW/k3Z+vUUErcxoTah7ZRaimctOpzGuqAntqnnSmx1HOsvnbAB8Z2qfXPRhw61yptAzCsuKOhTHwQ==",
"dependencies": {
- "@shikijs/core": "1.2.3"
+ "@shikijs/core": "1.6.0"
}
},
"node_modules/signal-exit": {
@@ -5903,13 +5903,13 @@
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"node_modules/tsx": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz",
- "integrity": "sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==",
+ "version": "4.9.3",
+ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.9.3.tgz",
+ "integrity": "sha512-czVbetlILiyJZI5zGlj2kw9vFiSeyra9liPD4nG+Thh4pKTi0AmMEQ8zdV/L2xbIVKrIqif4sUNrsMAOksx9Zg==",
"dev": true,
"dependencies": {
- "esbuild": "~0.19.10",
- "get-tsconfig": "^4.7.2"
+ "esbuild": "~0.20.2",
+ "get-tsconfig": "^4.7.3"
},
"bin": {
"tsx": "dist/cli.mjs"
@@ -5921,10 +5921,416 @@
"fsevents": "~2.3.3"
}
},
+ "node_modules/tsx/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-loong64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tsx/node_modules/esbuild": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
+ },
"node_modules/typescript": {
- "version": "5.4.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz",
- "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==",
+ "version": "5.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -6325,9 +6731,9 @@
"integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw=="
},
"node_modules/workerpool": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.1.0.tgz",
- "integrity": "sha512-+wRWfm9yyJghvXLSHMQj3WXDxHbibHAQmRrWbqKBfy0RjftZNeQaW+Std5bSYc83ydkrxoPTPOWVlXUR9RWJdQ=="
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.1.1.tgz",
+ "integrity": "sha512-EFoFTSEo9m4V4wNrwzVRjxnf/E/oBpOzcI/R5CIugJhl9RsCiq525rszo4AtqcjQQoqFdu2E3H82AnbtpaQHvg=="
},
"node_modules/wrap-ansi": {
"version": "8.1.0",
diff --git a/package.json b/package.json
index a2785b9b7..7b3f11ac6 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
"url": "https://github.com/jackyzha0/quartz.git"
},
"scripts": {
+ "quartz": "./quartz/bootstrap-cli.mjs",
"docs": "npx quartz build --serve -d docs",
"check": "tsc --noEmit && npx prettier . --check",
"format": "npx prettier . --write",
@@ -47,7 +48,7 @@
"github-slugger": "^2.0.0",
"globby": "^14.0.1",
"gray-matter": "^4.0.3",
- "hast-util-to-html": "^9.0.0",
+ "hast-util-to-html": "^9.0.1",
"hast-util-to-jsx-runtime": "^2.3.0",
"hast-util-to-string": "^3.0.0",
"is-absolute-url": "^4.0.1",
@@ -58,7 +59,7 @@
"mdast-util-to-string": "^4.0.0",
"micromorph": "^0.4.5",
"preact": "^10.20.1",
- "preact-render-to-string": "^6.4.0",
+ "preact-render-to-string": "^6.4.2",
"pretty-bytes": "^6.1.1",
"pretty-time": "^1.1.0",
"reading-time": "^1.5.0",
@@ -78,16 +79,16 @@
"remark-rehype": "^11.1.0",
"remark-smartypants": "^2.1.0",
"rfdc": "^1.3.1",
- "rimraf": "^5.0.5",
+ "rimraf": "^5.0.7",
"serve-handler": "^6.1.5",
- "shiki": "^1.2.3",
+ "shiki": "^1.6.0",
"source-map-support": "^0.5.21",
"to-vfile": "^8.0.0",
"toml": "^3.0.0",
"unified": "^11.0.4",
"unist-util-visit": "^5.0.0",
"vfile": "^6.0.1",
- "workerpool": "^9.1.0",
+ "workerpool": "^9.1.1",
"ws": "^8.15.1",
"yargs": "^17.7.2"
},
@@ -96,14 +97,14 @@
"@types/d3": "^7.4.3",
"@types/hast": "^3.0.4",
"@types/js-yaml": "^4.0.9",
- "@types/node": "^20.11.29",
+ "@types/node": "^20.12.5",
"@types/pretty-time": "^1.1.5",
"@types/source-map-support": "^0.5.10",
"@types/ws": "^8.5.10",
"@types/yargs": "^17.0.32",
"esbuild": "^0.19.9",
"prettier": "^3.2.4",
- "tsx": "^4.7.1",
- "typescript": "^5.4.3"
+ "tsx": "^4.9.3",
+ "typescript": "^5.4.5"
}
}
diff --git a/quartz/cfg.ts b/quartz/cfg.ts
index 09905e9f0..13fb51668 100644
--- a/quartz/cfg.ts
+++ b/quartz/cfg.ts
@@ -30,6 +30,10 @@ export type Analytics =
apiKey: string
host?: string
}
+ | {
+ provider: "tinylytics"
+ siteId: string
+ }
export interface GlobalConfiguration {
pageTitle: string
diff --git a/quartz/components/RecentNotes.tsx b/quartz/components/RecentNotes.tsx
index d99878db9..2c32feadf 100644
--- a/quartz/components/RecentNotes.tsx
+++ b/quartz/components/RecentNotes.tsx
@@ -12,6 +12,7 @@ interface Options {
title?: string
limit: number
linkToMore: SimpleSlug | false
+ showTags: boolean
filter: (f: QuartzPluginData) => boolean
sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number
}
@@ -19,6 +20,7 @@ interface Options {
const defaultOptions = (cfg: GlobalConfiguration): Options => ({
limit: 3,
linkToMore: false,
+ showTags: true,
filter: () => true,
sort: byDateAndAlphabetical(cfg),
})
@@ -56,18 +58,20 @@ export default ((userOpts?: Partial) => {
)}
-
+ {opts.showTags && (
+
+ )}
)
diff --git a/quartz/components/pages/404.tsx b/quartz/components/pages/404.tsx
index 4ef1b912c..63da2c88a 100644
--- a/quartz/components/pages/404.tsx
+++ b/quartz/components/pages/404.tsx
@@ -2,10 +2,15 @@ import { i18n } from "../../i18n"
import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "../types"
const NotFound: QuartzComponent = ({ cfg }: QuartzComponentProps) => {
+ // If baseUrl contains a pathname after the domain, use this as the home link
+ const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`)
+ const baseDir = url.pathname
+
return (
404
{i18n(cfg.locale).pages.error.notFound}
+ {i18n(cfg.locale).pages.error.home}
)
}
diff --git a/quartz/i18n/index.ts b/quartz/i18n/index.ts
index 6707ea35d..eab1f1a78 100644
--- a/quartz/i18n/index.ts
+++ b/quartz/i18n/index.ts
@@ -15,6 +15,8 @@ import zh from "./locales/zh-CN"
import vi from "./locales/vi-VN"
import pt from "./locales/pt-BR"
import hu from "./locales/hu-HU"
+import fa from "./locales/fa-IR"
+import pl from "./locales/pl-PL"
export const TRANSLATIONS = {
"en-US": en,
@@ -54,6 +56,8 @@ export const TRANSLATIONS = {
"vi-VN": vi,
"pt-BR": pt,
"hu-HU": hu,
+ "fa-IR": fa,
+ "pl-PL": pl,
} as const
export const defaultTranslation = "en-US"
diff --git a/quartz/i18n/locales/ar-SA.ts b/quartz/i18n/locales/ar-SA.ts
index f7048103f..8463e2ff5 100644
--- a/quartz/i18n/locales/ar-SA.ts
+++ b/quartz/i18n/locales/ar-SA.ts
@@ -70,6 +70,7 @@ export default {
error: {
title: "غير موجود",
notFound: "إما أن هذه الصفحة خاصة أو غير موجودة.",
+ home: "العوده للصفحة الرئيسية",
},
folderContent: {
folder: "مجلد",
diff --git a/quartz/i18n/locales/de-DE.ts b/quartz/i18n/locales/de-DE.ts
index 64c9ba9df..023d4be33 100644
--- a/quartz/i18n/locales/de-DE.ts
+++ b/quartz/i18n/locales/de-DE.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Nicht gefunden",
notFound: "Diese Seite ist entweder nicht öffentlich oder existiert nicht.",
+ home: "Return to Homepage",
},
folderContent: {
folder: "Ordner",
diff --git a/quartz/i18n/locales/definition.ts b/quartz/i18n/locales/definition.ts
index 1d5d3dda6..25a8cd7f2 100644
--- a/quartz/i18n/locales/definition.ts
+++ b/quartz/i18n/locales/definition.ts
@@ -67,6 +67,7 @@ export interface Translation {
error: {
title: string
notFound: string
+ home: string
}
folderContent: {
folder: string
diff --git a/quartz/i18n/locales/en-US.ts b/quartz/i18n/locales/en-US.ts
index ac283fdaf..22cf31e01 100644
--- a/quartz/i18n/locales/en-US.ts
+++ b/quartz/i18n/locales/en-US.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Not Found",
notFound: "Either this page is private or doesn't exist.",
+ home: "Return to Homepage",
},
folderContent: {
folder: "Folder",
diff --git a/quartz/i18n/locales/es-ES.ts b/quartz/i18n/locales/es-ES.ts
index 37a2a79c7..8b0adcc37 100644
--- a/quartz/i18n/locales/es-ES.ts
+++ b/quartz/i18n/locales/es-ES.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "No se encontró.",
notFound: "Esta página es privada o no existe.",
+ home: "Regresar a la página principal",
},
folderContent: {
folder: "Carpeta",
diff --git a/quartz/i18n/locales/fa-IR.ts b/quartz/i18n/locales/fa-IR.ts
new file mode 100644
index 000000000..5bfef5aee
--- /dev/null
+++ b/quartz/i18n/locales/fa-IR.ts
@@ -0,0 +1,84 @@
+import { Translation } from "./definition"
+
+export default {
+ propertyDefaults: {
+ title: "بدون عنوان",
+ description: "توضیح خاصی اضافه نشده است",
+ },
+ components: {
+ callout: {
+ note: "یادداشت",
+ abstract: "چکیده",
+ info: "اطلاعات",
+ todo: "اقدام",
+ tip: "نکته",
+ success: "تیک",
+ question: "سؤال",
+ warning: "هشدار",
+ failure: "شکست",
+ danger: "خطر",
+ bug: "باگ",
+ example: "مثال",
+ quote: "نقل قول",
+ },
+ backlinks: {
+ title: "بکلینکها",
+ noBacklinksFound: "بدون بکلینک",
+ },
+ themeToggle: {
+ lightMode: "حالت روشن",
+ darkMode: "حالت تاریک",
+ },
+ explorer: {
+ title: "مطالب",
+ },
+ footer: {
+ createdWith: "ساخته شده با",
+ },
+ graph: {
+ title: "نمای گراف",
+ },
+ recentNotes: {
+ title: "یادداشتهای اخیر",
+ seeRemainingMore: ({ remaining }) => `${remaining} یادداشت دیگر →`,
+ },
+ transcludes: {
+ transcludeOf: ({ targetSlug }) => `از ${targetSlug}`,
+ linkToOriginal: "پیوند به اصلی",
+ },
+ search: {
+ title: "جستجو",
+ searchBarPlaceholder: "مطلبی را جستجو کنید",
+ },
+ tableOfContents: {
+ title: "فهرست",
+ },
+ contentMeta: {
+ readingTime: ({ minutes }) => `زمان تقریبی مطالعه: ${minutes} دقیقه`,
+ },
+ },
+ pages: {
+ rss: {
+ recentNotes: "یادداشتهای اخیر",
+ lastFewNotes: ({ count }) => `${count} یادداشت اخیر`,
+ },
+ error: {
+ title: "یافت نشد",
+ notFound: "این صفحه یا خصوصی است یا وجود ندارد",
+ home: "بازگشت به صفحه اصلی",
+ },
+ folderContent: {
+ folder: "پوشه",
+ itemsUnderFolder: ({ count }) =>
+ count === 1 ? ".یک مطلب در این پوشه است" : `${count} مطلب در این پوشه است.`,
+ },
+ tagContent: {
+ tag: "برچسب",
+ tagIndex: "فهرست برچسبها",
+ itemsUnderTag: ({ count }) =>
+ count === 1 ? "یک مطلب با این برچسب" : `${count} مطلب با این برچسب.`,
+ showingFirst: ({ count }) => `در حال نمایش ${count} برچسب.`,
+ totalTags: ({ count }) => `${count} برچسب یافت شد.`,
+ },
+ },
+} as const satisfies Translation
diff --git a/quartz/i18n/locales/fr-FR.ts b/quartz/i18n/locales/fr-FR.ts
index e1dfa48b7..ef43fa876 100644
--- a/quartz/i18n/locales/fr-FR.ts
+++ b/quartz/i18n/locales/fr-FR.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Introuvable",
notFound: "Cette page est soit privée, soit elle n'existe pas.",
+ home: "Retour à la page d'accueil",
},
folderContent: {
folder: "Dossier",
diff --git a/quartz/i18n/locales/hu-HU.ts b/quartz/i18n/locales/hu-HU.ts
index 6397309b7..066b7770e 100644
--- a/quartz/i18n/locales/hu-HU.ts
+++ b/quartz/i18n/locales/hu-HU.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Nem található",
notFound: "Ez a lap vagy privát vagy nem létezik.",
+ home: "Vissza a kezdőlapra",
},
folderContent: {
folder: "Mappa",
diff --git a/quartz/i18n/locales/it-IT.ts b/quartz/i18n/locales/it-IT.ts
index ca8818a65..c8c597352 100644
--- a/quartz/i18n/locales/it-IT.ts
+++ b/quartz/i18n/locales/it-IT.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Non trovato",
notFound: "Questa pagina è privata o non esiste.",
+ home: "Ritorna alla home page",
},
folderContent: {
folder: "Cartella",
diff --git a/quartz/i18n/locales/ja-JP.ts b/quartz/i18n/locales/ja-JP.ts
index d429db411..9581b5ed3 100644
--- a/quartz/i18n/locales/ja-JP.ts
+++ b/quartz/i18n/locales/ja-JP.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Not Found",
notFound: "ページが存在しないか、非公開設定になっています。",
+ home: "ホームページに戻る",
},
folderContent: {
folder: "フォルダ",
diff --git a/quartz/i18n/locales/ko-KR.ts b/quartz/i18n/locales/ko-KR.ts
index ea735b00c..9be08d98f 100644
--- a/quartz/i18n/locales/ko-KR.ts
+++ b/quartz/i18n/locales/ko-KR.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Not Found",
notFound: "페이지가 존재하지 않거나 비공개 설정이 되어 있습니다.",
+ home: "홈페이지로 돌아가기",
},
folderContent: {
folder: "폴더",
diff --git a/quartz/i18n/locales/nl-NL.ts b/quartz/i18n/locales/nl-NL.ts
index d075d584a..ccbafa7b3 100644
--- a/quartz/i18n/locales/nl-NL.ts
+++ b/quartz/i18n/locales/nl-NL.ts
@@ -66,6 +66,7 @@ export default {
error: {
title: "Niet gevonden",
notFound: "Deze pagina is niet zichtbaar of bestaat niet.",
+ home: "Keer terug naar de start pagina",
},
folderContent: {
folder: "Map",
diff --git a/quartz/i18n/locales/pl-PL.ts b/quartz/i18n/locales/pl-PL.ts
new file mode 100644
index 000000000..7fa0cd47a
--- /dev/null
+++ b/quartz/i18n/locales/pl-PL.ts
@@ -0,0 +1,84 @@
+import { Translation } from "./definition"
+
+export default {
+ propertyDefaults: {
+ title: "Bez nazwy",
+ description: "Brak opisu",
+ },
+ components: {
+ callout: {
+ note: "Notatka",
+ abstract: "Streszczenie",
+ info: "informacja",
+ todo: "Do zrobienia",
+ tip: "Wskazówka",
+ success: "Zrobione",
+ question: "Pytanie",
+ warning: "Ostrzeżenie",
+ failure: "Usterka",
+ danger: "Niebiezpieczeństwo",
+ bug: "Błąd w kodzie",
+ example: "Przykład",
+ quote: "Cytat",
+ },
+ backlinks: {
+ title: "Odnośniki zwrotne",
+ noBacklinksFound: "Brak połączeń zwrotnych",
+ },
+ themeToggle: {
+ lightMode: "Trzyb jasny",
+ darkMode: "Tryb ciemny",
+ },
+ explorer: {
+ title: "Przeglądaj",
+ },
+ footer: {
+ createdWith: "Stworzone z użyciem",
+ },
+ graph: {
+ title: "Graf",
+ },
+ recentNotes: {
+ title: "Najnowsze notatki",
+ seeRemainingMore: ({ remaining }) => `Zobacz ${remaining} nastepnych →`,
+ },
+ transcludes: {
+ transcludeOf: ({ targetSlug }) => `Osadzone ${targetSlug}`,
+ linkToOriginal: "Łącze do oryginału",
+ },
+ search: {
+ title: "Szukaj",
+ searchBarPlaceholder: "Search for something",
+ },
+ tableOfContents: {
+ title: "Spis treści",
+ },
+ contentMeta: {
+ readingTime: ({ minutes }) => `${minutes} min. czytania `,
+ },
+ },
+ pages: {
+ rss: {
+ recentNotes: "Najnowsze notatki",
+ lastFewNotes: ({ count }) => `Ostatnie ${count} notatek`,
+ },
+ error: {
+ title: "Nie znaleziono",
+ notFound: "Ta strona jest prywatna lub nie istnieje.",
+ home: "Powrót do strony głównej",
+ },
+ folderContent: {
+ folder: "Folder",
+ itemsUnderFolder: ({ count }) =>
+ count === 1 ? "W tym folderze jest 1 element." : `Elementów w folderze: ${count}.`,
+ },
+ tagContent: {
+ tag: "Znacznik",
+ tagIndex: "Spis znaczników",
+ itemsUnderTag: ({ count }) =>
+ count === 1 ? "Oznaczony 1 element." : `Elementów z tym znacznikiem: ${count}.`,
+ showingFirst: ({ count }) => `Pokazuje ${count} pierwszych znaczników.`,
+ totalTags: ({ count }) => `Znalezionych wszystkich znaczników: ${count}.`,
+ },
+ },
+} as const satisfies Translation
diff --git a/quartz/i18n/locales/pt-BR.ts b/quartz/i18n/locales/pt-BR.ts
index b59c7b47b..c7b6bfb60 100644
--- a/quartz/i18n/locales/pt-BR.ts
+++ b/quartz/i18n/locales/pt-BR.ts
@@ -65,11 +65,12 @@ export default {
error: {
title: "Não encontrado",
notFound: "Esta página é privada ou não existe.",
+ home: "Retornar a página inicial",
},
folderContent: {
folder: "Arquivo",
itemsUnderFolder: ({ count }) =>
- count === 1 ? "1 item mneste arquivo." : `${count} items neste arquivo.`,
+ count === 1 ? "1 item neste arquivo." : `${count} items neste arquivo.`,
},
tagContent: {
tag: "Tag",
diff --git a/quartz/i18n/locales/ro-RO.ts b/quartz/i18n/locales/ro-RO.ts
index 556b18995..2de1c8cd9 100644
--- a/quartz/i18n/locales/ro-RO.ts
+++ b/quartz/i18n/locales/ro-RO.ts
@@ -66,6 +66,7 @@ export default {
error: {
title: "Pagina nu a fost găsită",
notFound: "Fie această pagină este privată, fie nu există.",
+ home: "Reveniți la pagina de pornire",
},
folderContent: {
folder: "Dosar",
diff --git a/quartz/i18n/locales/ru-RU.ts b/quartz/i18n/locales/ru-RU.ts
index 8ead3cabe..18e081734 100644
--- a/quartz/i18n/locales/ru-RU.ts
+++ b/quartz/i18n/locales/ru-RU.ts
@@ -67,6 +67,7 @@ export default {
error: {
title: "Страница не найдена",
notFound: "Эта страница приватная или не существует",
+ home: "Вернуться на главную страницу",
},
folderContent: {
folder: "Папка",
diff --git a/quartz/i18n/locales/uk-UA.ts b/quartz/i18n/locales/uk-UA.ts
index b63693837..d39febb75 100644
--- a/quartz/i18n/locales/uk-UA.ts
+++ b/quartz/i18n/locales/uk-UA.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Не знайдено",
notFound: "Ця сторінка або приватна, або не існує.",
+ home: "Повернутися на головну сторінку",
},
folderContent: {
folder: "Папка",
diff --git a/quartz/i18n/locales/vi-VN.ts b/quartz/i18n/locales/vi-VN.ts
index b72ced4ac..39a8fbcc1 100644
--- a/quartz/i18n/locales/vi-VN.ts
+++ b/quartz/i18n/locales/vi-VN.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "Không Tìm Thấy",
notFound: "Trang này được bảo mật hoặc không tồn tại.",
+ home: "Trở về trang chủ",
},
folderContent: {
folder: "Thư Mục",
diff --git a/quartz/i18n/locales/zh-CN.ts b/quartz/i18n/locales/zh-CN.ts
index 43d011197..b710db539 100644
--- a/quartz/i18n/locales/zh-CN.ts
+++ b/quartz/i18n/locales/zh-CN.ts
@@ -65,6 +65,7 @@ export default {
error: {
title: "无法找到",
notFound: "私有笔记或笔记不存在。",
+ home: "返回首页",
},
folderContent: {
folder: "文件夹",
diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts
index 81d3af2e8..e6725d99d 100644
--- a/quartz/plugins/emitters/componentResources.ts
+++ b/quartz/plugins/emitters/componentResources.ts
@@ -136,6 +136,14 @@ function addGlobalPageResources(ctx: BuildCtx, componentResources: ComponentReso
posthog.init('${cfg.analytics.apiKey}',{api_host:'${cfg.analytics.host ?? "https://app.posthog.com"}'})\`
document.head.appendChild(posthogScript)
`)
+ } else if (cfg.analytics?.provider === "tinylytics") {
+ const siteId = cfg.analytics.siteId
+ componentResources.afterDOMLoaded.push(`
+ const tinylyticsScript = document.createElement("script")
+ tinylyticsScript.src = "https://tinylytics.app/embed/${siteId}.js"
+ tinylyticsScript.defer = true
+ document.head.appendChild(tinylyticsScript)
+ `)
}
if (cfg.enableSPA) {