From 8889ab63ebf579d7f134d4e83ab21533ad5bda87 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 28 Sep 2024 09:38:19 -0700 Subject: [PATCH 001/303] fix: provide default pageTitleSuffix (closes #1452) --- quartz/components/Head.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index 7b9815ca0..90e338730 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -6,8 +6,9 @@ import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } fro export default (() => { const Head: QuartzComponent = ({ cfg, fileData, externalResources }: QuartzComponentProps) => { + const titleSuffix = cfg.pageTitleSuffix ?? "" const title = - (fileData.frontmatter?.title ?? i18n(cfg.locale).propertyDefaults.title) + cfg.pageTitleSuffix + (fileData.frontmatter?.title ?? i18n(cfg.locale).propertyDefaults.title) + titleSuffix const description = fileData.description?.trim() ?? i18n(cfg.locale).propertyDefaults.description const { css, js } = externalResources From 1416f62a471f6b9910a86ae57e48bafc24af3278 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Mon, 30 Sep 2024 04:24:15 +0200 Subject: [PATCH 002/303] fix(layout): backlinks grid triage (#1447) * fix: mobile backlinks orientation * temp: hide broken list gradient * fix: backlinks overflow --- quartz/components/styles/backlinks.scss | 48 ++++++++++++------------- quartz/components/styles/explorer.scss | 4 +-- quartz/styles/base.scss | 4 +-- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/quartz/components/styles/backlinks.scss b/quartz/components/styles/backlinks.scss index 36fb6a4c6..dc82ce74a 100644 --- a/quartz/components/styles/backlinks.scss +++ b/quartz/components/styles/backlinks.scss @@ -1,11 +1,8 @@ @use "../../styles/variables.scss" as *; .backlinks { - @media all and not ($mobile) { - overflow-y: auto; - display: flex; - flex-direction: column; - &:after { + flex-direction: column; + /*&:after { pointer-events: none; content: ""; width: 100%; @@ -16,29 +13,32 @@ opacity: 1; transition: opacity 0.3s ease; background: linear-gradient(transparent 0px, var(--light)); - } + }*/ - & > h3 { - font-size: 1rem; - margin: 0; - } + & > h3 { + font-size: 1rem; + margin: 0; + } - & > ul { - list-style: none; - padding: 0; - margin: 0.5rem 0; + & > ul { + list-style: none; + padding: 0; + margin: 0.5rem 0; - & > li { - & > a { - background-color: transparent; - } - } - } - - & > .overflow { - &:after { - display: none; + & > li { + & > a { + background-color: transparent; } } } + + & > .overflow { + &:after { + display: none; + } + height: auto; + @media all and ($desktop) { + height: 250px; + } + } } diff --git a/quartz/components/styles/explorer.scss b/quartz/components/styles/explorer.scss index ab388dce5..397fd0241 100644 --- a/quartz/components/styles/explorer.scss +++ b/quartz/components/styles/explorer.scss @@ -9,7 +9,7 @@ display: flex; } } - &:after { + /*&:after { pointer-events: none; content: ""; width: 100%; @@ -20,7 +20,7 @@ opacity: 1; transition: opacity 0.3s ease; background: linear-gradient(transparent 0px, var(--light)); - } + }*/ } button#explorer { diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 8511b2d62..9cf8cc98d 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -554,7 +554,7 @@ ol.overflow { & > li:last-of-type { margin-bottom: 30px; } - &:after { + /*&:after { pointer-events: none; content: ""; width: 100%; @@ -565,7 +565,7 @@ ol.overflow { opacity: 1; transition: opacity 0.3s ease; background: linear-gradient(transparent 0px, var(--light)); - } + }*/ } .transclude { From b8c46ba81a24c89059c9cd473baac72b463eb177 Mon Sep 17 00:00:00 2001 From: Malcolm Mielle Date: Mon, 30 Sep 2024 19:06:37 +0200 Subject: [PATCH 003/303] feat(analytics): clarity (#1446) Add the code necessary for support of Microsoft clarity --- docs/configuration.md | 3 ++- quartz/cfg.ts | 4 ++++ quartz/plugins/emitters/componentResources.ts | 9 +++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/configuration.md b/docs/configuration.md index 302d06730..1622da6fa 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -33,6 +33,7 @@ This part of the configuration concerns anything that can affect the whole site. - `{ provider: 'posthog', apiKey: '', host: '' }`: use [Posthog](https://posthog.com/); - `{ provider: 'tinylytics', siteId: '' }`: use [Tinylytics](https://tinylytics.app/); - `{ provider: 'cabin' }` or `{ provider: 'cabin', host: 'https://cabin.example.com' }` (custom domain): use [Cabin](https://withcabin.com); + - `{provider: 'clarity', projectId: ' Date: Mon, 30 Sep 2024 20:10:05 -0400 Subject: [PATCH 004/303] chore(deps): bump @floating-ui/dom from 1.6.10 to 1.6.11 (#1463) Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.6.10 to 1.6.11. - [Release notes](https://github.com/floating-ui/floating-ui/releases) - [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/dom/CHANGELOG.md) - [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.6.11/packages/dom) --- updated-dependencies: - dependency-name: "@floating-ui/dom" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0fe38b2f2..501d41b93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@clack/prompts": "^0.7.0", - "@floating-ui/dom": "^1.6.10", + "@floating-ui/dom": "^1.6.11", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", @@ -581,18 +581,18 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", - "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", + "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.7" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", - "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", diff --git a/package.json b/package.json index 4872dd5e4..5814a2e18 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "@clack/prompts": "^0.7.0", - "@floating-ui/dom": "^1.6.10", + "@floating-ui/dom": "^1.6.11", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", From b0c079f24af6f93a01c4a0c619702effdcb3b21a Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Tue, 1 Oct 2024 17:49:13 +0200 Subject: [PATCH 005/303] fix(layout): restore footer to the proper position (#1470) * fix(layout): restore footer to the proper position * align ToC scrollbar properly on short headers --- quartz/components/styles/toc.scss | 1 + quartz/styles/base.scss | 12 ++++++------ quartz/styles/variables.scss | 24 ++++++++++++------------ 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/quartz/components/styles/toc.scss b/quartz/components/styles/toc.scss index 512b01d4d..3b2b6b32a 100644 --- a/quartz/components/styles/toc.scss +++ b/quartz/components/styles/toc.scss @@ -74,6 +74,7 @@ button#toc { } > ul.overflow { max-height: none; + width: 100%; } @for $i from 0 through 6 { diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 9cf8cc98d..61c918f42 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -190,7 +190,7 @@ a { & .sidebar.left { z-index: 1; - grid-area: sidebar-left; + grid-area: grid-sidebar-left; flex-direction: column; @media all and ($mobile) { gap: 0; @@ -205,7 +205,7 @@ a { } & .sidebar.right { - grid-area: sidebar-right; + grid-area: grid-sidebar-right; margin-right: 0; flex-direction: column; @media all and ($mobile) { @@ -232,7 +232,7 @@ a { } & .page-header { - grid-area: page-header; + grid-area: grid-header; margin: $topSpacing 0 0 0; @media all and ($mobile) { margin-top: 0; @@ -241,11 +241,11 @@ a { } & .center > article { - grid-area: page-center; + grid-area: grid-center; } - & .page-footer { - grid-area: page-footer; + & footer { + grid-area: grid-footer; } & .center, diff --git a/quartz/styles/variables.scss b/quartz/styles/variables.scss index 3ac5a8b4f..9335e5506 100644 --- a/quartz/styles/variables.scss +++ b/quartz/styles/variables.scss @@ -27,11 +27,11 @@ $mobileGrid: ( rowGap: "5px", columnGap: "5px", templateAreas: - '"sidebar-left"\ - "page-header"\ - "page-center"\ - "sidebar-right"\ - "page-footer"', + '"grid-sidebar-left"\ + "grid-header"\ + "grid-center"\ + "grid-sidebar-right"\ + "grid-footer"', ); $tabletGrid: ( templateRows: "auto auto auto auto", @@ -39,10 +39,10 @@ $tabletGrid: ( rowGap: "5px", columnGap: "5px", templateAreas: - '"sidebar-left page-header"\ - "sidebar-left page-center"\ - "sidebar-left sidebar-right"\ - "sidebar-left page-footer"', + '"grid-sidebar-left grid-header"\ + "grid-sidebar-left grid-center"\ + "grid-sidebar-left grid-sidebar-right"\ + "grid-sidebar-left grid-footer"', ); $desktopGrid: ( templateRows: "auto auto auto", @@ -50,7 +50,7 @@ $desktopGrid: ( rowGap: "5px", columnGap: "5px", templateAreas: - '"sidebar-left page-header sidebar-right"\ - "sidebar-left page-center sidebar-right"\ - "sidebar-left page-footer sidebar-right"', + '"grid-sidebar-left grid-header grid-sidebar-right"\ + "grid-sidebar-left grid-center grid-sidebar-right"\ + "grid-sidebar-left grid-footer grid-sidebar-right"', ); From 319b4497bc442500344670ea37d1e284aa9dea05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 04:41:36 -0400 Subject: [PATCH 006/303] chore(deps-dev): bump tsx from 4.19.0 to 4.19.1 (#1467) Bumps [tsx](https://github.com/privatenumber/tsx) from 4.19.0 to 4.19.1. - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.19.0...v4.19.1) --- updated-dependencies: - dependency-name: tsx dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 501d41b93..1065cde4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,7 +83,7 @@ "@types/yargs": "^17.0.33", "esbuild": "^0.19.9", "prettier": "^3.3.3", - "tsx": "^4.19.0", + "tsx": "^4.19.1", "typescript": "^5.6.2" }, "engines": { @@ -5967,9 +5967,9 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsx": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.0.tgz", - "integrity": "sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", "dev": true, "dependencies": { "esbuild": "~0.23.0", diff --git a/package.json b/package.json index 5814a2e18..629e2adce 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "@types/yargs": "^17.0.33", "esbuild": "^0.19.9", "prettier": "^3.3.3", - "tsx": "^4.19.0", + "tsx": "^4.19.1", "typescript": "^5.6.2" } } From 9cd072bfc336f3eeb453c279dc3953e2a7e3d9fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 04:41:50 -0400 Subject: [PATCH 007/303] chore(deps): bump hast-util-to-string from 3.0.0 to 3.0.1 (#1466) Bumps [hast-util-to-string](https://github.com/rehypejs/rehype-minify) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/rehypejs/rehype-minify/releases) - [Changelog](https://github.com/rehypejs/rehype-minify/blob/main/changelog.md) - [Commits](https://github.com/rehypejs/rehype-minify/commits) --- updated-dependencies: - dependency-name: hast-util-to-string dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1065cde4d..19357532a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "gray-matter": "^4.0.3", "hast-util-to-html": "^9.0.3", "hast-util-to-jsx-runtime": "^2.3.0", - "hast-util-to-string": "^3.0.0", + "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", "lightningcss": "^1.26.0", @@ -2970,9 +2970,9 @@ } }, "node_modules/hast-util-to-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz", - "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", "dependencies": { "@types/hast": "^3.0.0" }, diff --git a/package.json b/package.json index 629e2adce..2ee70e258 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "gray-matter": "^4.0.3", "hast-util-to-html": "^9.0.3", "hast-util-to-jsx-runtime": "^2.3.0", - "hast-util-to-string": "^3.0.0", + "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", "lightningcss": "^1.26.0", From 62906eebd3da7362f68b374fd5c530b141387b7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 04:42:02 -0400 Subject: [PATCH 008/303] chore(deps-dev): bump @types/node from 22.5.5 to 22.7.4 (#1465) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.5.5 to 22.7.4. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19357532a..d00dba0cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,7 +76,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.5.5", + "@types/node": "^22.7.4", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.12", @@ -1301,9 +1301,9 @@ } }, "node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "dev": true, "dependencies": { "undici-types": "~6.19.2" diff --git a/package.json b/package.json index 2ee70e258..ea7059c68 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.5.5", + "@types/node": "^22.7.4", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.12", From e06f681ce7823799418c7edaac1429aa70c3e08a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 04:42:14 -0400 Subject: [PATCH 009/303] chore(deps): bump preact from 10.24.0 to 10.24.1 (#1464) Bumps [preact](https://github.com/preactjs/preact) from 10.24.0 to 10.24.1. - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.24.0...10.24.1) --- updated-dependencies: - dependency-name: preact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d00dba0cd..042a7fcb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", "pixi.js": "^8.4.1", - "preact": "^10.24.0", + "preact": "^10.24.1", "preact-render-to-string": "^6.5.11", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", @@ -4904,9 +4904,9 @@ } }, "node_modules/preact": { - "version": "10.24.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.0.tgz", - "integrity": "sha512-aK8Cf+jkfyuZ0ZZRG9FbYqwmEiGQ4y/PUO4SuTWoyWL244nZZh7bd5h2APd4rSNDYTBNghg1L+5iJN3Skxtbsw==", + "version": "10.24.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.1.tgz", + "integrity": "sha512-PnBAwFI3Yjxxcxw75n6VId/5TFxNW/81zexzWD9jn1+eSrOP84NdsS38H5IkF/UH3frqRPT+MvuCoVHjTDTnDw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" diff --git a/package.json b/package.json index ea7059c68..a5178735e 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", "pixi.js": "^8.4.1", - "preact": "^10.24.0", + "preact": "^10.24.1", "preact-render-to-string": "^6.5.11", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", From af14ca7c4f754b07a5f32efc5265632f539ef103 Mon Sep 17 00:00:00 2001 From: KurekMartin <79570332+KurekMartin@users.noreply.github.com> Date: Fri, 4 Oct 2024 18:10:40 +0200 Subject: [PATCH 010/303] i18n: add Czech translation (#1477) * add Czech translation * fix formatting --- quartz/i18n/index.ts | 2 + quartz/i18n/locales/cs-CZ.ts | 84 ++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 quartz/i18n/locales/cs-CZ.ts diff --git a/quartz/i18n/index.ts b/quartz/i18n/index.ts index edde307f5..2fba70e16 100644 --- a/quartz/i18n/index.ts +++ b/quartz/i18n/index.ts @@ -19,6 +19,7 @@ import pt from "./locales/pt-BR" import hu from "./locales/hu-HU" import fa from "./locales/fa-IR" import pl from "./locales/pl-PL" +import cs from "./locales/cs-CZ" export const TRANSLATIONS = { "en-US": enUs, @@ -62,6 +63,7 @@ export const TRANSLATIONS = { "hu-HU": hu, "fa-IR": fa, "pl-PL": pl, + "cs-CZ": cs, } as const export const defaultTranslation = "en-US" diff --git a/quartz/i18n/locales/cs-CZ.ts b/quartz/i18n/locales/cs-CZ.ts new file mode 100644 index 000000000..bf089d137 --- /dev/null +++ b/quartz/i18n/locales/cs-CZ.ts @@ -0,0 +1,84 @@ +import { Translation } from "./definition" + +export default { + propertyDefaults: { + title: "Bez názvu", + description: "Nebyl uveden žádný popis", + }, + components: { + callout: { + note: "Poznámka", + abstract: "Abstract", + info: "Info", + todo: "Todo", + tip: "Tip", + success: "Úspěch", + question: "Otázka", + warning: "Upozornění", + failure: "Chyba", + danger: "Nebezpečí", + bug: "Bug", + example: "Příklad", + quote: "Citace", + }, + backlinks: { + title: "Příchozí odkazy", + noBacklinksFound: "Nenalezeny žádné příchozí odkazy", + }, + themeToggle: { + lightMode: "Světlý režim", + darkMode: "Tmavý režim", + }, + explorer: { + title: "Procházet", + }, + footer: { + createdWith: "Vytvořeno pomocí", + }, + graph: { + title: "Graf", + }, + recentNotes: { + title: "Nejnovější poznámky", + seeRemainingMore: ({ remaining }) => `Zobraz ${remaining} dalších →`, + }, + transcludes: { + transcludeOf: ({ targetSlug }) => `Zobrazení ${targetSlug}`, + linkToOriginal: "Odkaz na původní dokument", + }, + search: { + title: "Hledat", + searchBarPlaceholder: "Hledejte něco", + }, + tableOfContents: { + title: "Obsah", + }, + contentMeta: { + readingTime: ({ minutes }) => `${minutes} min čtení`, + }, + }, + pages: { + rss: { + recentNotes: "Nejnovější poznámky", + lastFewNotes: ({ count }) => `Posledních ${count} poznámek`, + }, + error: { + title: "Nenalezeno", + notFound: "Tato stránka je buď soukromá, nebo neexistuje.", + home: "Návrat na domovskou stránku", + }, + folderContent: { + folder: "Složka", + itemsUnderFolder: ({ count }) => + count === 1 ? "1 položka v této složce." : `${count} položek v této složce.`, + }, + tagContent: { + tag: "Tag", + tagIndex: "Rejstřík tagů", + itemsUnderTag: ({ count }) => + count === 1 ? "1 položka s tímto tagem." : `${count} položek s tímto tagem.`, + showingFirst: ({ count }) => `Zobrazují se první ${count} tagy.`, + totalTags: ({ count }) => `Nalezeno celkem ${count} tagů.`, + }, + }, +} as const satisfies Translation From 313cef60ee8d2454263d8ae7671c846f4d418f0e Mon Sep 17 00:00:00 2001 From: Julia van der Kris Date: Mon, 7 Oct 2024 04:15:19 +0200 Subject: [PATCH 011/303] infra: build quartz docker image to GHCR (#1192) * Add GitHub action to build & push Docker image to GHCR * Use double quotes to keep `prettier` happy :) * Don't run Docker build & push on forks * -1 char commit lmao * Add git metadata to Docker image * Apply Aaron's patch * chore: run prettier --------- Signed-off-by: Aaron Pham Co-authored-by: Aaron Pham --- .github/workflows/docker-build-push.yaml | 117 +++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 .github/workflows/docker-build-push.yaml diff --git a/.github/workflows/docker-build-push.yaml b/.github/workflows/docker-build-push.yaml new file mode 100644 index 000000000..e72c96700 --- /dev/null +++ b/.github/workflows/docker-build-push.yaml @@ -0,0 +1,117 @@ +name: Docker build & push image + +on: + push: + branches: [v4] + tags: ["v*"] + pull_request: + branches: [v4] + paths: + - .github/workflows/docker-build-push.yaml + - quartz/** + workflow_dispatch: + +jobs: + build: + if: ${{ github.repository == 'jackyzha0/quartz' }} # Comment this out if you want to publish your own images on a fork! + runs-on: ubuntu-latest + steps: + - name: Set lowercase repository owner environment variable + run: | + echo "OWNER_LOWERCASE=${OWNER,,}" >> ${GITHUB_ENV} + env: + OWNER: "${{ github.repository_owner }}" + - uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Inject slug/short variables + uses: rlespinasse/github-slug-action@v4.4.1 + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + install: true + driver-opts: | + image=moby/buildkit:master + network=host + - name: Install cosign + if: github.event_name != 'pull_request' + uses: sigstore/cosign-installer@v3.7.0 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + if: github.event_name != 'pull_request' + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata tags and labels on PRs + if: github.event_name == 'pull_request' + id: meta-pr + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ env.OWNER_LOWERCASE }}/quartz + tags: | + type=raw,value=sha-${{ env.GITHUB_SHA_SHORT }} + labels: | + org.opencontainers.image.source="https://github.com/${{ github.repository_owner }}/quartz" + - name: Extract metadata tags and labels for main, release or tag + if: github.event_name != 'pull_request' + id: meta + uses: docker/metadata-action@v5 + with: + flavor: | + latest=auto + images: ghcr.io/${{ env.OWNER_LOWERCASE }}/quartz + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}}.{{minor}}.{{patch}} + type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} + type=raw,value=sha-${{ env.GITHUB_SHA_SHORT }} + labels: | + maintainer=${{ github.repository_owner }} + org.opencontainers.image.source="https://github.com/${{ github.repository_owner }}/quartz" + + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v6 + with: + push: true + build-args: | + GIT_SHA=${{ env.GITHUB_SHA }} + DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} + tags: ${{ steps.meta.outputs.tags || steps.meta-pr.outputs.tags }} + labels: ${{ steps.meta.outputs.labels || steps.meta-pr.outputs.labels }} + cache-from: type=gha + cache-to: type=gha + + - name: Sign the released image + if: ${{ github.event_name != 'pull_request' }} + env: + COSIGN_EXPERIMENTAL: "true" + run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign --yes {}@${{ steps.build-and-push.outputs.digest }} + - name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph + uses: aquasecurity/trivy-action@master + if: ${{ github.event_name != 'pull_request' }} + with: + image-ref: "ghcr.io/${{ github.repository_owner }}/quartz:sha-${{ env.GITHUB_SHA_SHORT }}" + format: "github" + output: "dependency-results.sbom.json" + github-pat: ${{ secrets.GITHUB_TOKEN }} + scanners: "vuln" + - name: Run Trivy vulnerability scanner + uses: aquasecurity/trivy-action@master + if: ${{ github.event_name != 'pull_request' }} + with: + image-ref: "ghcr.io/${{ github.repository_owner }}/quartz:sha-${{ env.GITHUB_SHA_SHORT }}" + format: "sarif" + output: "trivy-results.sarif" + severity: "CRITICAL" + scanners: "vuln" + - name: Upload Trivy scan results to GitHub Security tab + uses: github/codeql-action/upload-sarif@v2 + if: ${{ github.event_name != 'pull_request' }} + with: + sarif_file: "trivy-results.sarif" From 66d7dd8677e5ef05c97773f3590d43ef97d21d98 Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Sun, 6 Oct 2024 22:34:31 -0400 Subject: [PATCH 012/303] fix(ci): run build on tags (#1483) * fix(ci): run build on tags Signed-off-by: Aaron Pham * chore: update docker warning and not push on PR Signed-off-by: Aaron Pham --------- Signed-off-by: Aaron Pham --- .github/workflows/docker-build-push.yaml | 4 ++-- Dockerfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-build-push.yaml b/.github/workflows/docker-build-push.yaml index e72c96700..61ec110e6 100644 --- a/.github/workflows/docker-build-push.yaml +++ b/.github/workflows/docker-build-push.yaml @@ -3,7 +3,7 @@ name: Docker build & push image on: push: branches: [v4] - tags: ["v*"] + tags: ["v*"] pull_request: branches: [v4] paths: @@ -78,7 +78,7 @@ jobs: id: build-and-push uses: docker/build-push-action@v6 with: - push: true + push: ${{ github.event_name != 'pull_request' }} build-args: | GIT_SHA=${{ env.GITHUB_SHA }} DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} diff --git a/Dockerfile b/Dockerfile index 1d9e5915f..4493853e2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20-slim as builder +FROM node:20-slim AS builder WORKDIR /usr/src/app COPY package.json . COPY package-lock.json* . From 497d51973ae2a986373decbfeb7a1afe229e5fd6 Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Mon, 7 Oct 2024 02:52:14 -0400 Subject: [PATCH 013/303] chore(ci): remove signing and vuln (#1484) Signed-off-by: Aaron Pham --- .github/workflows/docker-build-push.yaml | 29 ------------------------ 1 file changed, 29 deletions(-) diff --git a/.github/workflows/docker-build-push.yaml b/.github/workflows/docker-build-push.yaml index 61ec110e6..f3bd2cdb3 100644 --- a/.github/workflows/docker-build-push.yaml +++ b/.github/workflows/docker-build-push.yaml @@ -86,32 +86,3 @@ jobs: labels: ${{ steps.meta.outputs.labels || steps.meta-pr.outputs.labels }} cache-from: type=gha cache-to: type=gha - - - name: Sign the released image - if: ${{ github.event_name != 'pull_request' }} - env: - COSIGN_EXPERIMENTAL: "true" - run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign --yes {}@${{ steps.build-and-push.outputs.digest }} - - name: Run Trivy in GitHub SBOM mode and submit results to Dependency Graph - uses: aquasecurity/trivy-action@master - if: ${{ github.event_name != 'pull_request' }} - with: - image-ref: "ghcr.io/${{ github.repository_owner }}/quartz:sha-${{ env.GITHUB_SHA_SHORT }}" - format: "github" - output: "dependency-results.sbom.json" - github-pat: ${{ secrets.GITHUB_TOKEN }} - scanners: "vuln" - - name: Run Trivy vulnerability scanner - uses: aquasecurity/trivy-action@master - if: ${{ github.event_name != 'pull_request' }} - with: - image-ref: "ghcr.io/${{ github.repository_owner }}/quartz:sha-${{ env.GITHUB_SHA_SHORT }}" - format: "sarif" - output: "trivy-results.sarif" - severity: "CRITICAL" - scanners: "vuln" - - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@v2 - if: ${{ github.event_name != 'pull_request' }} - with: - sarif_file: "trivy-results.sarif" From fe4b039b60826e1ed10aab3d9127ae6e08b396d8 Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Wed, 9 Oct 2024 12:52:49 -0400 Subject: [PATCH 014/303] chore(ci): group dependabot upgrade (#1491) Signed-off-by: Aaron Pham --- .github/dependabot.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 42adb4474..0ea6875a2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,11 +1,11 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - version: 2 updates: - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" + groups: + production-dependencies: + applies-to: "version-updates" + patterns: + - "*" From 8a95c865c86b94ad2b8553cfc6362233243984d1 Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Wed, 9 Oct 2024 14:14:44 -0400 Subject: [PATCH 015/303] chore(citations): passthrough options (#1429) --- quartz/plugins/transformers/citations.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/quartz/plugins/transformers/citations.ts b/quartz/plugins/transformers/citations.ts index 5242f37c5..dcac41b2e 100644 --- a/quartz/plugins/transformers/citations.ts +++ b/quartz/plugins/transformers/citations.ts @@ -21,7 +21,7 @@ export const Citations: QuartzTransformerPlugin> = (userOpts) = const opts = { ...defaultOptions, ...userOpts } return { name: "Citations", - htmlPlugins() { + htmlPlugins(ctx) { const plugins: PluggableList = [] // Add rehype-citation to the list of plugins @@ -31,6 +31,8 @@ export const Citations: QuartzTransformerPlugin> = (userOpts) = bibliography: opts.bibliographyFile, suppressBibliography: opts.suppressBibliography, linkCitations: opts.linkCitations, + csl: opts.csl, + lang: ctx.cfg.configuration.locale ?? "en-US", }, ]) From 11c23a137af9f7f310311e61a34f70d1f40c463b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:57:33 -0700 Subject: [PATCH 016/303] chore(deps): bump the production-dependencies group with 9 updates (#1495) Bumps the production-dependencies group with 9 updates: | Package | From | To | | --- | --- | --- | | [chokidar](https://github.com/paulmillr/chokidar) | `3.6.0` | `4.0.1` | | [esbuild-sass-plugin](https://github.com/glromeo/esbuild-sass-plugin) | `2.16.1` | `3.3.1` | | [lightningcss](https://github.com/parcel-bundler/lightningcss) | `1.26.0` | `1.27.0` | | [preact](https://github.com/preactjs/preact) | `10.24.1` | `10.24.2` | | [rehype-citation](https://github.com/timlrx/rehype-citation) | `2.1.1` | `2.1.2` | | [shiki](https://github.com/shikijs/shiki/tree/HEAD/packages/shiki) | `1.18.0` | `1.22.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `22.7.4` | `22.7.5` | | [esbuild](https://github.com/evanw/esbuild) | `0.19.12` | `0.24.0` | | [typescript](https://github.com/microsoft/TypeScript) | `5.6.2` | `5.6.3` | Updates `chokidar` from 3.6.0 to 4.0.1 - [Release notes](https://github.com/paulmillr/chokidar/releases) - [Commits](https://github.com/paulmillr/chokidar/compare/3.6.0...4.0.1) Updates `esbuild-sass-plugin` from 2.16.1 to 3.3.1 - [Release notes](https://github.com/glromeo/esbuild-sass-plugin/releases) - [Commits](https://github.com/glromeo/esbuild-sass-plugin/compare/v2.16.1...v3.3.1) Updates `lightningcss` from 1.26.0 to 1.27.0 - [Release notes](https://github.com/parcel-bundler/lightningcss/releases) - [Commits](https://github.com/parcel-bundler/lightningcss/compare/v1.26.0...v1.27.0) Updates `preact` from 10.24.1 to 10.24.2 - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.24.1...10.24.2) Updates `rehype-citation` from 2.1.1 to 2.1.2 - [Release notes](https://github.com/timlrx/rehype-citation/releases) - [Commits](https://github.com/timlrx/rehype-citation/compare/v2.1.1...v2.1.2) Updates `shiki` from 1.18.0 to 1.22.0 - [Release notes](https://github.com/shikijs/shiki/releases) - [Changelog](https://github.com/shikijs/shiki/blob/main/CHANGELOG.md) - [Commits](https://github.com/shikijs/shiki/commits/v1.22.0/packages/shiki) Updates `@types/node` from 22.7.4 to 22.7.5 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `esbuild` from 0.19.12 to 0.24.0 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.19.12...v0.24.0) Updates `typescript` from 5.6.2 to 5.6.3 - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.6.2...v5.6.3) --- updated-dependencies: - dependency-name: chokidar dependency-type: direct:production update-type: version-update:semver-major dependency-group: production-dependencies - dependency-name: esbuild-sass-plugin dependency-type: direct:production update-type: version-update:semver-major dependency-group: production-dependencies - dependency-name: lightningcss dependency-type: direct:production update-type: version-update:semver-minor dependency-group: production-dependencies - dependency-name: preact dependency-type: direct:production update-type: version-update:semver-patch dependency-group: production-dependencies - dependency-name: rehype-citation dependency-type: direct:production update-type: version-update:semver-patch dependency-group: production-dependencies - dependency-name: shiki dependency-type: direct:production update-type: version-update:semver-minor dependency-group: production-dependencies - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: production-dependencies - dependency-name: esbuild dependency-type: direct:development update-type: version-update:semver-minor dependency-group: production-dependencies - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch dependency-group: production-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 979 ++++++++++++++++++++++++++++++++-------------- package.json | 18 +- 2 files changed, 697 insertions(+), 300 deletions(-) diff --git a/package-lock.json b/package-lock.json index 042a7fcb6..1898a462a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,10 +15,10 @@ "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", "chalk": "^5.3.0", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "cli-spinner": "^0.2.10", "d3": "^7.9.0", - "esbuild-sass-plugin": "^2.16.1", + "esbuild-sass-plugin": "^3.3.1", "flexsearch": "0.7.43", "github-slugger": "^2.0.0", "globby": "^14.0.2", @@ -28,19 +28,19 @@ "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", - "lightningcss": "^1.26.0", + "lightningcss": "^1.27.0", "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", "pixi.js": "^8.4.1", - "preact": "^10.24.1", + "preact": "^10.24.2", "preact-render-to-string": "^6.5.11", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", "rehype-autolink-headings": "^7.1.0", - "rehype-citation": "^2.1.1", + "rehype-citation": "^2.1.2", "rehype-katex": "^7.0.1", "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.14.0", @@ -57,7 +57,7 @@ "rfdc": "^1.4.1", "rimraf": "^6.0.1", "serve-handler": "^6.1.5", - "shiki": "^1.18.0", + "shiki": "^1.22.0", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -76,15 +76,15 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.7.4", + "@types/node": "^22.7.5", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.12", "@types/yargs": "^17.0.33", - "esbuild": "^0.19.9", + "esbuild": "^0.24.0", "prettier": "^3.3.3", "tsx": "^4.19.1", - "typescript": "^5.6.2" + "typescript": "^5.6.3" }, "engines": { "node": "20 || >=22", @@ -101,6 +101,12 @@ "is-potential-custom-element-name": "^1.0.1" } }, + "node_modules/@bufbuild/protobuf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz", + "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==", + "peer": true + }, "node_modules/@citation-js/core": { "version": "0.7.14", "resolved": "https://registry.npmjs.org/@citation-js/core/-/core-0.7.14.tgz", @@ -212,9 +218,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ "ppc64" ], @@ -223,13 +229,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", "cpu": [ "arm" ], @@ -238,13 +244,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", "cpu": [ "arm64" ], @@ -253,13 +259,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", "cpu": [ "x64" ], @@ -268,13 +274,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], @@ -283,13 +289,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", "cpu": [ "x64" ], @@ -298,13 +304,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", "cpu": [ "arm64" ], @@ -313,13 +319,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", "cpu": [ "x64" ], @@ -328,13 +334,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", "cpu": [ "arm" ], @@ -343,13 +349,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", "cpu": [ "arm64" ], @@ -358,13 +364,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", "cpu": [ "ia32" ], @@ -373,13 +379,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", "cpu": [ "loong64" ], @@ -388,13 +394,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", "cpu": [ "mips64el" ], @@ -403,13 +409,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", "cpu": [ "ppc64" ], @@ -418,13 +424,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", "cpu": [ "riscv64" ], @@ -433,13 +439,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", "cpu": [ "s390x" ], @@ -448,13 +454,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", "cpu": [ "x64" ], @@ -463,13 +469,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", "cpu": [ "x64" ], @@ -478,7 +484,7 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { @@ -498,9 +504,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", "cpu": [ "x64" ], @@ -509,13 +515,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", "cpu": [ "x64" ], @@ -524,13 +530,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", "cpu": [ "arm64" ], @@ -539,13 +545,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", "cpu": [ "ia32" ], @@ -554,13 +560,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", "cpu": [ "x64" ], @@ -569,7 +575,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@floating-ui/core": { @@ -892,50 +898,50 @@ } }, "node_modules/@shikijs/core": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.18.0.tgz", - "integrity": "sha512-VK4BNVCd2leY62Nm2JjyxtRLkyrZT/tv104O81eyaCjHq4Adceq2uJVFJJAIof6lT1mBwZrEo2qT/T+grv3MQQ==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz", + "integrity": "sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==", "dependencies": { - "@shikijs/engine-javascript": "1.18.0", - "@shikijs/engine-oniguruma": "1.18.0", - "@shikijs/types": "1.18.0", - "@shikijs/vscode-textmate": "^9.2.2", + "@shikijs/engine-javascript": "1.22.0", + "@shikijs/engine-oniguruma": "1.22.0", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.3" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.18.0.tgz", - "integrity": "sha512-qoP/aO/ATNwYAUw1YMdaip/YVEstMZEgrwhePm83Ll9OeQPuxDZd48szZR8oSQNQBT8m8UlWxZv8EA3lFuyI5A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz", + "integrity": "sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==", "dependencies": { - "@shikijs/types": "1.18.0", - "@shikijs/vscode-textmate": "^9.2.2", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", "oniguruma-to-js": "0.4.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.18.0.tgz", - "integrity": "sha512-B9u0ZKI/cud+TcmF8Chyh+R4V5qQVvyDOqXC2l2a4x73PBSBc6sZ0JRAX3eqyJswqir6ktwApUUGBYePdKnMJg==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz", + "integrity": "sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==", "dependencies": { - "@shikijs/types": "1.18.0", - "@shikijs/vscode-textmate": "^9.2.2" + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0" } }, "node_modules/@shikijs/types": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.18.0.tgz", - "integrity": "sha512-O9N36UEaGGrxv1yUrN2nye7gDLG5Uq0/c1LyfmxsvzNPqlHzWo9DI0A4+fhW2y3bGKuQu/fwS7EPdKJJCowcVA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz", + "integrity": "sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==", "dependencies": { - "@shikijs/vscode-textmate": "^9.2.2", + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz", - "integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", + "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==" }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", @@ -1301,9 +1307,9 @@ } }, "node_modules/@types/node": { - "version": "22.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", - "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "dev": true, "dependencies": { "undici-types": "~6.19.2" @@ -1409,18 +1415,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1489,14 +1483,6 @@ "require-from-string": "^2.0.2" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -1539,6 +1525,12 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "peer": true + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1609,26 +1601,17 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/citeproc": { @@ -1726,6 +1709,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "peer": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2301,52 +2290,70 @@ } }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/esbuild-sass-plugin": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.16.1.tgz", - "integrity": "sha512-mBB2aEF0xk7yo+Q9pSUh8xYED/1O2wbAM6IauGkDrqy6pl9SbJNakLeLGXiNpNujWIudu8TJTZCv2L5AQYRXtA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-3.3.1.tgz", + "integrity": "sha512-SnO1ls+d52n6j8gRRpjexXI8MsHEaumS0IdDHaYM29Y6gakzZYMls6i9ql9+AWMSQk/eryndmUpXEgT34QrX1A==", "dependencies": { - "resolve": "^1.22.6", - "sass": "^1.7.3" + "resolve": "^1.22.8", + "safe-identifier": "^0.4.2", + "sass": "^1.71.1" }, "peerDependencies": { - "esbuild": "^0.19.4" + "esbuild": ">=0.20.1", + "sass-embedded": "^1.71.1" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/escalade": { @@ -2564,6 +2571,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -2692,6 +2700,15 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -3112,9 +3129,9 @@ } }, "node_modules/immutable": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz", - "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==" + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==" }, "node_modules/inline-style-parser": { "version": "0.2.2", @@ -3162,17 +3179,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -3371,9 +3377,9 @@ } }, "node_modules/lightningcss": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.26.0.tgz", - "integrity": "sha512-a/XZ5hdgifrofQJUArr5AiJjx26SwMam3SJUSMjgebZbESZ96i+6Qsl8tLi0kaUsdMzBWXh9sN1Oe6hp2/dkQw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", + "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", "dependencies": { "detect-libc": "^1.0.3" }, @@ -3385,22 +3391,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.26.0", - "lightningcss-darwin-x64": "1.26.0", - "lightningcss-freebsd-x64": "1.26.0", - "lightningcss-linux-arm-gnueabihf": "1.26.0", - "lightningcss-linux-arm64-gnu": "1.26.0", - "lightningcss-linux-arm64-musl": "1.26.0", - "lightningcss-linux-x64-gnu": "1.26.0", - "lightningcss-linux-x64-musl": "1.26.0", - "lightningcss-win32-arm64-msvc": "1.26.0", - "lightningcss-win32-x64-msvc": "1.26.0" + "lightningcss-darwin-arm64": "1.27.0", + "lightningcss-darwin-x64": "1.27.0", + "lightningcss-freebsd-x64": "1.27.0", + "lightningcss-linux-arm-gnueabihf": "1.27.0", + "lightningcss-linux-arm64-gnu": "1.27.0", + "lightningcss-linux-arm64-musl": "1.27.0", + "lightningcss-linux-x64-gnu": "1.27.0", + "lightningcss-linux-x64-musl": "1.27.0", + "lightningcss-win32-arm64-msvc": "1.27.0", + "lightningcss-win32-x64-msvc": "1.27.0" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.26.0.tgz", - "integrity": "sha512-n4TIvHO1NY1ondKFYpL2ZX0bcC2y6yjXMD6JfyizgR8BCFNEeArINDzEaeqlfX9bXz73Bpz/Ow0nu+1qiDrBKg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", + "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", "cpu": [ "arm64" ], @@ -3417,9 +3423,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.26.0.tgz", - "integrity": "sha512-Rf9HuHIDi1R6/zgBkJh25SiJHF+dm9axUZW/0UoYCW1/8HV0gMI0blARhH4z+REmWiU1yYT/KyNF3h7tHyRXUg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", + "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", "cpu": [ "x64" ], @@ -3436,9 +3442,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.26.0.tgz", - "integrity": "sha512-C/io7POAxp6sZxFSVGezjajMlCKQ8KSwISLLGRq8xLQpQMokYrUoqYEwmIX8mLmF6C/CZPk0gFmRSzd8biWM0g==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", + "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", "cpu": [ "x64" ], @@ -3455,9 +3461,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.26.0.tgz", - "integrity": "sha512-Aag9kqXqkyPSW+dXMgyWk66C984Nay2pY8Nws+67gHlDzV3cWh7TvFlzuaTaVFMVqdDTzN484LSK3u39zFBnzg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", + "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", "cpu": [ "arm" ], @@ -3474,9 +3480,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.26.0.tgz", - "integrity": "sha512-iJmZM7fUyVjH+POtdiCtExG+67TtPUTer7K/5A8DIfmPfrmeGvzfRyBltGhQz13Wi15K1lf2cPYoRaRh6vcwNA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", + "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", "cpu": [ "arm64" ], @@ -3493,9 +3499,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.26.0.tgz", - "integrity": "sha512-XxoEL++tTkyuvu+wq/QS8bwyTXZv2y5XYCMcWL45b8XwkiS8eEEEej9BkMGSRwxa5J4K+LDeIhLrS23CpQyfig==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", + "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", "cpu": [ "arm64" ], @@ -3512,9 +3518,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.26.0.tgz", - "integrity": "sha512-1dkTfZQAYLj8MUSkd6L/+TWTG8V6Kfrzfa0T1fSlXCXQHrt1HC1/UepXHtKHDt/9yFwyoeayivxXAsApVxn6zA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", + "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", "cpu": [ "x64" ], @@ -3531,9 +3537,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.26.0.tgz", - "integrity": "sha512-yX3Rk9m00JGCUzuUhFEojY+jf/6zHs3XU8S8Vk+FRbnr4St7cjyMXdNjuA2LjiT8e7j8xHRCH8hyZ4H/btRE4A==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", + "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", "cpu": [ "x64" ], @@ -3550,9 +3556,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.26.0.tgz", - "integrity": "sha512-X/597/cFnCogy9VItj/+7Tgu5VLbAtDF7KZDPdSw0MaL6FL940th1y3HiOzFIlziVvAtbo0RB3NAae1Oofr+Tw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", + "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", "cpu": [ "arm64" ], @@ -3569,9 +3575,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.26.0.tgz", - "integrity": "sha512-pYS3EyGP3JRhfqEFYmfFDiZ9/pVNfy8jVIYtrx9TVNusVyDK3gpW1w/rbvroQ4bDJi7grdUtyrYU6V2xkY/bBw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", + "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", "cpu": [ "x64" ], @@ -4735,14 +4741,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/oniguruma-to-js": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", @@ -4904,9 +4902,9 @@ } }, "node_modules/preact": { - "version": "10.24.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.1.tgz", - "integrity": "sha512-PnBAwFI3Yjxxcxw75n6VId/5TFxNW/81zexzWD9jn1+eSrOP84NdsS38H5IkF/UH3frqRPT+MvuCoVHjTDTnDw==", + "version": "10.24.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", + "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -5006,14 +5004,15 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", "engines": { - "node": ">=8.10.0" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/reading-time": { @@ -5022,9 +5021,9 @@ "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" }, "node_modules/regex": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.2.tgz", - "integrity": "sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==" + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", + "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==" }, "node_modules/rehype-autolink-headings": { "version": "7.1.0", @@ -5044,9 +5043,9 @@ } }, "node_modules/rehype-citation": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.1.1.tgz", - "integrity": "sha512-9aXDHR4pnR8Yyt6DFDXq2EKcxhwjf4HuF5kxvQDbhH8xfY5VjqJQNmIzpsXAn6YcmytOGWNf+82WnIroKAaLSw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.1.2.tgz", + "integrity": "sha512-n7jx9TqJLWX7MYYt+c6JRZtubUv+FNdoxbrtD0CL/0LCLeTxwvnbJOMJKVzCFNhDdDQ0uInRMK3EWuo6HZuSEQ==", "dependencies": { "@citation-js/core": "^0.7.14", "@citation-js/date": "^0.5.1", @@ -5531,17 +5530,31 @@ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==" + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.66.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", - "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", + "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", + "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -5552,6 +5565,369 @@ "node": ">=14.0.0" } }, + "node_modules/sass-embedded": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.4.tgz", + "integrity": "sha512-3AATrtStMgxYjkit02/Ix8vx/P7qderYG6DHjmehfk5jiw53OaWVScmcGJSwp/d77kAkxDQ+Y0r+79VynGmrkw==", + "peer": true, + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.79.4", + "sass-embedded-android-arm64": "1.79.4", + "sass-embedded-android-ia32": "1.79.4", + "sass-embedded-android-riscv64": "1.79.4", + "sass-embedded-android-x64": "1.79.4", + "sass-embedded-darwin-arm64": "1.79.4", + "sass-embedded-darwin-x64": "1.79.4", + "sass-embedded-linux-arm": "1.79.4", + "sass-embedded-linux-arm64": "1.79.4", + "sass-embedded-linux-ia32": "1.79.4", + "sass-embedded-linux-musl-arm": "1.79.4", + "sass-embedded-linux-musl-arm64": "1.79.4", + "sass-embedded-linux-musl-ia32": "1.79.4", + "sass-embedded-linux-musl-riscv64": "1.79.4", + "sass-embedded-linux-musl-x64": "1.79.4", + "sass-embedded-linux-riscv64": "1.79.4", + "sass-embedded-linux-x64": "1.79.4", + "sass-embedded-win32-arm64": "1.79.4", + "sass-embedded-win32-ia32": "1.79.4", + "sass-embedded-win32-x64": "1.79.4" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.4.tgz", + "integrity": "sha512-YOVpDGDcwWUQvktpJhYo4zOkknDpdX6ALpaeHDTX6GBUvnZfx+Widh76v+QFUhiJQ/I/hndXg1jv/PKilOHRrw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.4.tgz", + "integrity": "sha512-0JAZ8TtXYv9yI3Yasaq03xvo7DLJOmD+Exb30oJKxXcWTAV9TB0ZWKoIRsFxbCyPxyn7ouxkaCEXQtaTRKrmfw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-ia32": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.4.tgz", + "integrity": "sha512-IjO3RoyvNN84ZyfAR5s/a8TIdNPfClb7CLGrswB3BN/NElYIJUJMVHD6+Y8W9QwBIZ8DrK1IdLFSTV8nn82xMA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.4.tgz", + "integrity": "sha512-uOT8nXmKxSwuIdcqvElVWBFcm/+YcIvmwfoKbpuuSOSxUe9eqFzxo+fk7ILhynzf6FBlvRUH5DcjGj+sXtCc3w==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.4.tgz", + "integrity": "sha512-W2FQoj3Z2J2DirNs3xSBVvrhMuqLnsqvOPulxOkhL/074+faKOZZnPx2tZ5zsHbY97SonciiU0SV0mm98xI42w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.4.tgz", + "integrity": "sha512-pcYtbN1VUAAcfgyHeX8ySndDWGjIvcq6rldduktPbGGuAlEWFDfnwjTbv0hS945ggdzZ6TFnaFlLEDr0SjKzBA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.4.tgz", + "integrity": "sha512-ir8CFTfc4JLx/qCP8LK1/3pWv35nRyAQkUK7lBIKM6hWzztt64gcno9rZIk4SpHr7Z/Bp1IYWWRS4ZT+4HmsbA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.4.tgz", + "integrity": "sha512-H/XEE3rY7c+tY0qDaELjPjC6VheAhBo1tPJQ6UHoBEf8xrbT/RT3dWiIS8grp9Vk54RCn05BEB/+POaljvvKGA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.4.tgz", + "integrity": "sha512-XIVn2mCuA422SR2kmKjF6jhjMs1Vrt1DbZ/ktSp+eR0sU4ugu2htg45GajiUFSKKRj7Sc+cBdThq1zPPsDLf1w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-ia32": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.4.tgz", + "integrity": "sha512-3nqZxV4nuUTb1ahLexVl4hsnx1KKwiGdHEf1xHWTZai6fYFMcwyNPrHySCQzFHqb5xiqSpPzzrKjuDhF6+guuQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.4.tgz", + "integrity": "sha512-HnbU1DEiQdUayioNzxh2WlbTEgQRBPTgIIvof8J63QLmVItUqE7EkWYkSUy4RhO+8NsuN9wzGmGTzFBvTImU7g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.4.tgz", + "integrity": "sha512-C6qX06waPEfDgOHR8jXoYxl0EtIXOyBDyyonrLO3StRjWjGx7XMQj2hA/KXSsV+Hr71fBOsaViosqWXPzTbEiQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.4.tgz", + "integrity": "sha512-y5b0fdOPWyhj4c+mc88GvQiC5onRH1V0iNaWNjsiZ+L4hHje6T98nDLrCJn0fz5GQnXjyLCLZduMWbfV0QjHGg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.4.tgz", + "integrity": "sha512-G2M5ADMV9SqnkwpM0S+UzDz7xR2njCOhofku/sDMZABzAjQQWTsAykKoGmzlT98fTw2HbNhb6u74umf2WLhCfw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.4.tgz", + "integrity": "sha512-kQm8dCU3DXf7DtUGWYPiPs03KJYKvFeiZJHhSx993DCM8D2b0wCXWky0S0Z46gf1sEur0SN4Lvnt1WczTqxIBw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.4.tgz", + "integrity": "sha512-GaTI/mXYWYSzG5wxtM4H2cozLpATyh+4l+rO9FFKOL8e1sUOLAzTeRdU2nSBYCuRqsxRuTZIwCXhSz9Q3NRuNA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.4.tgz", + "integrity": "sha512-f9laGkqHgC01h99Qt4LsOV+OLMffjvUcTu14hYWqMS9QVX5a4ihMwpf1NoAtTUytb7cVF3rYY/NVGuXt6G3ppQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.4.tgz", + "integrity": "sha512-cidBvtaA2cJ6dNlwQEa8qak+ezypurzKs0h0QAHLH324+j/6Jum7LCnQhZRPYJBFjHl+WYd7KwzPnJ2X5USWnQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-ia32": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.4.tgz", + "integrity": "sha512-hexdmNTIZGTKNTzlMcdvEXzYuxOJcY89zqgsf45aQ2YMy4y2M8dTOxRI/Vz7p4iRxVp1Jow6LCtaLHrNI2Ordg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.4.tgz", + "integrity": "sha512-73yrpiWIbti6DkxhWURklkgSLYKfU9itDmvHxB+oYSb4vQveIApqTwSyTOuIUb/6Da/EsgEpdJ4Lbj4sLaMZWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -5630,15 +6006,15 @@ } }, "node_modules/shiki": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.18.0.tgz", - "integrity": "sha512-8jo7tOXr96h9PBQmOHVrltnETn1honZZY76YA79MHheGQg55jBvbm9dtU+MI5pjC5NJCFuA6rvVTLVeSW5cE4A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz", + "integrity": "sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==", "dependencies": { - "@shikijs/core": "1.18.0", - "@shikijs/engine-javascript": "1.18.0", - "@shikijs/engine-oniguruma": "1.18.0", - "@shikijs/types": "1.18.0", - "@shikijs/vscode-textmate": "^9.2.2", + "@shikijs/core": "1.22.0", + "@shikijs/engine-javascript": "1.22.0", + "@shikijs/engine-oniguruma": "1.22.0", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } }, @@ -5846,6 +6222,21 @@ "inline-style-parser": "0.2.2" } }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -6393,9 +6784,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -6606,6 +6997,12 @@ "requires-port": "^1.0.0" } }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "peer": true + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", diff --git a/package.json b/package.json index a5178735e..415fc68b6 100644 --- a/package.json +++ b/package.json @@ -41,10 +41,10 @@ "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", "chalk": "^5.3.0", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "cli-spinner": "^0.2.10", "d3": "^7.9.0", - "esbuild-sass-plugin": "^2.16.1", + "esbuild-sass-plugin": "^3.3.1", "flexsearch": "0.7.43", "github-slugger": "^2.0.0", "globby": "^14.0.2", @@ -54,19 +54,19 @@ "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", - "lightningcss": "^1.26.0", + "lightningcss": "^1.27.0", "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", "pixi.js": "^8.4.1", - "preact": "^10.24.1", + "preact": "^10.24.2", "preact-render-to-string": "^6.5.11", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", "rehype-autolink-headings": "^7.1.0", - "rehype-citation": "^2.1.1", + "rehype-citation": "^2.1.2", "rehype-katex": "^7.0.1", "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.14.0", @@ -83,7 +83,7 @@ "rfdc": "^1.4.1", "rimraf": "^6.0.1", "serve-handler": "^6.1.5", - "shiki": "^1.18.0", + "shiki": "^1.22.0", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -99,14 +99,14 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.7.4", + "@types/node": "^22.7.5", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.12", "@types/yargs": "^17.0.33", - "esbuild": "^0.19.9", + "esbuild": "^0.24.0", "prettier": "^3.3.3", "tsx": "^4.19.1", - "typescript": "^5.6.2" + "typescript": "^5.6.3" } } From 0d1f15d37cf3ceeb6465d7f102fc49bc33933450 Mon Sep 17 00:00:00 2001 From: Pierre Lairez Date: Thu, 10 Oct 2024 13:15:23 +0200 Subject: [PATCH 017/303] feat(ofm): Allow for dashes in custom callout label (#1493) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [OFM] Allow for dashes in custom callout label For compatibility with Obsidian's behavior, a custom callout like [!see-also] is possible. Previously, this was parsed by Quartz as a callout “see” with metadata “-also”. Instead, this is should be a callout “see-also” with title “See also” (capitalization + replace dashes by spaces). * prettier --- quartz/plugins/transformers/ofm.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index dd743b6d0..70dce6016 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -119,7 +119,7 @@ export const tableWikilinkRegex = new RegExp(/(!?\[\[[^\]]*?\]\])/g) const highlightRegex = new RegExp(/==([^=]+)==/g) const commentRegex = new RegExp(/%%[\s\S]*?%%/g) // from https://github.com/escwxyz/remark-obsidian-callout/blob/main/src/index.ts -const calloutRegex = new RegExp(/^\[\!(\w+)\|?(.+?)?\]([+-]?)/) +const calloutRegex = new RegExp(/^\[\!([\w-]+)\|?(.+?)?\]([+-]?)/) const calloutLineRegex = new RegExp(/^> *\[\!\w+\|?.*?\][+-]?.*$/gm) // (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line // #(...) -> capturing group, tag itself must start with # @@ -430,7 +430,9 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> children: [ { type: "text", - value: useDefaultTitle ? capitalize(typeString) : titleContent + " ", + value: useDefaultTitle + ? capitalize(typeString).replace(/-/g, " ") + : titleContent + " ", }, ...restOfTitle, ], From c5d97db0003b239abaf456f4152ab3864bca4424 Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Sat, 12 Oct 2024 18:33:07 -0400 Subject: [PATCH 018/303] fix(toc): invalid desktop-only styling (#1502) * fix(toc): invalid desktop-only styling should display none instead. * Update toc.scss --- quartz/components/styles/toc.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quartz/components/styles/toc.scss b/quartz/components/styles/toc.scss index 3b2b6b32a..5c5f5b830 100644 --- a/quartz/components/styles/toc.scss +++ b/quartz/components/styles/toc.scss @@ -1,8 +1,8 @@ .toc { display: flex; flex-direction: column; + &.desktop-only { - display: flex; max-height: 40%; } } From 3d0ba320708420e53f090642aae23d29d5a502be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sp=C3=A4ti?= Date: Sun, 13 Oct 2024 19:42:29 +0200 Subject: [PATCH 019/303] docs: Update Name and URL of Simon's SB and adding DE Vault (#1507) --- docs/showcase.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/showcase.md b/docs/showcase.md index c33b2aa5f..0cdf39dae 100644 --- a/docs/showcase.md +++ b/docs/showcase.md @@ -20,8 +20,9 @@ Want to see what Quartz can do? Here are some cool community gardens: - [Sideny's 3D Artist's Handbook](https://sidney-eliot.github.io/3d-artists-handbook/) - [Brandon Boswell's Garden](https://brandonkboswell.com) - [Scaling Synthesis - A hypertext research notebook](https://scalingsynthesis.com/) +- [Simon's Second Brain: Crafted, Curated, Connected, Compounded](https://brain.ssp.sh/) +- [Data Engineering Vault: A Second Brain Knowledge Network](https://vault.ssp.sh/) - [Data Dictionary 🧠](https://glossary.airbyte.com/) -- [sspaeti.com's Second Brain](https://brain.sspaeti.com/) - [🪴Aster's notebook](https://notes.asterhu.com) - [Gatekeeper Wiki](https://www.gatekeeper.wiki) - [Ellie's Notes](https://ellie.wtf) From 1dc208356abdcf8d3c0e826fd2184624298dd771 Mon Sep 17 00:00:00 2001 From: Sohum <31165513+ssmendon@users.noreply.github.com> Date: Sun, 13 Oct 2024 10:46:51 -0700 Subject: [PATCH 020/303] fix(cli): use shell on win32 for `update` (#1503) (#1504) If there is no `npm.exe` on the system, but instead an `npm.cmd`, then node won't find the `npm` executable when calling `spawnSync`. This occurs frequently when using node package managers on Windows. See the node documentation for `.bat` and `.cmd` files here. . --- quartz/cli/handlers.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/quartz/cli/handlers.js b/quartz/cli/handlers.js index 12e7e8ec9..ed1c0e21c 100644 --- a/quartz/cli/handlers.js +++ b/quartz/cli/handlers.js @@ -457,7 +457,25 @@ export async function handleUpdate(argv) { await popContentFolder(contentFolder) console.log("Ensuring dependencies are up to date") - const res = spawnSync("npm", ["i"], { stdio: "inherit" }) + + /* + On Windows, if the command `npm` is really `npm.cmd', this call fails + as it will be unable to find `npm`. This is often the case on systems + where `npm` is installed via a package manager. + + This means `npx quartz update` will not actually update dependencies + on Windows, without a manual `npm i` from the caller. + + However, by spawning a shell, we are able to call `npm.cmd`. + See: https://nodejs.org/api/child_process.html#spawning-bat-and-cmd-files-on-windows + */ + + const opts = { stdio: "inherit" } + if (process.platform === "win32") { + opts.shell = true + } + + const res = spawnSync("npm", ["i"], opts) if (res.status === 0) { console.log(chalk.green("Done!")) } else { From b3a02909ba74fff08cd3675707d1f4d782a24e98 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 15 Oct 2024 09:34:46 -0700 Subject: [PATCH 021/303] fix: make filter checks more strict (closes #1519) --- quartz/plugins/filters/draft.ts | 2 +- quartz/plugins/filters/explicit.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/quartz/plugins/filters/draft.ts b/quartz/plugins/filters/draft.ts index 5fd06b965..09a3c3a84 100644 --- a/quartz/plugins/filters/draft.ts +++ b/quartz/plugins/filters/draft.ts @@ -3,7 +3,7 @@ import { QuartzFilterPlugin } from "../types" export const RemoveDrafts: QuartzFilterPlugin<{}> = () => ({ name: "RemoveDrafts", shouldPublish(_ctx, [_tree, vfile]) { - const draftFlag: boolean = vfile.data?.frontmatter?.draft || false + const draftFlag: boolean = vfile.data?.frontmatter?.draft === true return !draftFlag }, }) diff --git a/quartz/plugins/filters/explicit.ts b/quartz/plugins/filters/explicit.ts index 79a46a81c..603b46d6b 100644 --- a/quartz/plugins/filters/explicit.ts +++ b/quartz/plugins/filters/explicit.ts @@ -3,6 +3,6 @@ import { QuartzFilterPlugin } from "../types" export const ExplicitPublish: QuartzFilterPlugin = () => ({ name: "ExplicitPublish", shouldPublish(_ctx, [_tree, vfile]) { - return vfile.data?.frontmatter?.publish ?? false + return vfile.data?.frontmatter?.publish === true }, }) From 3aa11357aa34c1a43765f10965b1b2befa145133 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Wed, 16 Oct 2024 23:44:30 +0200 Subject: [PATCH 022/303] fix(toc): regression (#1517) --- quartz/components/styles/toc.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/quartz/components/styles/toc.scss b/quartz/components/styles/toc.scss index 5c5f5b830..4988cd836 100644 --- a/quartz/components/styles/toc.scss +++ b/quartz/components/styles/toc.scss @@ -1,3 +1,5 @@ +@use "../../styles/variables.scss" as *; + .toc { display: flex; flex-direction: column; @@ -7,6 +9,12 @@ } } +@media all and not ($mobile) { + .toc { + display: flex; + } +} + button#toc { background-color: transparent; border: none; From 67e1beea7052ea515d47b881d4a30fa3ed847b0b Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Fri, 18 Oct 2024 00:30:16 +0200 Subject: [PATCH 023/303] feat(comments): support custom giscus themes (#1526) Co-authored-by: Aaron Pham Co-authored-by: Aaron Pham --- docs/features/comments.md | 33 +++++++ quartz/components/Comments.tsx | 8 ++ quartz/components/scripts/comments.inline.ts | 28 +++++- quartz/static/giscus/dark.css | 99 ++++++++++++++++++++ quartz/static/giscus/light.css | 99 ++++++++++++++++++++ 5 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 quartz/static/giscus/dark.css create mode 100644 quartz/static/giscus/light.css diff --git a/docs/features/comments.md b/docs/features/comments.md index 92ea754b1..1f11effc4 100644 --- a/docs/features/comments.md +++ b/docs/features/comments.md @@ -63,6 +63,18 @@ type Options = { category: string categoryId: string + // Url to folder with custom themes + // defaults to 'https://${cfg.baseUrl}/static/giscus' + themeUrl?: string + + // filename for light theme .css file + // defaults to 'light' + lightTheme?: string + + // filename for dark theme .css file + // defaults to 'dark' + darkTheme?: string + // how to map pages -> discussions // defaults to 'url' mapping?: "url" | "title" | "og:title" | "specific" | "number" | "pathname" @@ -81,3 +93,24 @@ type Options = { } } ``` + +#### Custom CSS theme + +Quartz supports custom theme for Giscus. To use a custom CSS theme, place the `.css` file inside the `quartz/static` folder and set the configuration values. + +For example, if you have a light theme `light-theme.css`, a dark theme `dark-theme.css`, and your Quartz site is hosted at `https://example.com/`: + +```ts +afterBody: [ + Component.Comments({ + provider: 'giscus', + options: { + // Other options + + themeUrl: "https://example.com/static/giscus", // corresponds to quartz/static/giscus/ + lightTheme: "light-theme", // corresponds to light-theme.css in quartz/static/giscus/ + darkTheme: "dark-theme", // corresponds to dark-theme.css quartz/static/giscus/ + } + }), +], +``` diff --git a/quartz/components/Comments.tsx b/quartz/components/Comments.tsx index 8e4494026..44331cc90 100644 --- a/quartz/components/Comments.tsx +++ b/quartz/components/Comments.tsx @@ -10,6 +10,9 @@ type Options = { repoId: string category: string categoryId: string + themeUrl?: string + lightTheme?: string + darkTheme?: string mapping?: "url" | "title" | "og:title" | "specific" | "number" | "pathname" strict?: boolean reactionsEnabled?: boolean @@ -34,6 +37,11 @@ export default ((opts: Options) => { data-strict={boolToStringBool(opts.options.strict ?? true)} data-reactions-enabled={boolToStringBool(opts.options.reactionsEnabled ?? true)} data-input-position={opts.options.inputPosition ?? "bottom"} + data-light-theme={opts.options.lightTheme ?? "light"} + data-dark-theme={opts.options.darkTheme ?? "dark"} + data-theme-url={ + opts.options.themeUrl ?? `https://${cfg.baseUrl ?? "example.com"}/static/giscus` + } > ) } diff --git a/quartz/components/scripts/comments.inline.ts b/quartz/components/scripts/comments.inline.ts index 4ab29f087..c54230fbe 100644 --- a/quartz/components/scripts/comments.inline.ts +++ b/quartz/components/scripts/comments.inline.ts @@ -13,7 +13,7 @@ const changeTheme = (e: CustomEventMap["themechange"]) => { { giscus: { setConfig: { - theme: theme, + theme: getThemeUrl(getThemeName(theme)), }, }, }, @@ -21,12 +21,36 @@ const changeTheme = (e: CustomEventMap["themechange"]) => { ) } +const getThemeName = (theme: string) => { + if (theme !== "dark" && theme !== "light") { + return theme + } + const giscusContainer = document.querySelector(".giscus") as GiscusElement + if (!giscusContainer) { + return theme + } + const darkGiscus = giscusContainer.dataset.darkTheme ?? "dark" + const lightGiscus = giscusContainer.dataset.lightTheme ?? "light" + return theme === "dark" ? darkGiscus : lightGiscus +} + +const getThemeUrl = (theme: string) => { + const giscusContainer = document.querySelector(".giscus") as GiscusElement + if (!giscusContainer) { + return `https://giscus.app/themes/${theme}.css` + } + return `${giscusContainer.dataset.themeUrl ?? "https://giscus.app/themes"}/${theme}.css` +} + type GiscusElement = Omit & { dataset: DOMStringMap & { repo: `${string}/${string}` repoId: string category: string categoryId: string + themeUrl: string + lightTheme: string + darkTheme: string mapping: "url" | "title" | "og:title" | "specific" | "number" | "pathname" strict: string reactionsEnabled: string @@ -57,7 +81,7 @@ document.addEventListener("nav", () => { const theme = document.documentElement.getAttribute("saved-theme") if (theme) { - giscusScript.setAttribute("data-theme", theme) + giscusScript.setAttribute("data-theme", getThemeUrl(getThemeName(theme))) } giscusContainer.appendChild(giscusScript) diff --git a/quartz/static/giscus/dark.css b/quartz/static/giscus/dark.css new file mode 100644 index 000000000..e98088f4d --- /dev/null +++ b/quartz/static/giscus/dark.css @@ -0,0 +1,99 @@ +/*! MIT License + * Copyright (c) 2018 GitHub Inc. + * https://github.com/primer/primitives/blob/main/LICENSE + */ + +main { + --color-prettylights-syntax-comment: #8b949e; + --color-prettylights-syntax-constant: #79c0ff; + --color-prettylights-syntax-entity: #d2a8ff; + --color-prettylights-syntax-storage-modifier-import: #c9d1d9; + --color-prettylights-syntax-entity-tag: #7ee787; + --color-prettylights-syntax-keyword: #ff7b72; + --color-prettylights-syntax-string: #a5d6ff; + --color-prettylights-syntax-variable: #ffa657; + --color-prettylights-syntax-brackethighlighter-unmatched: #f85149; + --color-prettylights-syntax-invalid-illegal-text: #f0f6fc; + --color-prettylights-syntax-invalid-illegal-bg: #8e1519; + --color-prettylights-syntax-carriage-return-text: #f0f6fc; + --color-prettylights-syntax-carriage-return-bg: #b62324; + --color-prettylights-syntax-string-regexp: #7ee787; + --color-prettylights-syntax-markup-list: #f2cc60; + --color-prettylights-syntax-markup-heading: #1f6feb; + --color-prettylights-syntax-markup-italic: #c9d1d9; + --color-prettylights-syntax-markup-bold: #c9d1d9; + --color-prettylights-syntax-markup-deleted-text: #ffdcd7; + --color-prettylights-syntax-markup-deleted-bg: #67060c; + --color-prettylights-syntax-markup-inserted-text: #aff5b4; + --color-prettylights-syntax-markup-inserted-bg: #033a16; + --color-prettylights-syntax-markup-changed-text: #ffdfb6; + --color-prettylights-syntax-markup-changed-bg: #5a1e02; + --color-prettylights-syntax-markup-ignored-text: #c9d1d9; + --color-prettylights-syntax-markup-ignored-bg: #1158c7; + --color-prettylights-syntax-meta-diff-range: #d2a8ff; + --color-prettylights-syntax-brackethighlighter-angle: #8b949e; + --color-prettylights-syntax-sublimelinter-gutter-mark: #484f58; + --color-prettylights-syntax-constant-other-reference-link: #a5d6ff; + --color-btn-text: #d4d4d4; /* --darkgray */ + --color-btn-bg: #161618; /* --light */ + --color-btn-border: rgb(240, 246, 252 / 10%); /* --dark */ + --color-btn-shadow: 0 0 transparent; + --color-btn-inset-shadow: 0 0 transparent; + --color-btn-hover-bg: #30363d; + --color-btn-hover-border: #8b949e; + --color-btn-active-bg: hsl(212deg 12% 18% / 100%); + --color-btn-active-border: #6e7681; + --color-btn-selected-bg: #161b22; + --color-btn-primary-text: #fff; + --color-btn-primary-bg: #84a59d; /* --tertiary */ + --color-btn-primary-border: rgb(240, 246, 252 / 10%); /* --dark */ + --color-btn-primary-shadow: 0 0 transparent; + --color-btn-primary-inset-shadow: 0 0 transparent; + --color-btn-primary-hover-bg: #7b97aa; /* --secondary */ + --color-btn-primary-hover-border: rgb(240, 246, 252 / 10%); /* --dark */ + --color-btn-primary-selected-bg: #7b97aa; /* --secondary */ + --color-btn-primary-selected-shadow: 0 0 transparent; + --color-btn-primary-disabled-text: rgba(33, 32, 32, 0.5); + --color-btn-primary-disabled-bg: rgb(35 134 54 / 60%); + --color-btn-primary-disabled-border: rgb(240 246 252 / 10%); + --color-action-list-item-default-hover-bg: rgb(177 186 196 / 12%); + --color-segmented-control-bg: rgb(110 118 129 / 10%); + --color-segmented-control-button-bg: #0d1117; + --color-segmented-control-button-selected-border: #6e7681; + --color-fg-default: #ebebec; /* --dark */ + --color-fg-muted: #d4d4d4; /* --darkgray */ + --color-fg-subtle: #d4d4d4; /* --darkgray */ + --color-canvas-default: #0d1117; + --color-canvas-overlay: #161b22; + --color-canvas-inset: #010409; + --color-canvas-subtle: #161b22; + --color-border-default: #30363d; + --color-border-muted: #21262d; + --color-neutral-muted: rgb(110 118 129 / 40%); + --color-accent-fg: #2f81f7; + --color-accent-emphasis: #1f6feb; + --color-accent-muted: rgb(56 139 253 / 40%); + --color-accent-subtle: rgb(56 139 253 / 10%); + --color-success-fg: #3fb950; + --color-attention-fg: #d29922; + --color-attention-muted: rgb(187 128 9 / 40%); + --color-attention-subtle: rgb(187 128 9 / 15%); + --color-danger-fg: #f85149; + --color-danger-muted: rgb(248 81 73 / 40%); + --color-danger-subtle: rgb(248 81 73 / 10%); + --color-primer-shadow-inset: 0 0 transparent; + --color-scale-gray-7: #21262d; + --color-scale-blue-8: #0c2d6b; + + /*! Extensions from @primer/css/alerts/flash.scss */ + --color-social-reaction-bg-hover: var(--color-scale-gray-7); + --color-social-reaction-bg-reacted-hover: var(--color-scale-blue-8); +} + +main .pagination-loader-container { + background-image: url("https://github.com/images/modules/pulls/progressive-disclosure-line-dark.svg"); +} + +main .gsc-loading-image { + background-image: url("https://github.githubassets.com/images/mona-loading-dark.gif"); +} diff --git a/quartz/static/giscus/light.css b/quartz/static/giscus/light.css new file mode 100644 index 000000000..84b58c0a7 --- /dev/null +++ b/quartz/static/giscus/light.css @@ -0,0 +1,99 @@ +/*! MIT License + * Copyright (c) 2018 GitHub Inc. + * https://github.com/primer/primitives/blob/main/LICENSE + */ + +main { + --color-prettylights-syntax-comment: #6e7781; + --color-prettylights-syntax-constant: #0550ae; + --color-prettylights-syntax-entity: #8250df; + --color-prettylights-syntax-storage-modifier-import: #24292f; + --color-prettylights-syntax-entity-tag: #116329; + --color-prettylights-syntax-keyword: #cf222e; + --color-prettylights-syntax-string: #0a3069; + --color-prettylights-syntax-variable: #953800; + --color-prettylights-syntax-brackethighlighter-unmatched: #82071e; + --color-prettylights-syntax-invalid-illegal-text: #f6f8fa; + --color-prettylights-syntax-invalid-illegal-bg: #82071e; + --color-prettylights-syntax-carriage-return-text: #f6f8fa; + --color-prettylights-syntax-carriage-return-bg: #cf222e; + --color-prettylights-syntax-string-regexp: #116329; + --color-prettylights-syntax-markup-list: #3b2300; + --color-prettylights-syntax-markup-heading: #0550ae; + --color-prettylights-syntax-markup-italic: #24292f; + --color-prettylights-syntax-markup-bold: #24292f; + --color-prettylights-syntax-markup-deleted-text: #82071e; + --color-prettylights-syntax-markup-deleted-bg: #ffebe9; + --color-prettylights-syntax-markup-inserted-text: #116329; + --color-prettylights-syntax-markup-inserted-bg: #dafbe1; + --color-prettylights-syntax-markup-changed-text: #953800; + --color-prettylights-syntax-markup-changed-bg: #ffd8b5; + --color-prettylights-syntax-markup-ignored-text: #eaeef2; + --color-prettylights-syntax-markup-ignored-bg: #0550ae; + --color-prettylights-syntax-meta-diff-range: #8250df; + --color-prettylights-syntax-brackethighlighter-angle: #57606a; + --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f; + --color-prettylights-syntax-constant-other-reference-link: #0a3069; + --color-btn-text: #4e4e4e; /* --darkgray */ + --color-btn-bg: #faf8f8; /* --light */ + --color-btn-border: rgb(43, 43, 43 / 15%); /* --dark */ + --color-btn-shadow: 0 1px 0 rgb(31 35 40 / 4%); + --color-btn-inset-shadow: inset 0 1px 0 rgb(255 255 255 / 25%); + --color-btn-hover-bg: #f3f4f6; + --color-btn-hover-border: rgb(43, 43, 43 / 15%); /* --dark */ + --color-btn-active-bg: hsl(220deg 14% 93% / 100%); + --color-btn-active-border: rgb(31 35 40 / 15%); + --color-btn-selected-bg: hsl(220deg 14% 94% / 100%); + --color-btn-primary-text: #fff; + --color-btn-primary-bg: #84a59d; /* --tertiary */ + --color-btn-primary-border: rgb(43, 43, 43 / 15%); /* --dark */ + --color-btn-primary-shadow: 0 1px 0 rgb(31 35 40 / 10%); + --color-btn-primary-inset-shadow: inset 0 1px 0 rgb(255 255 255 / 3%); + --color-btn-primary-hover-bg: #284b63; /* --secondary */ + --color-btn-primary-hover-border: rgb(43, 43, 43 / 15%); /* --dark */ + --color-btn-primary-selected-bg: #284b63; /* --secondary */ + --color-btn-primary-selected-shadow: inset 0 1px 0 rgb(0 45 17 / 20%); + --color-btn-primary-disabled-text: rgb(255 255 255 / 80%); + --color-btn-primary-disabled-bg: #94d3a2; + --color-btn-primary-disabled-border: rgb(31 35 40 / 15%); + --color-action-list-item-default-hover-bg: rgb(208 215 222 / 32%); + --color-segmented-control-bg: #eaeef2; + --color-segmented-control-button-bg: #fff; + --color-segmented-control-button-selected-border: #8c959f; + --color-fg-default: #2b2b2b; /* --dark */ + --color-fg-muted: #4e4e4e; /* --darkgray */ + --color-fg-subtle: #4e4e4e; /* --darkgray */ + --color-canvas-default: #fff; + --color-canvas-overlay: #fff; + --color-canvas-inset: #f6f8fa; + --color-canvas-subtle: #f6f8fa; + --color-border-default: #d0d7de; + --color-border-muted: hsl(210deg 18% 87% / 100%); + --color-neutral-muted: rgb(175 184 193 / 20%); + --color-accent-fg: #0969da; + --color-accent-emphasis: #0969da; + --color-accent-muted: rgb(84 174 255 / 40%); + --color-accent-subtle: #ddf4ff; + --color-success-fg: #1a7f37; + --color-attention-fg: #9a6700; + --color-attention-muted: rgb(212 167 44 / 40%); + --color-attention-subtle: #fff8c5; + --color-danger-fg: #d1242f; + --color-danger-muted: rgb(255 129 130 / 40%); + --color-danger-subtle: #ffebe9; + --color-primer-shadow-inset: inset 0 1px 0 rgb(208 215 222 / 20%); + --color-scale-gray-1: #eaeef2; + --color-scale-blue-1: #b6e3ff; + + /*! Extensions from @primer/css/alerts/flash.scss */ + --color-social-reaction-bg-hover: var(--color-scale-gray-1); + --color-social-reaction-bg-reacted-hover: var(--color-scale-blue-1); +} + +main .pagination-loader-container { + background-image: url("https://github.com/images/modules/pulls/progressive-disclosure-line.svg"); +} + +main .gsc-loading-image { + background-image: url("https://github.githubassets.com/images/mona-loading-default.gif"); +} From 9f701e5045c27a0d5733ecbcd67a6fc682921c28 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Fri, 18 Oct 2024 05:50:48 +0200 Subject: [PATCH 024/303] fix(grid): $desktop variable (#1511) --- quartz/components/styles/backlinks.scss | 2 +- quartz/components/styles/graph.scss | 2 +- quartz/components/styles/search.scss | 2 +- quartz/styles/base.scss | 9 +++++---- quartz/styles/variables.scss | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/quartz/components/styles/backlinks.scss b/quartz/components/styles/backlinks.scss index dc82ce74a..7b3237b8a 100644 --- a/quartz/components/styles/backlinks.scss +++ b/quartz/components/styles/backlinks.scss @@ -37,7 +37,7 @@ display: none; } height: auto; - @media all and ($desktop) { + @media all and not ($desktop) { height: 250px; } } diff --git a/quartz/components/styles/graph.scss b/quartz/components/styles/graph.scss index 1f4aa9710..1b19f132c 100644 --- a/quartz/components/styles/graph.scss +++ b/quartz/components/styles/graph.scss @@ -65,7 +65,7 @@ height: 80vh; width: 80vw; - @media all and ($desktop) { + @media all and not ($desktop) { width: 90%; } } diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss index b0df6c8b3..080178fbe 100644 --- a/quartz/components/styles/search.scss +++ b/quartz/components/styles/search.scss @@ -64,7 +64,7 @@ margin-left: auto; margin-right: auto; - @media all and ($desktop) { + @media all and not ($desktop) { width: 90%; } diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 61c918f42..34d7e40fa 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -156,7 +156,7 @@ a { column-gap: #{map-get($desktopGrid, columnGap)}; row-gap: #{map-get($desktopGrid, rowGap)}; grid-template-areas: #{map-get($desktopGrid, templateAreas)}; - @media all and ($desktop) { + @media all and ($tablet) { grid-template-columns: #{map-get($tabletGrid, templateColumns)}; grid-template-rows: #{map-get($tabletGrid, templateRows)}; column-gap: #{map-get($tabletGrid, columnGap)}; @@ -171,7 +171,7 @@ a { grid-template-areas: #{map-get($mobileGrid, templateAreas)}; } - @media all and ($desktop) { + @media all and not ($desktop) { padding: 0 1rem; } @media all and ($mobile) { @@ -212,7 +212,7 @@ a { margin-left: inherit; margin-right: inherit; } - @media all and ($desktop) { + @media all and not ($desktop) { position: initial; height: unset; width: 100%; @@ -254,10 +254,11 @@ a { min-width: 100%; margin-left: auto; margin-right: auto; - @media all and ($desktop) { + @media all and ($tablet) { margin-right: 0; } @media all and ($mobile) { + margin-right: 0; margin-left: 0; } } diff --git a/quartz/styles/variables.scss b/quartz/styles/variables.scss index 9335e5506..4a5cea583 100644 --- a/quartz/styles/variables.scss +++ b/quartz/styles/variables.scss @@ -12,7 +12,7 @@ $breakpoints: ( $mobile: "(max-width: #{map-get($breakpoints, mobile)})"; $tablet: "(min-width: #{map-get($breakpoints, mobile)}) and (max-width: #{map-get($breakpoints, desktop)})"; -$desktop: "(max-width: #{map-get($breakpoints, desktop)})"; +$desktop: "(min-width: #{map-get($breakpoints, desktop)})"; $pageWidth: #{map-get($breakpoints, mobile)}; $sidePanelWidth: 320px; //380px; From ad52d095670f2a08a330d1d4ee5ed4bc784e65aa Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Tue, 22 Oct 2024 20:33:54 +0000 Subject: [PATCH 025/303] Feat(filters): Support "true" as valid for draft and publish frontmatter values (b3a02909ba74fff08cd3675707d1f4d782a24e98) --- quartz/plugins/filters/draft.ts | 3 ++- quartz/plugins/filters/explicit.ts | 2 +- quartz/plugins/transformers/frontmatter.ts | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/quartz/plugins/filters/draft.ts b/quartz/plugins/filters/draft.ts index 09a3c3a84..e8f1d4eea 100644 --- a/quartz/plugins/filters/draft.ts +++ b/quartz/plugins/filters/draft.ts @@ -3,7 +3,8 @@ import { QuartzFilterPlugin } from "../types" export const RemoveDrafts: QuartzFilterPlugin<{}> = () => ({ name: "RemoveDrafts", shouldPublish(_ctx, [_tree, vfile]) { - const draftFlag: boolean = vfile.data?.frontmatter?.draft === true + const draftFlag: boolean = + vfile.data?.frontmatter?.draft === true || vfile.data?.frontmatter?.draft === "true" return !draftFlag }, }) diff --git a/quartz/plugins/filters/explicit.ts b/quartz/plugins/filters/explicit.ts index 603b46d6b..e2558e827 100644 --- a/quartz/plugins/filters/explicit.ts +++ b/quartz/plugins/filters/explicit.ts @@ -3,6 +3,6 @@ import { QuartzFilterPlugin } from "../types" export const ExplicitPublish: QuartzFilterPlugin = () => ({ name: "ExplicitPublish", shouldPublish(_ctx, [_tree, vfile]) { - return vfile.data?.frontmatter?.publish === true + return vfile.data?.frontmatter?.publish === true || vfile.data?.frontmatter?.publish === "true" }, }) diff --git a/quartz/plugins/transformers/frontmatter.ts b/quartz/plugins/transformers/frontmatter.ts index 70a60d8b5..2e599aa0e 100644 --- a/quartz/plugins/transformers/frontmatter.ts +++ b/quartz/plugins/transformers/frontmatter.ts @@ -88,8 +88,8 @@ declare module "vfile" { tags: string[] aliases: string[] description: string - publish: boolean - draft: boolean + publish: boolean | string + draft: boolean | string lang: string enableToc: string cssclasses: string[] From 3ef2a24f4b976021ddef5936e81fa48f2efa7177 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:54:41 -0400 Subject: [PATCH 026/303] chore(deps): bump the production-dependencies group across 1 directory with 7 updates (#1540) --- package-lock.json | 78 +++++++++++++++++++---------------------------- package.json | 14 ++++----- 2 files changed, 39 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1898a462a..18349a5eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "globby": "^14.0.2", "gray-matter": "^4.0.3", "hast-util-to-html": "^9.0.3", - "hast-util-to-jsx-runtime": "^2.3.0", + "hast-util-to-jsx-runtime": "^2.3.2", "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", @@ -33,14 +33,14 @@ "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", - "pixi.js": "^8.4.1", - "preact": "^10.24.2", + "pixi.js": "^8.5.1", + "preact": "^10.24.3", "preact-render-to-string": "^6.5.11", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", "rehype-autolink-headings": "^7.1.0", - "rehype-citation": "^2.1.2", + "rehype-citation": "^2.2.0", "rehype-katex": "^7.0.1", "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.14.0", @@ -56,7 +56,7 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", - "serve-handler": "^6.1.5", + "serve-handler": "^6.1.6", "shiki": "^1.22.0", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", @@ -64,7 +64,7 @@ "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3", - "workerpool": "^9.1.3", + "workerpool": "^9.2.0", "ws": "^8.18.0", "yargs": "^17.7.2" }, @@ -76,7 +76,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.7.5", + "@types/node": "^22.7.7", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.12", @@ -1307,9 +1307,9 @@ } }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "22.7.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz", + "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==", "dev": true, "dependencies": { "undici-types": "~6.19.2" @@ -2441,14 +2441,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -2913,9 +2905,9 @@ "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", + "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -4854,9 +4846,9 @@ } }, "node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" }, "node_modules/path-type": { "version": "5.0.0", @@ -4886,9 +4878,9 @@ } }, "node_modules/pixi.js": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.4.1.tgz", - "integrity": "sha512-3ZbEIkLYYi602UB5wuN7kPz3VsGHoJa6nxD8ustvMLRySxHAR9Z8tCAYY8ISgNplpPbaDw03B0yTD4/k9f6cAQ==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.5.1.tgz", + "integrity": "sha512-yYj8tWehUfH7or/34gf17XyZGnyjiG8toMH8oy9gP+4GjLK+/WjFLlRqaP0AECB8XGF8AJxgkS5y2aMDHqx11A==", "dependencies": { "@pixi/colord": "^2.9.6", "@types/css-font-loading-module": "^0.0.12", @@ -4902,9 +4894,9 @@ } }, "node_modules/preact": { - "version": "10.24.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", - "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==", + "version": "10.24.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", + "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -4966,11 +4958,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -5043,9 +5030,9 @@ } }, "node_modules/rehype-citation": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.1.2.tgz", - "integrity": "sha512-n7jx9TqJLWX7MYYt+c6JRZtubUv+FNdoxbrtD0CL/0LCLeTxwvnbJOMJKVzCFNhDdDQ0uInRMK3EWuo6HZuSEQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.2.0.tgz", + "integrity": "sha512-alEc/TxDqyALcHt9/MXUBjrCLl+It3q3gqkX0gGv6k3nyJm7CUAOOYxuywWyu6Cljf8DZFCJ9u+oVV/nRgRyYQ==", "dependencies": { "@citation-js/core": "^0.7.14", "@citation-js/date": "^0.5.1", @@ -5952,17 +5939,16 @@ } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, @@ -7143,9 +7129,9 @@ "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==" }, "node_modules/workerpool": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.1.3.tgz", - "integrity": "sha512-LhUrk4tbxJRDQmRrrFWA9EnboXI79fe0ZNTy3u8m+dqPN1EkVSIsQYAB8OF/fkyhG8Rtup+c/bzj/+bzbG8fqg==" + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.2.0.tgz", + "integrity": "sha512-PKZqBOCo6CYkVOwAxWxQaSF2Fvb5Iv2fCeTP7buyWI2GiynWr46NcXSgK/idoV6e60dgCBfgYc+Un3HMvmqP8w==" }, "node_modules/wrap-ansi": { "version": "8.1.0", diff --git a/package.json b/package.json index 415fc68b6..9423e09db 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "globby": "^14.0.2", "gray-matter": "^4.0.3", "hast-util-to-html": "^9.0.3", - "hast-util-to-jsx-runtime": "^2.3.0", + "hast-util-to-jsx-runtime": "^2.3.2", "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", @@ -59,14 +59,14 @@ "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", - "pixi.js": "^8.4.1", - "preact": "^10.24.2", + "pixi.js": "^8.5.1", + "preact": "^10.24.3", "preact-render-to-string": "^6.5.11", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", "rehype-autolink-headings": "^7.1.0", - "rehype-citation": "^2.1.2", + "rehype-citation": "^2.2.0", "rehype-katex": "^7.0.1", "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.14.0", @@ -82,7 +82,7 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", - "serve-handler": "^6.1.5", + "serve-handler": "^6.1.6", "shiki": "^1.22.0", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", @@ -90,7 +90,7 @@ "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3", - "workerpool": "^9.1.3", + "workerpool": "^9.2.0", "ws": "^8.18.0", "yargs": "^17.7.2" }, @@ -99,7 +99,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.7.5", + "@types/node": "^22.7.7", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.12", From 1d2dc167f4397e230092cc867889a86734343cfc Mon Sep 17 00:00:00 2001 From: Thomas Hack <39602241+tha00@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:52:33 +0200 Subject: [PATCH 027/303] feat(folder): add intermediate folders pages (#1295) Co-authored-by: Aaron Pham Co-authored-by: Aaron Pham --- quartz/components/pages/FolderContent.tsx | 46 ++++++++++++++++++++--- quartz/plugins/emitters/folderPage.tsx | 22 ++++++++--- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/quartz/components/pages/FolderContent.tsx b/quartz/components/pages/FolderContent.tsx index dc216cde7..7a49d494f 100644 --- a/quartz/components/pages/FolderContent.tsx +++ b/quartz/components/pages/FolderContent.tsx @@ -2,22 +2,25 @@ import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } fro import path from "path" import style from "../styles/listPage.scss" -import { PageList, SortFn } from "../PageList" -import { stripSlashes, simplifySlug } from "../../util/path" +import { byDateAndAlphabetical, PageList, SortFn } from "../PageList" +import { stripSlashes, simplifySlug, joinSegments, FullSlug } from "../../util/path" import { Root } from "hast" import { htmlToJsx } from "../../util/jsx" import { i18n } from "../../i18n" +import { QuartzPluginData } from "../../plugins/vfile" interface FolderContentOptions { /** * Whether to display number of folders */ showFolderCount: boolean + showSubfolders: boolean sort?: SortFn } const defaultOptions: FolderContentOptions = { showFolderCount: true, + showSubfolders: true, } export default ((opts?: Partial) => { @@ -26,14 +29,47 @@ export default ((opts?: Partial) => { const FolderContent: QuartzComponent = (props: QuartzComponentProps) => { const { tree, fileData, allFiles, cfg } = props const folderSlug = stripSlashes(simplifySlug(fileData.slug!)) - const allPagesInFolder = allFiles.filter((file) => { + const folderParts = folderSlug.split(path.posix.sep) + + const allPagesInFolder: QuartzPluginData[] = [] + const allPagesInSubfolders: Map = new Map() + + allFiles.forEach((file) => { const fileSlug = stripSlashes(simplifySlug(file.slug!)) const prefixed = fileSlug.startsWith(folderSlug) && fileSlug !== folderSlug - const folderParts = folderSlug.split(path.posix.sep) const fileParts = fileSlug.split(path.posix.sep) const isDirectChild = fileParts.length === folderParts.length + 1 - return prefixed && isDirectChild + + if (!prefixed) { + return + } + + if (isDirectChild) { + allPagesInFolder.push(file) + } else if (options.showSubfolders) { + const subfolderSlug = joinSegments( + ...fileParts.slice(0, folderParts.length + 1), + ) as FullSlug + const pagesInFolder = allPagesInSubfolders.get(subfolderSlug) || [] + allPagesInSubfolders.set(subfolderSlug, [...pagesInFolder, file]) + } }) + + allPagesInSubfolders.forEach((files, subfolderSlug) => { + const hasIndex = allPagesInFolder.some( + (file) => subfolderSlug === stripSlashes(simplifySlug(file.slug!)), + ) + if (!hasIndex) { + const subfolderDates = files.sort(byDateAndAlphabetical(cfg))[0].dates + const subfolderTitle = subfolderSlug.split(path.posix.sep).at(-1)! + allPagesInFolder.push({ + slug: subfolderSlug, + dates: subfolderDates, + frontmatter: { title: subfolderTitle, tags: ["folder"] }, + }) + } + }) + const cssClasses: string[] = fileData.frontmatter?.cssclasses ?? [] const classes = ["popover-hint", ...cssClasses].join(" ") const listProps = { diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx index 7eebb21c7..b6d860272 100644 --- a/quartz/plugins/emitters/folderPage.tsx +++ b/quartz/plugins/emitters/folderPage.tsx @@ -76,12 +76,11 @@ export const FolderPage: QuartzEmitterPlugin> = (user const folders: Set = new Set( allFiles.flatMap((data) => { - const slug = data.slug - const folderName = path.dirname(slug ?? "") as SimpleSlug - if (slug && folderName !== "." && folderName !== "tags") { - return [folderName] - } - return [] + return data.slug + ? _getFolders(data.slug).filter( + (folderName) => folderName !== "." && folderName !== "tags", + ) + : [] }), ) @@ -133,3 +132,14 @@ export const FolderPage: QuartzEmitterPlugin> = (user }, } } + +function _getFolders(slug: FullSlug): SimpleSlug[] { + var folderName = path.dirname(slug ?? "") as SimpleSlug + const parentFolderNames = [folderName] + + while (folderName !== ".") { + folderName = path.dirname(folderName ?? "") as SimpleSlug + parentFolderNames.push(folderName) + } + return parentFolderNames +} From 1915a198d96be134a91441ea52506c455cf8a696 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:04:45 -0400 Subject: [PATCH 028/303] chore(deps): bump the production-dependencies group with 5 updates (#1548) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 84 +++++++++++++++++++++++------------------------ package.json | 10 +++--- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18349a5eb..7a543fd1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,14 +33,14 @@ "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", - "pixi.js": "^8.5.1", + "pixi.js": "^8.5.2", "preact": "^10.24.3", "preact-render-to-string": "^6.5.11", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", "rehype-autolink-headings": "^7.1.0", - "rehype-citation": "^2.2.0", + "rehype-citation": "^2.2.1", "rehype-katex": "^7.0.1", "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.14.0", @@ -57,7 +57,7 @@ "rfdc": "^1.4.1", "rimraf": "^6.0.1", "serve-handler": "^6.1.6", - "shiki": "^1.22.0", + "shiki": "^1.22.2", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -76,14 +76,14 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.7.7", + "@types/node": "^22.8.1", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.12", "@types/yargs": "^17.0.33", "esbuild": "^0.24.0", "prettier": "^3.3.3", - "tsx": "^4.19.1", + "tsx": "^4.19.2", "typescript": "^5.6.3" }, "engines": { @@ -898,41 +898,41 @@ } }, "node_modules/@shikijs/core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz", - "integrity": "sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.2.tgz", + "integrity": "sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==", "dependencies": { - "@shikijs/engine-javascript": "1.22.0", - "@shikijs/engine-oniguruma": "1.22.0", - "@shikijs/types": "1.22.0", + "@shikijs/engine-javascript": "1.22.2", + "@shikijs/engine-oniguruma": "1.22.2", + "@shikijs/types": "1.22.2", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.3" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz", - "integrity": "sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.2.tgz", + "integrity": "sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==", "dependencies": { - "@shikijs/types": "1.22.0", + "@shikijs/types": "1.22.2", "@shikijs/vscode-textmate": "^9.3.0", "oniguruma-to-js": "0.4.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz", - "integrity": "sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.2.tgz", + "integrity": "sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==", "dependencies": { - "@shikijs/types": "1.22.0", + "@shikijs/types": "1.22.2", "@shikijs/vscode-textmate": "^9.3.0" } }, "node_modules/@shikijs/types": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz", - "integrity": "sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.2.tgz", + "integrity": "sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==", "dependencies": { "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" @@ -1307,12 +1307,12 @@ } }, "node_modules/@types/node": { - "version": "22.7.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz", - "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==", + "version": "22.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", + "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", "dev": true, "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.19.8" } }, "node_modules/@types/pretty-time": { @@ -4878,9 +4878,9 @@ } }, "node_modules/pixi.js": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.5.1.tgz", - "integrity": "sha512-yYj8tWehUfH7or/34gf17XyZGnyjiG8toMH8oy9gP+4GjLK+/WjFLlRqaP0AECB8XGF8AJxgkS5y2aMDHqx11A==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.5.2.tgz", + "integrity": "sha512-TOt9g8ifOj4R9DN9ST1M8t2nvnuhr5oWL5YW9ywFLbnOVgFMDcEz+Xek5Mo8Xr64D+QU3qre3IFgreBlsHxTNw==", "dependencies": { "@pixi/colord": "^2.9.6", "@types/css-font-loading-module": "^0.0.12", @@ -5030,9 +5030,9 @@ } }, "node_modules/rehype-citation": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.2.0.tgz", - "integrity": "sha512-alEc/TxDqyALcHt9/MXUBjrCLl+It3q3gqkX0gGv6k3nyJm7CUAOOYxuywWyu6Cljf8DZFCJ9u+oVV/nRgRyYQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.2.1.tgz", + "integrity": "sha512-8Ybq4W0/FeuXSwTrwpDbsZ9v0X0ZeKxDKyA/9s1EI2GMZLgaowPEkFOyXhOjv7Ud2ntK86AWkove38G4U0dRuQ==", "dependencies": { "@citation-js/core": "^0.7.14", "@citation-js/date": "^0.5.1", @@ -5992,14 +5992,14 @@ } }, "node_modules/shiki": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz", - "integrity": "sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.2.tgz", + "integrity": "sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==", "dependencies": { - "@shikijs/core": "1.22.0", - "@shikijs/engine-javascript": "1.22.0", - "@shikijs/engine-oniguruma": "1.22.0", - "@shikijs/types": "1.22.0", + "@shikijs/core": "1.22.2", + "@shikijs/engine-javascript": "1.22.2", + "@shikijs/engine-oniguruma": "1.22.2", + "@shikijs/types": "1.22.2", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } @@ -6344,9 +6344,9 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsx": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", - "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", "dev": true, "dependencies": { "esbuild": "~0.23.0", diff --git a/package.json b/package.json index 9423e09db..97cde0464 100644 --- a/package.json +++ b/package.json @@ -59,14 +59,14 @@ "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", - "pixi.js": "^8.5.1", + "pixi.js": "^8.5.2", "preact": "^10.24.3", "preact-render-to-string": "^6.5.11", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", "rehype-autolink-headings": "^7.1.0", - "rehype-citation": "^2.2.0", + "rehype-citation": "^2.2.1", "rehype-katex": "^7.0.1", "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.14.0", @@ -83,7 +83,7 @@ "rfdc": "^1.4.1", "rimraf": "^6.0.1", "serve-handler": "^6.1.6", - "shiki": "^1.22.0", + "shiki": "^1.22.2", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -99,14 +99,14 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.7.7", + "@types/node": "^22.8.1", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.12", "@types/yargs": "^17.0.33", "esbuild": "^0.24.0", "prettier": "^3.3.3", - "tsx": "^4.19.1", + "tsx": "^4.19.2", "typescript": "^5.6.3" } } From a53772bbd1dd2804872ae0e519bedeb2a2fd4287 Mon Sep 17 00:00:00 2001 From: Osman Tunahan ARIKAN <154083945+OsmanTunahan@users.noreply.github.com> Date: Thu, 31 Oct 2024 01:33:22 +0300 Subject: [PATCH 029/303] feat(i18n): add turkish language (#1554) --- quartz/i18n/index.ts | 2 + quartz/i18n/locales/tr-TR.ts | 84 ++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 quartz/i18n/locales/tr-TR.ts diff --git a/quartz/i18n/index.ts b/quartz/i18n/index.ts index 2fba70e16..f328ada8d 100644 --- a/quartz/i18n/index.ts +++ b/quartz/i18n/index.ts @@ -20,6 +20,7 @@ import hu from "./locales/hu-HU" import fa from "./locales/fa-IR" import pl from "./locales/pl-PL" import cs from "./locales/cs-CZ" +import tr from "./locales/tr-TR" export const TRANSLATIONS = { "en-US": enUs, @@ -64,6 +65,7 @@ export const TRANSLATIONS = { "fa-IR": fa, "pl-PL": pl, "cs-CZ": cs, + "tr-TR": tr, } as const export const defaultTranslation = "en-US" diff --git a/quartz/i18n/locales/tr-TR.ts b/quartz/i18n/locales/tr-TR.ts new file mode 100644 index 000000000..a3805d1a9 --- /dev/null +++ b/quartz/i18n/locales/tr-TR.ts @@ -0,0 +1,84 @@ +import { Translation } from "./definition" + +export default { + propertyDefaults: { + title: "İsimsiz", + description: "Herhangi bir açıklama eklenmedi", + }, + components: { + callout: { + note: "Not", + abstract: "Özet", + info: "Bilgi", + todo: "Yapılacaklar", + tip: "İpucu", + success: "Başarılı", + question: "Soru", + warning: "Uyarı", + failure: "Başarısız", + danger: "Tehlike", + bug: "Hata", + example: "Örnek", + quote: "Alıntı", + }, + backlinks: { + title: "Backlinkler", + noBacklinksFound: "Backlink bulunamadı", + }, + themeToggle: { + lightMode: "Açık mod", + darkMode: "Koyu mod", + }, + explorer: { + title: "Gezgin", + }, + footer: { + createdWith: "Şununla oluşturuldu", + }, + graph: { + title: "Grafik Görünümü", + }, + recentNotes: { + title: "Son Notlar", + seeRemainingMore: ({ remaining }) => `${remaining} tane daha gör →`, + }, + transcludes: { + transcludeOf: ({ targetSlug }) => `${targetSlug} sayfasından alıntı`, + linkToOriginal: "Orijinal bağlantı", + }, + search: { + title: "Arama", + searchBarPlaceholder: "Bir şey arayın", + }, + tableOfContents: { + title: "İçindekiler", + }, + contentMeta: { + readingTime: ({ minutes }) => `${minutes} dakika okuma süresi`, + }, + }, + pages: { + rss: { + recentNotes: "Son notlar", + lastFewNotes: ({ count }) => `Son ${count} not`, + }, + error: { + title: "Bulunamadı", + notFound: "Bu sayfa ya özel ya da mevcut değil.", + home: "Anasayfaya geri dön", + }, + folderContent: { + folder: "Klasör", + itemsUnderFolder: ({ count }) => + count === 1 ? "Bu klasör altında 1 öğe." : `Bu klasör altındaki ${count} öğe.`, + }, + tagContent: { + tag: "Etiket", + tagIndex: "Etiket Sırası", + itemsUnderTag: ({ count }) => + count === 1 ? "Bu etikete sahip 1 öğe." : `Bu etiket altındaki ${count} öğe.`, + showingFirst: ({ count }) => `İlk ${count} etiket gösteriliyor.`, + totalTags: ({ count }) => `Toplam ${count} adet etiket bulundu.`, + }, + }, +} as const satisfies Translation From 314a88d5c607c3f0cdef6706e4bf84590d60f311 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Wed, 30 Oct 2024 23:57:39 +0100 Subject: [PATCH 030/303] feat(transformer): allow inline CSS styling (#1551) * feat(transformer): allow inline CSS styling * Updated docs * Default to inline: false * Removed redundant inline: false --- docs/advanced/making plugins.md | 8 +++++--- quartz/components/Head.tsx | 6 ++---- quartz/components/renderPage.tsx | 7 ++++++- quartz/plugins/transformers/latex.ts | 6 ++++-- quartz/util/resources.tsx | 25 ++++++++++++++++++++++++- 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/docs/advanced/making plugins.md b/docs/advanced/making plugins.md index 0ba29680c..9925d16c9 100644 --- a/docs/advanced/making plugins.md +++ b/docs/advanced/making plugins.md @@ -27,7 +27,7 @@ The following sections will go into detail for what methods can be implemented f - `cfg`: The full Quartz [[configuration]] - `allSlugs`: a list of all the valid content slugs (see [[paths]] for more information on what a `ServerSlug` is) - `StaticResources` is defined in `quartz/resources.tsx`. It consists of - - `css`: a list of URLs for stylesheets that should be loaded + - `css`: a list of CSS style definitions that should be loaded. A CSS style is described with the `CSSResource` type which is also defined in `quartz/resources.tsx`. It accepts either a source URL or the inline content of the stylesheet. - `js`: a list of scripts that should be loaded. A script is described with the `JSResource` type which is also defined in `quartz/resources.tsx`. It allows you to define a load time (either before or after the DOM has been loaded), whether it should be a module, and either the source URL or the inline content of the script. ## Transformers @@ -85,8 +85,10 @@ export const Latex: QuartzTransformerPlugin = (opts?: Options) => { if (engine === "katex") { return { css: [ - // base css - "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css", + { + // base css + content: "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css", + }, ], js: [ { diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index 90e338730..cf79434fa 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -1,6 +1,6 @@ import { i18n } from "../i18n" import { FullSlug, joinSegments, pathToRoot } from "../util/path" -import { JSResourceToScriptElement } from "../util/resources" +import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/resources" import { googleFontHref } from "../util/theme" import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" @@ -40,9 +40,7 @@ export default (() => { - {css.map((href) => ( - - ))} + {css.map((resource) => CSSResourceToStyleElement(resource, true))} {js .filter((resource) => resource.loadTime === "beforeDOMReady") .map((res) => JSResourceToScriptElement(res, true))} diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index f2dcceaa5..9c530967b 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -29,7 +29,12 @@ export function pageResources( const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())` return { - css: [joinSegments(baseDir, "index.css"), ...staticResources.css], + css: [ + { + content: joinSegments(baseDir, "index.css"), + }, + ...staticResources.css, + ], js: [ { src: joinSegments(baseDir, "prescript.js"), diff --git a/quartz/plugins/transformers/latex.ts b/quartz/plugins/transformers/latex.ts index 28b4d506a..d323b3ee6 100644 --- a/quartz/plugins/transformers/latex.ts +++ b/quartz/plugins/transformers/latex.ts @@ -31,8 +31,10 @@ export const Latex: QuartzTransformerPlugin> = (opts) => { if (engine === "katex") { return { css: [ - // base css - "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css", + { + // base css + content: "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css", + }, ], js: [ { diff --git a/quartz/util/resources.tsx b/quartz/util/resources.tsx index a572d891f..72ae9e63e 100644 --- a/quartz/util/resources.tsx +++ b/quartz/util/resources.tsx @@ -16,6 +16,12 @@ export type JSResource = { } ) +export type CSSResource = { + content: string + inline?: boolean + spaPreserve?: boolean +} + export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element { const scriptType = resource.moduleType ?? "application/javascript" const spaPreserve = preserve ?? resource.spaPreserve @@ -36,7 +42,24 @@ export function JSResourceToScriptElement(resource: JSResource, preserve?: boole } } +export function CSSResourceToStyleElement(resource: CSSResource, preserve?: boolean): JSX.Element { + const spaPreserve = preserve ?? resource.spaPreserve + if (resource.inline ?? false) { + return + } else { + return ( + + ) + } +} + export interface StaticResources { - css: string[] + css: CSSResource[] js: JSResource[] } From 56ba2f4fa75c0abe45c231533b5d2edd9791a0ec Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Fri, 1 Nov 2024 07:16:12 -0400 Subject: [PATCH 031/303] feat(build): add support for parsing inline sass (#1558) --- quartz/cli/handlers.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/quartz/cli/handlers.js b/quartz/cli/handlers.js index ed1c0e21c..55381523a 100644 --- a/quartz/cli/handlers.js +++ b/quartz/cli/handlers.js @@ -44,7 +44,7 @@ export async function handleCreate(argv) { let linkResolutionStrategy = argv.links?.toLowerCase() const sourceDirectory = argv.source - // If all cmd arguments were provided, check if theyre valid + // If all cmd arguments were provided, check if they're valid if (setupStrategy && linkResolutionStrategy) { // If setup isn't, "new", source argument is required if (setupStrategy !== "new") { @@ -236,6 +236,11 @@ export async function handleBuild(argv) { type: "css-text", cssImports: true, }), + sassPlugin({ + filter: /\.inline\.scss$/, + type: "css", + cssImports: true, + }), { name: "inline-script-loader", setup(build) { From 74f8c13598b00db30808b6d11fb691b38e313d93 Mon Sep 17 00:00:00 2001 From: Stephen Tse Date: Mon, 4 Nov 2024 17:22:36 -0800 Subject: [PATCH 032/303] fix: reset z-index instead of inherited unset (#1528) Co-authored-by: Aaron Pham --- quartz/components/scripts/graph.inline.ts | 2 +- quartz/components/scripts/search.inline.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts index 5e8d48c13..dbddae91f 100644 --- a/quartz/components/scripts/graph.inline.ts +++ b/quartz/components/scripts/graph.inline.ts @@ -580,7 +580,7 @@ document.addEventListener("nav", async (e: CustomEventMap["nav"]) => { function hideGlobalGraph() { container?.classList.remove("active") if (sidebar) { - sidebar.style.zIndex = "unset" + sidebar.style.zIndex = "" } } diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts index 73e64b361..f422d4988 100644 --- a/quartz/components/scripts/search.inline.ts +++ b/quartz/components/scripts/search.inline.ts @@ -178,7 +178,7 @@ document.addEventListener("nav", async (e: CustomEventMap["nav"]) => { searchBar.value = "" // clear the input when we dismiss the search } if (sidebar) { - sidebar.style.zIndex = "unset" + sidebar.style.zIndex = "" } if (results) { removeAllChildren(results) From 1d5b6f58d8e315df55392578a9110406aa074064 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:03:30 -0500 Subject: [PATCH 033/303] chore(deps): bump the production-dependencies group with 4 updates (#1565) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 112 +++++++++++++++++++++++----------------------- package.json | 8 ++-- 2 files changed, 60 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a543fd1c..a974eb405 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@clack/prompts": "^0.7.0", - "@floating-ui/dom": "^1.6.11", + "@floating-ui/dom": "^1.6.12", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", @@ -28,7 +28,7 @@ "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", - "lightningcss": "^1.27.0", + "lightningcss": "^1.28.1", "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", @@ -76,10 +76,10 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.8.1", + "@types/node": "^22.8.7", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", - "@types/ws": "^8.5.12", + "@types/ws": "^8.5.13", "@types/yargs": "^17.0.33", "esbuild": "^0.24.0", "prettier": "^3.3.3", @@ -587,9 +587,9 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", - "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.8" @@ -1307,9 +1307,9 @@ } }, "node_modules/@types/node": { - "version": "22.8.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", - "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", + "version": "22.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz", + "integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==", "dev": true, "dependencies": { "undici-types": "~6.19.8" @@ -1336,9 +1336,9 @@ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", "dev": true, "dependencies": { "@types/node": "*" @@ -3369,9 +3369,9 @@ } }, "node_modules/lightningcss": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", - "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.1.tgz", + "integrity": "sha512-KRDkHlLlNj3DWh79CDt93fPlRJh2W1AuHV0ZSZAMMuN7lqlsZTV5842idfS1urWG8q9tc17velp1gCXhY7sLnQ==", "dependencies": { "detect-libc": "^1.0.3" }, @@ -3383,22 +3383,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.27.0", - "lightningcss-darwin-x64": "1.27.0", - "lightningcss-freebsd-x64": "1.27.0", - "lightningcss-linux-arm-gnueabihf": "1.27.0", - "lightningcss-linux-arm64-gnu": "1.27.0", - "lightningcss-linux-arm64-musl": "1.27.0", - "lightningcss-linux-x64-gnu": "1.27.0", - "lightningcss-linux-x64-musl": "1.27.0", - "lightningcss-win32-arm64-msvc": "1.27.0", - "lightningcss-win32-x64-msvc": "1.27.0" + "lightningcss-darwin-arm64": "1.28.1", + "lightningcss-darwin-x64": "1.28.1", + "lightningcss-freebsd-x64": "1.28.1", + "lightningcss-linux-arm-gnueabihf": "1.28.1", + "lightningcss-linux-arm64-gnu": "1.28.1", + "lightningcss-linux-arm64-musl": "1.28.1", + "lightningcss-linux-x64-gnu": "1.28.1", + "lightningcss-linux-x64-musl": "1.28.1", + "lightningcss-win32-arm64-msvc": "1.28.1", + "lightningcss-win32-x64-msvc": "1.28.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", - "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.1.tgz", + "integrity": "sha512-VG3vvzM0m/rguCdm76DdobNeNJnHK+jWcdkNLFWHLh9YCotRvbRIt45JxwcHlIF8TDqWStVLTdghq5NaigVCBQ==", "cpu": [ "arm64" ], @@ -3415,9 +3415,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", - "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.1.tgz", + "integrity": "sha512-O7ORdislvKfMohFl4Iq7fxKqdJOuuxArcglVI3amuFO5DJ0wfV3Gxgi1JRo49slfr7OVzJQEHLG4muTWYM5cTQ==", "cpu": [ "x64" ], @@ -3434,9 +3434,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", - "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.1.tgz", + "integrity": "sha512-b7sF89B31kYYijxVcFO7l5u6UNA862YstNu+3YbLl/IQKzveL4a5cwR5cdpG+OOhErg/c2u9WCmzZoX2I5GBvw==", "cpu": [ "x64" ], @@ -3453,9 +3453,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", - "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.1.tgz", + "integrity": "sha512-p61kXwvhUDLLzkWHjzSFfUBW/F0iy3jr3CWi3k8SKULtJEsJXTI9DqRm9EixxMSe2AMBQBt4auTYiQL4B1N51A==", "cpu": [ "arm" ], @@ -3472,9 +3472,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", - "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.1.tgz", + "integrity": "sha512-iO+fN9hOMmzfwqcG2/BgUtMKD48H2JO/SXU44fyIwpY2veb65QF5xiRrQ9l1FwIxbGK3231KBYCtAqv+xf+NsQ==", "cpu": [ "arm64" ], @@ -3491,9 +3491,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", - "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.1.tgz", + "integrity": "sha512-dnMHeXEmCUzHHZjaDpQBYuBKcN9nPC3nPFKl70bcj5Bkn5EmkcgEqm5p035LKOgvAwk1XwLpQCML6pXmCwz0NQ==", "cpu": [ "arm64" ], @@ -3510,9 +3510,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", - "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.1.tgz", + "integrity": "sha512-7vWDISaMUn+oo2TwRdf2hl/BLdPxvywv9JKEqNZB/0K7bXwV4XE9wN/C2sAp1gGuh6QBA8lpjF4JIPt3HNlCHA==", "cpu": [ "x64" ], @@ -3529,9 +3529,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", - "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.1.tgz", + "integrity": "sha512-IHCu9tVGP+x5BCpA2rF3D04DBokcBza/a8AuHQU+1AiMKubuMegPwcL7RatBgK4ztFHeYnnD5NdhwhRfYMAtNA==", "cpu": [ "x64" ], @@ -3548,9 +3548,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", - "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.1.tgz", + "integrity": "sha512-Erm72kHmMg/3h350PTseskz+eEGBM17Fuu79WW2Qqt0BfWSF1jHHc12lkJCWMYl5jcBHPs5yZdgNHtJ7IJS3Uw==", "cpu": [ "arm64" ], @@ -3567,9 +3567,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", - "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.1.tgz", + "integrity": "sha512-ZPQtvx+uQBzrSdHH8p4H3M9Alue+x369TPZAA3b4K3d92FPhpZCuBG04+HQzspam9sVeID9mI6f3VRAs2ezaEA==", "cpu": [ "x64" ], diff --git a/package.json b/package.json index 97cde0464..fdd9f8737 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "@clack/prompts": "^0.7.0", - "@floating-ui/dom": "^1.6.11", + "@floating-ui/dom": "^1.6.12", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", @@ -54,7 +54,7 @@ "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", - "lightningcss": "^1.27.0", + "lightningcss": "^1.28.1", "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", @@ -99,10 +99,10 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.8.1", + "@types/node": "^22.8.7", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", - "@types/ws": "^8.5.12", + "@types/ws": "^8.5.13", "@types/yargs": "^17.0.33", "esbuild": "^0.24.0", "prettier": "^3.3.3", From f84a6554f694984f4154e56e6da50d441ca268a7 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 7 Nov 2024 15:13:28 -0800 Subject: [PATCH 034/303] fix(style): remove flex end to fix tag alignment in content meta --- quartz/components/TagList.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/quartz/components/TagList.tsx b/quartz/components/TagList.tsx index ba48098bd..4a89fbd67 100644 --- a/quartz/components/TagList.tsx +++ b/quartz/components/TagList.tsx @@ -33,7 +33,6 @@ TagList.css = ` gap: 0.4rem; margin: 1rem 0; flex-wrap: wrap; - justify-self: end; } .section-li > .section > .tags { From a6b2967df86895fb5402d4aaa8dfa91417e4d1ab Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 7 Nov 2024 16:32:26 -0800 Subject: [PATCH 035/303] fix: account for chokidar v4 glob deprecation in source watching --- quartz/cli/handlers.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/quartz/cli/handlers.js b/quartz/cli/handlers.js index 55381523a..01adc55f4 100644 --- a/quartz/cli/handlers.js +++ b/quartz/cli/handlers.js @@ -15,6 +15,7 @@ import { WebSocketServer } from "ws" import { randomUUID } from "crypto" import { Mutex } from "async-mutex" import { CreateArgv } from "./args.js" +import { globby } from "globby" import { exitIfCancel, escapePath, @@ -290,8 +291,8 @@ export async function handleBuild(argv) { } if (cleanupBuild) { - await cleanupBuild() console.log(chalk.yellow("Detected a source code change, doing a hard rebuild...")) + await cleanupBuild() } const result = await ctx.rebuild().catch((err) => { @@ -423,13 +424,12 @@ export async function handleBuild(argv) { ), ) console.log("hint: exit with ctrl+c") + const paths = await globby(["**/*.ts", "**/*.tsx", "**/*.scss", "package.json"]) chokidar - .watch(["**/*.ts", "**/*.tsx", "**/*.scss", "package.json"], { - ignoreInitial: true, - }) - .on("all", async () => { - build(clientRefresh) - }) + .watch(paths, { ignoreInitial: true }) + .on("add", () => build(clientRefresh)) + .on("change", () => build(clientRefresh)) + .on("unlink", () => build(clientRefresh)) } else { await build(() => {}) ctx.dispose() From 31e0b7c6f802cfab7250b7e9dfb321b3889ef6ca Mon Sep 17 00:00:00 2001 From: David Fischer Date: Sat, 9 Nov 2024 10:44:32 +0100 Subject: [PATCH 036/303] feat(comments): conditional display via frontmatter (#1566) --- docs/features/comments.md | 11 +++++++++++ quartz/components/Comments.tsx | 9 ++++++++- quartz/plugins/transformers/frontmatter.ts | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/features/comments.md b/docs/features/comments.md index 1f11effc4..48037735a 100644 --- a/docs/features/comments.md +++ b/docs/features/comments.md @@ -114,3 +114,14 @@ afterBody: [ }), ], ``` + +#### Conditionally display comments + +Quartz can conditionally display the comment box based on a field `comments` in the frontmatter. By default, all pages will display comments, to disable it for a specific page, set `comments` to `false`. + +``` +--- +title: Comments disabled here! +comments: false +--- +``` diff --git a/quartz/components/Comments.tsx b/quartz/components/Comments.tsx index 44331cc90..5f379a1bd 100644 --- a/quartz/components/Comments.tsx +++ b/quartz/components/Comments.tsx @@ -25,7 +25,14 @@ function boolToStringBool(b: boolean): string { } export default ((opts: Options) => { - const Comments: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => { + const Comments: QuartzComponent = ({ displayClass, fileData, cfg }: QuartzComponentProps) => { + // check if comments should be displayed according to frontmatter + const commentsFlag: boolean = + fileData.frontmatter?.comments === true || fileData.frontmatter?.comments === "true" + if (!commentsFlag) { + return <> + } + return (
} } From 0f04f1262c277f61185326b85122a52c273ef74a Mon Sep 17 00:00:00 2001 From: Romain Lespinasse Date: Sun, 10 Nov 2024 10:41:56 +0100 Subject: [PATCH 037/303] ci(dependabot): update GA periodically (#1577) Co-authored-by: Aaron Pham --- .github/dependabot.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0ea6875a2..f73eb9666 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,3 +9,12 @@ updates: applies-to: "version-updates" patterns: - "*" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + ci-dependencies: + applies-to: "version-updates" + patterns: + - "*" From cbeef5541f7eba9d3de0131c27bf3a619bf8e55b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Nov 2024 04:46:01 -0500 Subject: [PATCH 038/303] chore(deps-dev): bump @types/node from 22.8.7 to 22.9.0 in the production-dependencies group (#1579) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index a974eb405..d8da10935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,7 +76,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.8.7", + "@types/node": "^22.9.0", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", @@ -1307,9 +1307,9 @@ } }, "node_modules/@types/node": { - "version": "22.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz", - "integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==", + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", "dev": true, "dependencies": { "undici-types": "~6.19.8" diff --git a/package.json b/package.json index fdd9f8737..abe6de143 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.8.7", + "@types/node": "^22.9.0", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", From 0ad9111388dc6933cec6e22499d15de0dc156c05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Nov 2024 04:46:14 -0500 Subject: [PATCH 039/303] chore(deps): bump rlespinasse/github-slug-action from 4.4.1 to 5.0.0 in the ci-dependencies group (#1578) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-build-push.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-build-push.yaml b/.github/workflows/docker-build-push.yaml index f3bd2cdb3..308aee3c6 100644 --- a/.github/workflows/docker-build-push.yaml +++ b/.github/workflows/docker-build-push.yaml @@ -25,7 +25,7 @@ jobs: with: fetch-depth: 1 - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 + uses: rlespinasse/github-slug-action@v5.0.0 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx From 1ab9c91df1df799f7a1004200ff890b144d00f19 Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Sun, 10 Nov 2024 18:13:12 -0500 Subject: [PATCH 040/303] feat(mermaid): improvement navigation (#1575) * feat(mermaid): custom stuff Signed-off-by: Aaron Pham * chore: use mermaid and update clipboard content Signed-off-by: Aaron Pham * fix: explicitly use center div Signed-off-by: Aaron Pham --------- Signed-off-by: Aaron Pham --- package-lock.json | 631 ++++++++++++++++-- package.json | 1 + quartz/components/scripts/clipboard.inline.ts | 4 +- quartz/components/scripts/mermaid.inline.ts | 242 +++++++ quartz/components/styles/mermaid.inline.scss | 163 +++++ quartz/plugins/transformers/ofm.ts | 161 ++++- 6 files changed, 1118 insertions(+), 84 deletions(-) create mode 100644 quartz/components/scripts/mermaid.inline.ts create mode 100644 quartz/components/styles/mermaid.inline.scss diff --git a/package-lock.json b/package-lock.json index d8da10935..18d2c931c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", + "mermaid": "^11.4.0", "micromorph": "^0.4.5", "pixi.js": "^8.5.2", "preact": "^10.24.3", @@ -91,6 +92,28 @@ "npm": ">=9.3.1" } }, + "node_modules/@antfu/install-pkg": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", + "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^0.2.0", + "tinyexec": "^0.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@asamuzakjp/dom-selector": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-2.0.2.tgz", @@ -101,12 +124,57 @@ "is-potential-custom-element-name": "^1.0.1" } }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz", + "integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==", + "license": "MIT" + }, "node_modules/@bufbuild/protobuf": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz", "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==", "peer": true }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, "node_modules/@citation-js/core": { "version": "0.7.14", "resolved": "https://registry.npmjs.org/@citation-js/core/-/core-0.7.14.tgz", @@ -600,6 +668,27 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.33.tgz", + "integrity": "sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^0.4.0", + "@antfu/utils": "^0.7.10", + "@iconify/types": "^2.0.0", + "debug": "^4.3.6", + "kolorist": "^1.8.0", + "local-pkg": "^0.5.0", + "mlly": "^1.7.1" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -616,6 +705,15 @@ "node": ">=12" } }, + "node_modules/@mermaid-js/parser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.3.0.tgz", + "integrity": "sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==", + "license": "MIT", + "dependencies": { + "langium": "3.0.0" + } + }, "node_modules/@napi-rs/simple-git": { "version": "0.1.19", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.19.tgz", @@ -979,7 +1077,6 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "dev": true, "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -1016,14 +1113,12 @@ "node_modules/@types/d3-array": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", - "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==", - "dev": true + "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==" }, "node_modules/@types/d3-axis": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", - "dev": true, "dependencies": { "@types/d3-selection": "*" } @@ -1032,7 +1127,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", - "dev": true, "dependencies": { "@types/d3-selection": "*" } @@ -1040,20 +1134,17 @@ "node_modules/@types/d3-chord": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", - "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", - "dev": true + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==" }, "node_modules/@types/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", - "dev": true + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" }, "node_modules/@types/d3-contour": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", - "dev": true, "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" @@ -1062,20 +1153,17 @@ "node_modules/@types/d3-delaunay": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", - "dev": true + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" }, "node_modules/@types/d3-dispatch": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", - "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", - "dev": true + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==" }, "node_modules/@types/d3-drag": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", - "dev": true, "dependencies": { "@types/d3-selection": "*" } @@ -1083,20 +1171,17 @@ "node_modules/@types/d3-dsv": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", - "dev": true + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==" }, "node_modules/@types/d3-ease": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", - "dev": true + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" }, "node_modules/@types/d3-fetch": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", - "dev": true, "dependencies": { "@types/d3-dsv": "*" } @@ -1104,20 +1189,17 @@ "node_modules/@types/d3-force": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", - "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", - "dev": true + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==" }, "node_modules/@types/d3-format": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", - "dev": true + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" }, "node_modules/@types/d3-geo": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", - "dev": true, "dependencies": { "@types/geojson": "*" } @@ -1125,14 +1207,12 @@ "node_modules/@types/d3-hierarchy": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", - "dev": true + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==" }, "node_modules/@types/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", - "dev": true, "dependencies": { "@types/d3-color": "*" } @@ -1140,32 +1220,27 @@ "node_modules/@types/d3-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", - "dev": true + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" }, "node_modules/@types/d3-polygon": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", - "dev": true + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==" }, "node_modules/@types/d3-quadtree": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", - "dev": true + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==" }, "node_modules/@types/d3-random": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", - "dev": true + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==" }, "node_modules/@types/d3-scale": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", - "dev": true, "dependencies": { "@types/d3-time": "*" } @@ -1173,20 +1248,17 @@ "node_modules/@types/d3-scale-chromatic": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", - "dev": true + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" }, "node_modules/@types/d3-selection": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", - "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", - "dev": true + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==" }, "node_modules/@types/d3-shape": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", - "dev": true, "dependencies": { "@types/d3-path": "*" } @@ -1194,26 +1266,22 @@ "node_modules/@types/d3-time": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", - "dev": true + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" }, "node_modules/@types/d3-time-format": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", - "dev": true + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==" }, "node_modules/@types/d3-timer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", - "dev": true + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" }, "node_modules/@types/d3-transition": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", - "dev": true, "dependencies": { "@types/d3-selection": "*" } @@ -1222,7 +1290,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", - "dev": true, "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" @@ -1236,6 +1303,15 @@ "@types/ms": "*" } }, + "node_modules/@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "*" + } + }, "node_modules/@types/earcut": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", @@ -1258,8 +1334,7 @@ "node_modules/@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", - "dev": true + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, "node_modules/@types/hast": { "version": "3.0.4", @@ -1330,6 +1405,12 @@ "source-map": "^0.6.0" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", @@ -1379,6 +1460,18 @@ "node": ">=10.0.0" } }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", @@ -1600,6 +1693,32 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, "node_modules/chokidar": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", @@ -1748,6 +1867,12 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -1756,6 +1881,15 @@ "node": ">= 0.6" } }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -1800,6 +1934,54 @@ "node": ">=18" } }, + "node_modules/cytoscape": { + "version": "3.30.3", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.3.tgz", + "integrity": "sha512-HncJ9gGJbVtw7YXtIs3+6YAFSSiKsom0amWc33Z7QbylbY2JGMrA0yz4EwrdTScZxnwclXeEZHzO5pxoy0ZE4g==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", @@ -2061,6 +2243,46 @@ "node": ">=12" } }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", @@ -2170,6 +2392,16 @@ "node": ">=12" } }, + "node_modules/dagre-d3-es": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", @@ -2182,12 +2414,19 @@ "node": ">=18" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2262,6 +2501,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dompurify": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==", + "license": "(MPL-2.0 OR Apache-2.0)" + }, "node_modules/earcut": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", @@ -2692,6 +2937,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3338,13 +3589,14 @@ } }, "node_modules/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==", + "version": "0.16.11", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", + "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" ], + "license": "MIT", "dependencies": { "commander": "^8.3.0" }, @@ -3360,6 +3612,11 @@ "node": ">= 12" } }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3368,6 +3625,34 @@ "node": ">=0.10.0" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, + "node_modules/langium": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.0.0.tgz", + "integrity": "sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, "node_modules/lightningcss": { "version": "1.28.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.1.tgz", @@ -3585,6 +3870,28 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -3611,6 +3918,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", + "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/mathjax-full": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", @@ -4037,6 +4356,35 @@ "node": ">= 8" } }, + "node_modules/mermaid": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.0.tgz", + "integrity": "sha512-mxCfEYvADJqOiHfGpJXLs4/fAjHz448rH0pfY5fAoxiz70rQiDSzUUy4dNET2T08i46IVpjohPd6WWbzmRHiPA==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.0.1", + "@iconify/utils": "^2.1.32", + "@mermaid-js/parser": "^0.3.0", + "@types/d3": "^7.4.3", + "@types/dompurify": "^3.0.5", + "cytoscape": "^3.29.2", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.10", + "dompurify": "^3.0.11 <3.1.7", + "katex": "^0.16.9", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^13.0.2", + "roughjs": "^4.6.6", + "stylis": "^4.3.1", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.1" + } + }, "node_modules/mhchemparser": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", @@ -4673,15 +5021,28 @@ "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==" }, + "node_modules/mlly": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz", + "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "ufo": "^1.5.4" + } + }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nlcst-to-string": { "version": "4.0.0", @@ -4749,6 +5110,12 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, + "node_modules/package-manager-detector": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.2.tgz", + "integrity": "sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==", + "license": "MIT" + }, "node_modules/parse-entities": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", @@ -4812,6 +5179,12 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", @@ -4861,6 +5234,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4893,6 +5272,33 @@ "parse-svg-path": "^0.1.2" } }, + "node_modules/pkg-types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", + "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.2", + "pathe": "^1.1.2" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, "node_modules/preact": { "version": "10.24.3", "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", @@ -5485,6 +5891,18 @@ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", @@ -6208,6 +6626,12 @@ "inline-style-parser": "0.2.2" } }, + "node_modules/stylis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -6251,6 +6675,12 @@ "node": ">=14" } }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6338,6 +6768,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -6782,6 +7221,12 @@ "node": ">=14.17" } }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "license": "MIT" + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -6983,6 +7428,19 @@ "requires-port": "^1.0.0" } }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/varint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", @@ -7050,6 +7508,55 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", diff --git a/package.json b/package.json index abe6de143..3956afcc2 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", + "mermaid": "^11.4.0", "micromorph": "^0.4.5", "pixi.js": "^8.5.2", "preact": "^10.24.3", diff --git a/quartz/components/scripts/clipboard.inline.ts b/quartz/components/scripts/clipboard.inline.ts index 87182a154..e16c11299 100644 --- a/quartz/components/scripts/clipboard.inline.ts +++ b/quartz/components/scripts/clipboard.inline.ts @@ -8,7 +8,9 @@ document.addEventListener("nav", () => { for (let i = 0; i < els.length; i++) { const codeBlock = els[i].getElementsByTagName("code")[0] if (codeBlock) { - const source = codeBlock.innerText.replace(/\n\n/g, "\n") + const source = ( + codeBlock.dataset.clipboard ? JSON.parse(codeBlock.dataset.clipboard) : codeBlock.innerText + ).replace(/\n\n/g, "\n") const button = document.createElement("button") button.className = "clipboard-button" button.type = "button" diff --git a/quartz/components/scripts/mermaid.inline.ts b/quartz/components/scripts/mermaid.inline.ts new file mode 100644 index 000000000..77a3ebe75 --- /dev/null +++ b/quartz/components/scripts/mermaid.inline.ts @@ -0,0 +1,242 @@ +import { removeAllChildren } from "./util" +import mermaid from "mermaid" + +interface Position { + x: number + y: number +} + +class DiagramPanZoom { + private isDragging = false + private startPan: Position = { x: 0, y: 0 } + private currentPan: Position = { x: 0, y: 0 } + private scale = 1 + private readonly MIN_SCALE = 0.5 + private readonly MAX_SCALE = 3 + private readonly ZOOM_SENSITIVITY = 0.001 + + constructor( + private container: HTMLElement, + private content: HTMLElement, + ) { + this.setupEventListeners() + this.setupNavigationControls() + } + + private setupEventListeners() { + // Mouse drag events + this.container.addEventListener("mousedown", this.onMouseDown.bind(this)) + document.addEventListener("mousemove", this.onMouseMove.bind(this)) + document.addEventListener("mouseup", this.onMouseUp.bind(this)) + + // Wheel zoom events + this.container.addEventListener("wheel", this.onWheel.bind(this), { passive: false }) + + // Reset on window resize + window.addEventListener("resize", this.resetTransform.bind(this)) + } + + private setupNavigationControls() { + const controls = document.createElement("div") + controls.className = "mermaid-controls" + + // Zoom controls + const zoomIn = this.createButton("+", () => this.zoom(0.1)) + const zoomOut = this.createButton("-", () => this.zoom(-0.1)) + const resetBtn = this.createButton("Reset", () => this.resetTransform()) + + controls.appendChild(zoomOut) + controls.appendChild(resetBtn) + controls.appendChild(zoomIn) + + this.container.appendChild(controls) + } + + private createButton(text: string, onClick: () => void): HTMLButtonElement { + const button = document.createElement("button") + button.textContent = text + button.className = "mermaid-control-button" + button.addEventListener("click", onClick) + window.addCleanup(() => button.removeEventListener("click", onClick)) + return button + } + + private onMouseDown(e: MouseEvent) { + if (e.button !== 0) return // Only handle left click + this.isDragging = true + this.startPan = { x: e.clientX - this.currentPan.x, y: e.clientY - this.currentPan.y } + this.container.style.cursor = "grabbing" + } + + private onMouseMove(e: MouseEvent) { + if (!this.isDragging) return + e.preventDefault() + + this.currentPan = { + x: e.clientX - this.startPan.x, + y: e.clientY - this.startPan.y, + } + + this.updateTransform() + } + + private onMouseUp() { + this.isDragging = false + this.container.style.cursor = "grab" + } + + private onWheel(e: WheelEvent) { + e.preventDefault() + + const delta = -e.deltaY * this.ZOOM_SENSITIVITY + const newScale = Math.min(Math.max(this.scale + delta, this.MIN_SCALE), this.MAX_SCALE) + + // Calculate mouse position relative to content + const rect = this.content.getBoundingClientRect() + const mouseX = e.clientX - rect.left + const mouseY = e.clientY - rect.top + + // Adjust pan to zoom around mouse position + const scaleDiff = newScale - this.scale + this.currentPan.x -= mouseX * scaleDiff + this.currentPan.y -= mouseY * scaleDiff + + this.scale = newScale + this.updateTransform() + } + + private zoom(delta: number) { + const newScale = Math.min(Math.max(this.scale + delta, this.MIN_SCALE), this.MAX_SCALE) + + // Zoom around center + const rect = this.content.getBoundingClientRect() + const centerX = rect.width / 2 + const centerY = rect.height / 2 + + const scaleDiff = newScale - this.scale + this.currentPan.x -= centerX * scaleDiff + this.currentPan.y -= centerY * scaleDiff + + this.scale = newScale + this.updateTransform() + } + + private updateTransform() { + this.content.style.transform = `translate(${this.currentPan.x}px, ${this.currentPan.y}px) scale(${this.scale})` + } + + private resetTransform() { + this.scale = 1 + this.currentPan = { x: 0, y: 0 } + this.updateTransform() + } +} + +const cssVars = [ + "--secondary", + "--tertiary", + "--gray", + "--light", + "--lightgray", + "--highlight", + "--dark", + "--darkgray", + "--codeFont", +] as const + +document.addEventListener("nav", async () => { + const center = document.querySelector(".center") as HTMLElement + const nodes = center.querySelectorAll("code.mermaid") as NodeListOf + if (nodes.length === 0) return + + const computedStyleMap = cssVars.reduce( + (acc, key) => { + acc[key] = getComputedStyle(document.documentElement).getPropertyValue(key) + return acc + }, + {} as Record<(typeof cssVars)[number], string>, + ) + + const darkMode = document.documentElement.getAttribute("saved-theme") === "dark" + mermaid.initialize({ + startOnLoad: false, + securityLevel: "loose", + theme: darkMode ? "dark" : "base", + themeVariables: { + fontFamily: computedStyleMap["--codeFont"], + primaryColor: computedStyleMap["--light"], + primaryTextColor: computedStyleMap["--darkgray"], + primaryBorderColor: computedStyleMap["--tertiary"], + lineColor: computedStyleMap["--darkgray"], + secondaryColor: computedStyleMap["--secondary"], + tertiaryColor: computedStyleMap["--tertiary"], + clusterBkg: computedStyleMap["--light"], + edgeLabelBackground: computedStyleMap["--highlight"], + }, + }) + await mermaid.run({ nodes }) + + for (let i = 0; i < nodes.length; i++) { + const codeBlock = nodes[i] as HTMLElement + const pre = codeBlock.parentElement as HTMLPreElement + const clipboardBtn = pre.querySelector(".clipboard-button") as HTMLButtonElement + const expandBtn = pre.querySelector(".expand-button") as HTMLButtonElement + + const clipboardStyle = window.getComputedStyle(clipboardBtn) + const clipboardWidth = + clipboardBtn.offsetWidth + + parseFloat(clipboardStyle.marginLeft || "0") + + parseFloat(clipboardStyle.marginRight || "0") + + // Set expand button position + expandBtn.style.right = `calc(${clipboardWidth}px + 0.3rem)` + pre.prepend(expandBtn) + + // query popup container + const popupContainer = pre.querySelector("#mermaid-container") as HTMLElement + if (!popupContainer) return + + let panZoom: DiagramPanZoom | null = null + + function showMermaid() { + const container = popupContainer.querySelector("#mermaid-space") as HTMLElement + const content = popupContainer.querySelector(".mermaid-content") as HTMLElement + if (!content) return + removeAllChildren(content) + + // Clone the mermaid content + const mermaidContent = codeBlock.querySelector("svg")!.cloneNode(true) as SVGElement + content.appendChild(mermaidContent) + + // Show container + popupContainer.classList.add("active") + container.style.cursor = "grab" + + // Initialize pan-zoom after showing the popup + panZoom = new DiagramPanZoom(container, content) + } + + function hideMermaid() { + popupContainer.classList.remove("active") + panZoom = null + } + + function handleEscape(e: any) { + if (e.key === "Escape") { + hideMermaid() + } + } + + const closeBtn = popupContainer.querySelector(".close-button") as HTMLButtonElement + + closeBtn.addEventListener("click", hideMermaid) + expandBtn.addEventListener("click", showMermaid) + document.addEventListener("keydown", handleEscape) + + window.addCleanup(() => { + closeBtn.removeEventListener("click", hideMermaid) + expandBtn.removeEventListener("click", showMermaid) + document.removeEventListener("keydown", handleEscape) + }) + } +}) diff --git a/quartz/components/styles/mermaid.inline.scss b/quartz/components/styles/mermaid.inline.scss new file mode 100644 index 000000000..79a1c8495 --- /dev/null +++ b/quartz/components/styles/mermaid.inline.scss @@ -0,0 +1,163 @@ +.expand-button { + position: absolute; + display: flex; + float: right; + padding: 0.4rem; + margin: 0.3rem; + right: 0; // NOTE: right will be set in mermaid.inline.ts + color: var(--gray); + border-color: var(--dark); + background-color: var(--light); + border: 1px solid; + border-radius: 5px; + opacity: 0; + transition: 0.2s; + + & > svg { + fill: var(--light); + filter: contrast(0.3); + } + + &:hover { + cursor: pointer; + border-color: var(--secondary); + } + + &:focus { + outline: 0; + } +} + +pre { + &:hover > .expand-button { + opacity: 1; + transition: 0.2s; + } +} + +#mermaid-container { + position: fixed; + contain: layout; + z-index: 999; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + overflow: hidden; + display: none; + backdrop-filter: blur(4px); + background: rgba(0, 0, 0, 0.5); + + &.active { + display: inline-block; + } + + & > #mermaid-space { + display: grid; + width: 90%; + height: 90vh; + margin: 5vh auto; + background: var(--light); + box-shadow: + 0 14px 50px rgba(27, 33, 48, 0.12), + 0 10px 30px rgba(27, 33, 48, 0.16); + overflow: hidden; + position: relative; + + & > .mermaid-header { + display: flex; + justify-content: flex-end; + padding: 1rem; + border-bottom: 1px solid var(--lightgray); + background: var(--light); + z-index: 2; + max-height: fit-content; + + & > .close-button { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + padding: 0; + background: transparent; + border: none; + border-radius: 4px; + color: var(--darkgray); + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + background: var(--lightgray); + color: var(--dark); + } + } + } + + & > .mermaid-content { + padding: 2rem; + position: relative; + transform-origin: 0 0; + transition: transform 0.1s ease; + overflow: visible; + min-height: 200px; + min-width: 200px; + + pre { + margin: 0; + border: none; + } + + svg { + max-width: none; + height: auto; + } + } + + & > .mermaid-controls { + position: absolute; + bottom: 20px; + right: 20px; + display: flex; + gap: 8px; + padding: 8px; + background: var(--light); + border: 1px solid var(--lightgray); + border-radius: 6px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + z-index: 2; + + .mermaid-control-button { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + padding: 0; + border: 1px solid var(--lightgray); + background: var(--light); + color: var(--dark); + border-radius: 4px; + cursor: pointer; + font-size: 16px; + font-family: var(--bodyFont); + transition: all 0.2s ease; + + &:hover { + background: var(--lightgray); + } + + &:active { + transform: translateY(1px); + } + + // Style the reset button differently + &:nth-child(2) { + width: auto; + padding: 0 12px; + font-size: 14px; + } + } + } + } +} diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 70dce6016..ab626bf7d 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -6,11 +6,14 @@ import rehypeRaw from "rehype-raw" import { SKIP, visit } from "unist-util-visit" import path from "path" import { splitAnchor } from "../../util/path" -import { JSResource } from "../../util/resources" +import { JSResource, CSSResource } from "../../util/resources" // @ts-ignore import calloutScript from "../../components/scripts/callout.inline.ts" // @ts-ignore import checkboxScript from "../../components/scripts/checkbox.inline.ts" +// @ts-ignore +import mermaidExtensionScript from "../../components/scripts/mermaid.inline.ts" +import mermaidStyle from "../../components/styles/mermaid.inline.scss" import { FilePath, pathToRoot, slugTag, slugifyFilePath } from "../../util/path" import { toHast } from "mdast-util-to-hast" import { toHtml } from "hast-util-to-html" @@ -279,6 +282,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> // internal link const url = fp + anchor + return { type: "link", url, @@ -515,6 +519,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> node.data = { hProperties: { className: ["mermaid"], + "data-clipboard": JSON.stringify(node.value), }, } } @@ -659,10 +664,138 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> }) } + if (opts.mermaid) { + plugins.push(() => { + return (tree: HtmlRoot, _file) => { + visit(tree, "element", (node: Element, _idx, parent) => { + if ( + node.tagName === "code" && + ((node.properties?.className ?? []) as string[])?.includes("mermaid") + ) { + parent!.children = [ + { + type: "element", + tagName: "button", + properties: { + className: ["expand-button"], + "aria-label": "Expand mermaid diagram", + "aria-hidden": "true", + "data-view-component": true, + }, + children: [ + { + type: "element", + tagName: "svg", + properties: { + width: 16, + height: 16, + viewBox: "0 0 16 16", + fill: "currentColor", + }, + children: [ + { + type: "element", + tagName: "path", + properties: { + fillRule: "evenodd", + d: "M3.72 3.72a.75.75 0 011.06 1.06L2.56 7h10.88l-2.22-2.22a.75.75 0 011.06-1.06l3.5 3.5a.75.75 0 010 1.06l-3.5 3.5a.75.75 0 11-1.06-1.06l2.22-2.22H2.56l2.22 2.22a.75.75 0 11-1.06 1.06l-3.5-3.5a.75.75 0 010-1.06l3.5-3.5z", + }, + children: [], + }, + ], + }, + ], + }, + node, + { + type: "element", + tagName: "div", + properties: { id: "mermaid-container" }, + children: [ + { + type: "element", + tagName: "div", + properties: { id: "mermaid-space" }, + children: [ + { + type: "element", + tagName: "div", + properties: { className: ["mermaid-header"] }, + children: [ + { + type: "element", + tagName: "button", + properties: { + className: ["close-button"], + "aria-label": "close button", + }, + children: [ + { + type: "element", + tagName: "svg", + properties: { + "aria-hidden": "true", + xmlns: "http://www.w3.org/2000/svg", + width: 24, + height: 24, + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + }, + children: [ + { + type: "element", + tagName: "line", + properties: { + x1: 18, + y1: 6, + x2: 6, + y2: 18, + }, + children: [], + }, + { + type: "element", + tagName: "line", + properties: { + x1: 6, + y1: 6, + x2: 18, + y2: 18, + }, + children: [], + }, + ], + }, + ], + }, + ], + }, + { + type: "element", + tagName: "div", + properties: { className: ["mermaid-content"] }, + children: [], + }, + ], + }, + ], + }, + ] + } + }) + } + }) + } + return plugins }, externalResources() { const js: JSResource[] = [] + const css: CSSResource[] = [] if (opts.enableCheckbox) { js.push({ @@ -682,32 +815,18 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> if (opts.mermaid) { js.push({ - script: ` - let mermaidImport = undefined - document.addEventListener('nav', async () => { - if (document.querySelector("code.mermaid")) { - mermaidImport ||= await import('https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs') - const mermaid = mermaidImport.default - const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' - mermaid.initialize({ - startOnLoad: false, - securityLevel: 'loose', - theme: darkMode ? 'dark' : 'default' - }) - - await mermaid.run({ - querySelector: '.mermaid' - }) - } - }); - `, + script: mermaidExtensionScript, loadTime: "afterDOMReady", moduleType: "module", contentType: "inline", }) + css.push({ + content: mermaidStyle, + inline: true, + }) } - return { js } + return { js, css } }, } } From 189319693971acf619af02202563c533ad67db61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 00:38:48 -0500 Subject: [PATCH 041/303] chore(deps): bump rehype-citation from 2.2.1 to 2.2.2 in the production-dependencies group (#1583) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18d2c931c..bcf6131e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "pretty-time": "^1.1.0", "reading-time": "^1.5.0", "rehype-autolink-headings": "^7.1.0", - "rehype-citation": "^2.2.1", + "rehype-citation": "^2.2.2", "rehype-katex": "^7.0.1", "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.14.0", @@ -5436,9 +5436,9 @@ } }, "node_modules/rehype-citation": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.2.1.tgz", - "integrity": "sha512-8Ybq4W0/FeuXSwTrwpDbsZ9v0X0ZeKxDKyA/9s1EI2GMZLgaowPEkFOyXhOjv7Ud2ntK86AWkove38G4U0dRuQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.2.2.tgz", + "integrity": "sha512-a9+njSn4yJ3/bePz+T8AkCLXhSb3fK+HKlG9xEcLJraN3W92jGV91a10XEvSy6gJ5BvRdtDtu3aEd1uqvNDHRQ==", "dependencies": { "@citation-js/core": "^0.7.14", "@citation-js/date": "^0.5.1", diff --git a/package.json b/package.json index 3956afcc2..326836122 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "pretty-time": "^1.1.0", "reading-time": "^1.5.0", "rehype-autolink-headings": "^7.1.0", - "rehype-citation": "^2.2.1", + "rehype-citation": "^2.2.2", "rehype-katex": "^7.0.1", "rehype-mathjax": "^6.0.0", "rehype-pretty-code": "^0.14.0", From 92676d746e822f1451fad05c294ca7d664b3de5f Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Tue, 12 Nov 2024 03:37:59 -0500 Subject: [PATCH 042/303] feat(ofm): support parsing footnotes in table (#1581) --- quartz/plugins/transformers/ofm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index ab626bf7d..624308ca4 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -117,7 +117,7 @@ export const wikilinkRegex = new RegExp( export const tableRegex = new RegExp(/^\|([^\n])+\|\n(\|)( ?:?-{3,}:? ?\|)+\n(\|([^\n])+\|\n?)+/gm) // matches any wikilink, only used for escaping wikilinks inside tables -export const tableWikilinkRegex = new RegExp(/(!?\[\[[^\]]*?\]\])/g) +export const tableWikilinkRegex = new RegExp(/(!?\[\[[^\]]*?\]\]|\[\^[^\]]*?\])/g) const highlightRegex = new RegExp(/==([^=]+)==/g) const commentRegex = new RegExp(/%%[\s\S]*?%%/g) From 9188939b1f29acd0c330e00e96c0ed73b326e2cd Mon Sep 17 00:00:00 2001 From: Han-Miru Kim Date: Tue, 12 Nov 2024 12:42:44 +0100 Subject: [PATCH 043/303] feat(math): typst support(closes #1568) (#1569) Co-authored-by: Aaron Pham Co-authored-by: Aaron Pham --- docs/plugins/Latex.md | 6 +- package-lock.json | 362 +++++++++++++++++---------- package.json | 1 + quartz/plugins/transformers/latex.ts | 62 +++-- 4 files changed, 280 insertions(+), 151 deletions(-) diff --git a/docs/plugins/Latex.md b/docs/plugins/Latex.md index 236cbeca4..9ef37ff5d 100644 --- a/docs/plugins/Latex.md +++ b/docs/plugins/Latex.md @@ -11,9 +11,13 @@ This plugin adds LaTeX support to Quartz. See [[features/Latex|Latex]] for more This plugin accepts the following configuration options: -- `renderEngine`: the engine to use to render LaTeX equations. Can be `"katex"` for [KaTeX](https://katex.org/) or `"mathjax"` for [MathJax](https://www.mathjax.org/) [SVG rendering](https://docs.mathjax.org/en/latest/output/svg.html). Defaults to KaTeX. +- `renderEngine`: the engine to use to render LaTeX equations. Can be `"katex"` for [KaTeX](https://katex.org/), `"mathjax"` for [MathJax](https://www.mathjax.org/) [SVG rendering](https://docs.mathjax.org/en/latest/output/svg.html), or `"typst"` for [Typst](https://typst.app/) (a new way to compose LaTeX equation). Defaults to KaTeX. - `customMacros`: custom macros for all LaTeX blocks. It takes the form of a key-value pair where the key is a new command name and the value is the expansion of the macro. For example: `{"\\R": "\\mathbb{R}"}` +> [!note] Typst support +> +> Currently, typst doesn't support inline-math + ## API - Category: Transformer diff --git a/package-lock.json b/package-lock.json index bcf6131e0..128441082 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@clack/prompts": "^0.7.0", "@floating-ui/dom": "^1.6.12", + "@myriaddreamin/rehype-typst": "^0.5.0-rc7", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", @@ -714,6 +715,220 @@ "langium": "3.0.0" } }, + "node_modules/@myriaddreamin/rehype-typst": { + "version": "0.5.0-rc7", + "resolved": "https://registry.npmjs.org/@myriaddreamin/rehype-typst/-/rehype-typst-0.5.0-rc7.tgz", + "integrity": "sha512-oIUmJzV8c+PZoV4TZwSupN9e06EaC2i0DpjU6NPe6y0HE7MoPOd35s6i+RjdSNPDguqBdP2MO4VaqnGahQW/ig==", + "license": "MIT", + "dependencies": { + "@myriaddreamin/typst-ts-node-compiler": "^0.5.0-rc7", + "@types/hast": "^3.0.0", + "@types/katex": "^0.16.0", + "hast-util-from-html-isomorphic": "^2.0.0", + "hast-util-to-text": "^4.0.0", + "https-proxy-agent": "^7.0.2", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler/-/typst-ts-node-compiler-0.5.0-rc8.tgz", + "integrity": "sha512-RpMkKYyH7DDJwfX4hMhCkCbby5+rU7UMqRbCe6jmkvrW+FhW5YDxATYnRVEQLgRjbLwGDV5bECLr2/9no+Tn7A==", + "license": "Apache-2.0", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-android-arm64": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-darwin-arm64": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-darwin-x64": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": "0.5.0-rc8", + "@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": "0.5.0-rc8" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi/-/typst-ts-node-compiler-android-arm-eabi-0.5.0-rc8.tgz", + "integrity": "sha512-gSd1Nw4FNGixQTRo4isntK2Utupu4yfKRMTgmB6aLn57GVf6Z6NDA4YLw0lQ8dNB4OYceX1wMXmjnoLZGiTk6Q==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-android-arm64": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm64/-/typst-ts-node-compiler-android-arm64-0.5.0-rc8.tgz", + "integrity": "sha512-1eSqCcLASxbdcicxFtYoXrBz4Rm7uhhWu/0DQ8Qo7bvNkzHuRtc4KkyuCZ6NCb/WzWuR4He20ySJZJRZurpgOQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-darwin-arm64": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-arm64/-/typst-ts-node-compiler-darwin-arm64-0.5.0-rc8.tgz", + "integrity": "sha512-KKty+9lpfzogptuQs78JaFLijucrIdUxnYrCqWR2wHTgc0rnQaqHyec0HQ0oApNDc6u59xURebglQ/nHAVa+WQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-darwin-x64": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-x64/-/typst-ts-node-compiler-darwin-x64-0.5.0-rc8.tgz", + "integrity": "sha512-e1P7GkyBV34h9eTDceZDC3qC0stDSN30R1gbZyniHOWu+qIKp0+RgQOLbkMj1Bk+vsOYGtb3zlqRJGEOCImz8w==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf/-/typst-ts-node-compiler-linux-arm-gnueabihf-0.5.0-rc8.tgz", + "integrity": "sha512-HX19C6kWO8aeg+Ki4pQm2TTmYYLZEW653QwZEoCluAlX7O5HoGxCbsFLnE7v3+ag1dwBcoI2oH5czuKLI7GRvA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu/-/typst-ts-node-compiler-linux-arm64-gnu-0.5.0-rc8.tgz", + "integrity": "sha512-ElCka7rGGnB5nmY/Ei6fhS8JWNFRJDTagW1NM2feGvEazpMxDOQDWPg/bUXnUp7RS68L67gyXJSNFlHNWJM6/w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl/-/typst-ts-node-compiler-linux-arm64-musl-0.5.0-rc8.tgz", + "integrity": "sha512-RbaI/i0rVzu2fyCcUPj89Zt/kmpHqJvxS/VRtbXR6xjXBUBisheRLvmWJrDdMMLf2mS0cwRPxQHGKCOSmB6U5A==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu/-/typst-ts-node-compiler-linux-x64-gnu-0.5.0-rc8.tgz", + "integrity": "sha512-Mi2TruUZ97ZP920fMdvebRVYfMBxQZXnt14f0CqCy4tmg9sI7/ymBaGhT0vIo7A01cWr1DeTtoE4qUrOzXcDyA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl/-/typst-ts-node-compiler-linux-x64-musl-0.5.0-rc8.tgz", + "integrity": "sha512-I/GTNDl3Pb9/TyBRPtJqXuykkZ3d07PrSxnUKo1CelpJCk6S3h1BY0vl/3OwpENWGzy0FJehzkF0F8//3XzCgg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc/-/typst-ts-node-compiler-win32-arm64-msvc-0.5.0-rc8.tgz", + "integrity": "sha512-G0c+IqUDPdUDnTKyFl1ajf47oGgV1asc3aYtl23U71RK4R0ILnyycgGjE/5E8hD0CLodq5xMV+zW+17TZ4VX0A==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": { + "version": "0.5.0-rc8", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc/-/typst-ts-node-compiler-win32-x64-msvc-0.5.0-rc8.tgz", + "integrity": "sha512-qlZXCfLDUm1btpESBa4onU2ky7ALwdj369dAmgslNKyOl5JN8RYcyf9Hm7fp8WeVlxVjH2/2zJgPysAHf+SSRw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@napi-rs/simple-git": { "version": "0.1.19", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.19.tgz", @@ -3956,36 +4171,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-find-and-replace/node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-from-markdown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", @@ -4270,23 +4455,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-phrasing/node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-to-hast": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", @@ -5474,36 +5642,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-katex/node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/rehype-katex/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rehype-mathjax": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/rehype-mathjax/-/rehype-mathjax-6.0.0.tgz", @@ -5523,36 +5661,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-mathjax/node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/rehype-mathjax/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mathjax/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rehype-parse": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", @@ -7285,10 +7393,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/unist-util-find-after/node_modules/unist-util-is": { + "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -7297,6 +7406,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-is/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, "node_modules/unist-util-modify-children": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", @@ -7381,27 +7496,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/unist-util-visit/node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/unist-util-visit/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { + "node_modules/unist-util-visit-parents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -7411,6 +7510,17 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-visit-parents/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/unist-util-visit/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", diff --git a/package.json b/package.json index 326836122..013f5017e 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "dependencies": { "@clack/prompts": "^0.7.0", "@floating-ui/dom": "^1.6.12", + "@myriaddreamin/rehype-typst": "^0.5.0-rc7", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", diff --git a/quartz/plugins/transformers/latex.ts b/quartz/plugins/transformers/latex.ts index d323b3ee6..26913bac3 100644 --- a/quartz/plugins/transformers/latex.ts +++ b/quartz/plugins/transformers/latex.ts @@ -1,11 +1,20 @@ import remarkMath from "remark-math" import rehypeKatex from "rehype-katex" import rehypeMathjax from "rehype-mathjax/svg" +//@ts-ignore +import rehypeTypst from "@myriaddreamin/rehype-typst" import { QuartzTransformerPlugin } from "../types" +import { KatexOptions } from "katex" +import { Options as MathjaxOptions } from "rehype-mathjax/svg" +//@ts-ignore +import { Options as TypstOptions } from "@myriaddreamin/rehype-typst" interface Options { - renderEngine: "katex" | "mathjax" + renderEngine: "katex" | "mathjax" | "typst" customMacros: MacroType + katexOptions: Omit + mathJaxOptions: Omit + typstOptions: TypstOptions } interface MacroType { @@ -21,32 +30,37 @@ export const Latex: QuartzTransformerPlugin> = (opts) => { return [remarkMath] }, htmlPlugins() { - if (engine === "katex") { - return [[rehypeKatex, { output: "html", macros }]] - } else { - return [[rehypeMathjax, { macros }]] + switch (engine) { + case "katex": { + return [[rehypeKatex, { output: "html", macros, ...(opts?.katexOptions ?? {}) }]] + } + case "typst": { + return [[rehypeTypst, opts?.typstOptions ?? {}]] + } + case "mathjax": { + return [[rehypeMathjax, { macros, ...(opts?.mathJaxOptions ?? {}) }]] + } + default: { + return [[rehypeMathjax, { macros, ...(opts?.mathJaxOptions ?? {}) }]] + } } }, externalResources() { - if (engine === "katex") { - return { - css: [ - { - // base css - content: "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css", - }, - ], - js: [ - { - // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md - src: "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/contrib/copy-tex.min.js", - loadTime: "afterDOMReady", - contentType: "external", - }, - ], - } - } else { - return {} + switch (engine) { + case "katex": + return { + css: [{ content: "https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css" }], + js: [ + { + // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md + src: "https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/copy-tex.min.js", + loadTime: "afterDOMReady", + contentType: "external", + }, + ], + } + default: + return { css: [], js: [] } } }, } From 137d55eb1b64e87ff6f3cec52786e5e1bb68798e Mon Sep 17 00:00:00 2001 From: Ben Schlegel <31989404+benschlegel@users.noreply.github.com> Date: Tue, 12 Nov 2024 13:33:35 +0100 Subject: [PATCH 044/303] feat(open-graph): generate OG images + further OG support (#740) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Quartz sync: Aug 29, 2023, 10:17 PM * feat: add basic satori og image generation * Squashed commit of the following: commit fa69c2a5656254251b74dbd5545bef000f67af2f Author: Ben Schlegel <31989404+benschlegel@users.noreply.github.com> Date: Thu Sep 21 19:35:11 2023 +0200 fix(explorer): increase consistency, explicitly use font-family (#496) * fix(explorer): display name for folders without `index` file * docs(explorer): add section for folder display names * docs(explorer): fix broken wikilink * fix(consistency): explicitly set font + label/link fix Use consistent styling between folders with `folderClickBehavior: "link"` and `"collapse` * Update quartz/components/styles/explorer.scss Co-authored-by: Jacky Zhao * Update quartz/components/styles/explorer.scss Co-authored-by: Jacky Zhao --------- Co-authored-by: Jacky Zhao commit 8eb1554b13532a2441b41d2018800c56cfa84ce9 Author: Ben Schlegel <31989404+benschlegel@users.noreply.github.com> Date: Thu Sep 21 18:54:33 2023 +0200 fix(explorer): display names for folders without frontmatter (#494) * fix(explorer): display name for folders without `index` file * docs(explorer): add section for folder display names commit dcdeae4e7bd527945b887ca347b3b4408c03055b Author: Ben Schlegel <31989404+benschlegel@users.noreply.github.com> Date: Thu Sep 21 18:53:19 2023 +0200 docs(explorer): update default config + new example (#493) commit 48452231d5fcd14ef218928bde9ae7e5bc745f4a Author: Jacky Zhao Date: Wed Sep 20 16:09:18 2023 -0700 perf: memoize filetree computation (#490) * perf: memoize filetree computation * format * var -> let commit 16d33fb77193710bede887d6a177d2144b78fb67 Author: Jacky Zhao Date: Wed Sep 20 16:08:54 2023 -0700 feat: display name for folders, expand explorer a little bit (#489) * feat: display name for folders, expand explorer a little bit * update docs commit b029eeadabe0877df6ec11443c68743f1494bc40 Author: Ben Schlegel <31989404+benschlegel@users.noreply.github.com> Date: Wed Sep 20 22:55:29 2023 +0200 feat(explorer): improve accessibility and consistency (+ bug fix) (#488) * feat(consistency): use `all: unset` on button * style: improve accessibility and consistency for explorer * fix: localStorage bug with folder name changes * chore: bump quartz version commit 6a9e6352e88aa9ff18e5b33cf2de442a250bd960 Author: Jacky Zhao Date: Wed Sep 20 13:52:45 2023 -0700 Revert "feat: Making Quartz available offline by making it a PWA (#465)" This reverts commit d6301fae90d9f922618bf0f413e273156731eef7. commit 70e029d151ccbb9aeab30a0f811b9f529b7f8818 Author: Jacky Zhao Date: Wed Sep 20 13:52:29 2023 -0700 Revert "docs: wording changes for offline support" This reverts commit 52a172d1a4911080444ff797183e29ba8175741e. commit 0bad3ce7990aa4ef417128f9d74c2947fe5117fd Author: Jacky Zhao Date: Wed Sep 20 11:58:52 2023 -0700 docs: document enableToc commit 52a172d1a4911080444ff797183e29ba8175741e Author: Jacky Zhao Date: Wed Sep 20 11:40:36 2023 -0700 docs: wording changes for offline support commit d6301fae90d9f922618bf0f413e273156731eef7 Author: Adam Brangenberg Date: Wed Sep 20 20:38:13 2023 +0200 feat: Making Quartz available offline by making it a PWA (#465) * Adding PWA and chaching for offline aviability * renamed workbox config to fit Quartz' scheme * Documenting new configuration * Added missig umami documentation * Fixed formatting so the build passes, thank you prettier :) * specified caching strategies to improve performance * formatting... * fixing "404 manifest.json not found" on subdirectories by adding a / to manifestpath * turning it into a plugin * Removed Workbox-cli and updated @types/node * Added Serviceworkercode to offline.ts * formatting * Removing workbox from docs * applied suggestions * Removed path.join for sw path Co-authored-by: Jacky Zhao * Removed path.join for manifest path Co-authored-by: Jacky Zhao * Removing path module import * Added absolute path to manifests start_url and manifest "import" using baseUrl * Adding protocol to baseurl Co-authored-by: Jacky Zhao * Adding protocol to start_url too then * formatting... * Adding fallback page * Documenting offline plugin * formatting... * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * merge suggestion Co-authored-by: Jacky Zhao * formatting... * Fixing manifest path, all these nits hiding the actual issues .-. * Offline fallback page through plugins, most things taken from 404 Plugin * adding Offline Plugin to config * formatting... * Turned offline off as default and removed offline.md --------- Co-authored-by: Jacky Zhao commit 27a6087dd5a25dd5031b86b9917adde6ef4b211a Author: rwutscher Date: Tue Sep 19 21:26:30 2023 +0200 fix: tag regex no longer includes purely numerical 'tags' (#485) * fix: tag regex no longer includes purely numerical 'tags' * fix: formatting * fix: use guard in findAndReplace() instead of expanding the regex commit 1bf7e3d8b3966590ebfa3418d6fb2ce6a520c846 Author: Jacky Zhao Date: Tue Sep 19 10:22:39 2023 -0700 fix(nit): make defaultOptions on explorer not a function commit cc31a40b0cb53cba7f51187cb6d68076c3f54c0f Author: David Fischer Date: Tue Sep 19 18:25:51 2023 +0200 feat: support changes in system theme (#484) * feat: support changes in system theme * fix: run prettier * fix: add content/.gitkeep commit 0d3cf2922618774fc397dca8cb92fcf76fb0db02 Author: Ben Schlegel <31989404+benschlegel@users.noreply.github.com> Date: Mon Sep 18 23:32:00 2023 +0200 docs: fix explorer example (#483) * feat: dynamically generate og images, write to fs as png * fix: og preview on discord * feat: use `sharp` to convert to webp, add content headers * feat: add config for theme (light or dark) * feat: improve image margins, add font breakpoint * feat: use config header + body fonts for satori * perf: memoize fonts * feat: use default og image if no path exists * feat: add config option for social images * feat: support custom og images via frontmatter * refactor: clean font helpers, rename fonts helper * refactor: make image generation cleaner * refactor: move default image to own component * chore: add todos * fix: only set width/height header if known * feat: remove html from description * feat: make image dimensions configurable * feat: pass userOpts to image generator * feat: option for users to provide own image struct (satori) This allows users to pass their own jsx for generating the default og image * refactor: rename `defaultImage.tsx` > `socialImage.tsx` * chore: improve comments + types * refactor: rename socialImage frontmatter property * feat: add frontmatter aliases for cover image * feat: add frontmatter alias for obsidian publish * docs: add documentation for social images * feat: add `generateSocialImages` prop to config * chore: update lock file * fix: fix type error * chore: update package.json * chore: update package-lock.json * docs: update docs Co-authored-by: Jacky Zhao * fix: clean url for use in metadata * refactor: clean function signature * feat: pass `fileData` to image generator * CI: run format * fix: file system import * fix: merge paths using `joinSegments` * fix: get output dir via `ctx.argv.output` * chore: add explanation to font regex * Squashed commit of the following: commit 7164857f6e32aeba3da80112d604244aa8f557f4 Author: Aaron Pham <29749331+aarnphm@users.noreply.github.com> Date: Fri Mar 15 21:17:42 2024 -0400 chore(ofm): remove unused (#999) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> commit 47024022e834e1bb6c70f671cb32597f42aabd94 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri Mar 15 18:29:14 2024 -0400 chore(deps-dev): bump @types/node from 20.11.24 to 20.11.25 (#990) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.11.24 to 20.11.25. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b98e4be66548e452419a1e4138d9d6d1981f891e Author: Mara-Li Date: Fri Mar 15 23:28:31 2024 +0100 feat(i18n): Add French translation for reading time (#998) Signed-off-by: Mara-Li commit 8be51a0504a7d819a9dab66d854dbef77878520a Author: catcodeme <1020082805@qq.com> Date: Fri Mar 15 14:25:01 2024 +0800 fix: wikiLink in table (#993) * fix: wikiLink in table - update regexp to make '\' to group in alias - handle alias using block_id * style: format with prettier * style: add comment for block_ref(without alias) in table --------- Co-authored-by: hulinjiang commit 92cc23dc456ffc23285b83728fbc3434bbca5472 Author: Linus Sehn <37184648+linozen@users.noreply.github.com> Date: Wed Mar 13 08:59:37 2024 +0100 feat(plugin): citations (#984) * feat: add rehype-citations * feat: add citations transformer plugin * feat: add rehype-rewrite * feat: add csl option and add no-popover to citation links * revert: add rehype-rewrite 04b2692 'feat: add rehype-rewrite' * feat: use existing package for html manipulation * fix: remove `console.log()` commit 097abc3cda0d9a6f3cfedfa3c6351648efd8d6b8 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Mar 11 13:41:48 2024 -0700 chore(deps): bump async-mutex from 0.4.1 to 0.5.0 (#991) Bumps [async-mutex](https://github.com/DirtyHairy/async-mutex) from 0.4.1 to 0.5.0. - [Changelog](https://github.com/DirtyHairy/async-mutex/blob/master/CHANGELOG.md) - [Commits](https://github.com/DirtyHairy/async-mutex/compare/v0.4.1...v0.5.0) --- updated-dependencies: - dependency-name: async-mutex dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit a00324ddfdea9adf6aaec03abf4f076cb756ee7a Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Mar 11 13:41:41 2024 -0700 chore(deps-dev): bump typescript from 5.3.3 to 5.4.2 (#989) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.3.3 to 5.4.2. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.3.3...v5.4.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 9fff6d7d0dbaacad0f9988d4017b72738e6f6c58 Author: Mara-Li Date: Mon Mar 11 17:46:53 2024 +0100 fix: spelling error (#987) I really don't know why I translated this like that into "pas trouvé", and it bugged me a lot. I finally fixed it… Signed-off-by: Mara-Li commit 0f5a9d7b661a1f8610d7001f80a3fd2c52661e51 Author: Matt Vogel Date: Sun Mar 10 12:57:10 2024 -0400 feat: separated content meta (#929) to allow for CSS styling commit b4236e5142c31829cf809c0fbc8370ac22b6d1ba Author: kabirgh <15871468+kabirgh@users.noreply.github.com> Date: Sun Mar 10 00:42:23 2024 +0000 feat(perf:fast-rebuilds): Stop mutating resources param in ComponentResources emitter (#977) * Stop mutating resources param in ComponentResources emitter * Add done rebuilding log for fast rebuilds * Move google font loading to Head component * Simplify code and fix comment commit 6e0c10297095a918109a058762beb47efc384a21 Author: Emile Bangma Date: Sun Mar 10 01:14:31 2024 +0100 fix(transclusion): prevent duplicate transclusion if multiple transclusions are present. (#982) commit 94a54698ab7f29a609ca90033c1384a7ec5f5e65 Author: Emile Bangma Date: Sat Mar 9 17:59:55 2024 +0100 fix(resources): Use full path to font when cdnCache is false (#976) commit 2e9a0c21db717c324a74f761fb0910b1218fdd72 Author: Emile Bangma Date: Sat Mar 9 17:43:40 2024 +0100 fix(description): first sentence no longer repeats until max length (#981) commit b30a200bd4ddc64f4fd3d2124fcda0b354847073 Author: Aaron Pham <29749331+aarnphm@users.noreply.github.com> Date: Fri Mar 8 12:14:22 2024 -0500 fix(i18n): make sure to use correct fileData for manual localization (#975) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> commit 6d59aa8201a1fd3abea32ef36206af6471d85435 Author: Emile Bangma Date: Fri Mar 8 10:04:44 2024 +0100 fix(description): counts characters instead of words (#972) * fix(description): make sure description counts characters instead of words * ref: removed duplicate ternary * CI: fix package log post merge * CI: fix more merge artifacts * CI: fix package-lock.json * feat: add new default image template * feat: use icon.png for image generation * chore: update satori and sharp version * feat(image-generator): add new default template * Update quartz/components/Head.tsx * Update quartz/components/Head.tsx * Update quartz/components/Head.tsx * Update docs/features/social images.md * Update quartz/components/Head.tsx Co-authored-by: Jacky Zhao * feat(og-image): add config option to use default og image for root path * docs(og-image): add `excludeRoot` config + update preview images * docs(open-graph): add examples section * chore: remove unused `socialImage2.tsx` component * feat(open-graph): add frontmatter aliases for socialImage/cover/image * fix(open-graph): only load satori font if config option is enabled * refactor(open-graph): dont use async promise inside `fetchTtf()` * chore: renaming and finished copywriting Signed-off-by: Aaron Pham * chore: update typo Signed-off-by: Aaron Pham * chore: update hinting for socialImage Signed-off-by: Aaron Pham --------- Signed-off-by: Aaron Pham Co-authored-by: Jacky Zhao Co-authored-by: Emile Bangma Co-authored-by: Emile Bangma Co-authored-by: Aaron Pham --- docs/features/social images.md | 401 +++++++++++ .../custom-social-image-preview-dark.png | Bin 0 -> 131924 bytes .../custom-social-image-preview-light.png | Bin 0 -> 134759 bytes docs/images/social-image-preview-dark.png | Bin 0 -> 142236 bytes docs/images/social-image-preview-light.png | Bin 0 -> 137192 bytes package-lock.json | 648 ++++++++++++++++++ package.json | 2 + quartz.config.ts | 1 + quartz/cfg.ts | 7 +- quartz/cli/handlers.js | 9 + quartz/components/Head.tsx | 172 ++++- quartz/plugins/transformers/frontmatter.ts | 5 + quartz/util/escape.ts | 9 + quartz/util/og.tsx | 200 ++++++ 14 files changed, 1446 insertions(+), 8 deletions(-) create mode 100644 docs/features/social images.md create mode 100644 docs/images/custom-social-image-preview-dark.png create mode 100644 docs/images/custom-social-image-preview-light.png create mode 100644 docs/images/social-image-preview-dark.png create mode 100644 docs/images/social-image-preview-light.png create mode 100644 quartz/util/og.tsx diff --git a/docs/features/social images.md b/docs/features/social images.md new file mode 100644 index 000000000..0822651f4 --- /dev/null +++ b/docs/features/social images.md @@ -0,0 +1,401 @@ +--- +title: "Social Media Preview Cards" +--- + +A lot of social media platforms can display a rich preview for your website when sharing a link (most notably, a cover image, a title and a description). Quartz automatically handles most of this for you with reasonable defaults, but for more control, you can customize these by setting [[social images#Frontmatter Properties]]. +Quartz can also dynamically generate and use new cover images for every page to be used in link previews on social media for you. To get started with this, set `generateSocialImages: true` in `quartz.config.ts`. + +## Showcase + +After enabling `generateSocialImages` in `quartz.config.ts`, the social media link preview for [[authoring content | Authoring Content]] looks like this: + +| Light | Dark | +| ----------------------------------- | ---------------------------------- | +| ![[social-image-preview-light.png]] | ![[social-image-preview-dark.png]] | + +For testing, it is recommended to use [opengraph.xyz](https://www.opengraph.xyz/) to see what the link to your page will look like on various platforms (more info under [[social images#local testing]]). + +## Customization + +You can customize how images will be generated in the quartz config. + +For example, here's what the default configuration looks like if you set `generateSocialImages: true`: + +```typescript title="quartz.config.ts" +generateSocialImages: { + colorScheme: "lightMode", // what colors to use for generating image, same as theme colors from config, valid values are "darkMode" and "lightMode" + width: 1200, // width to generate with (in pixels) + height: 630, // height to generate with (in pixels) + excludeRoot: false, // wether to exclude "/" index path to be excluded from auto generated images (false = use auto, true = use default og image) +} +``` + +--- + +### Frontmatter Properties + +> [!tip] Hint +> +> Overriding social media preview properties via frontmatter still works even if `generateSocialImages` is disabled. + +The following properties can be used to customize your link previews: + +| Property | Alias | Summary | +| ------------------- | ---------------- | ----------------------------------- | +| `socialDescription` | `description` | Description to be used for preview. | +| `socialImage` | `image`, `cover` | Link to preview image. | + +The `socialImage` property should contain a link to an image relative to `quartz/static`. If you have a folder for all your images in `quartz/static/my-images`, an example for `socialImage` could be `"my-images/cover.png"`. + +> [!info] Info +> +> The priority for what image will be used for the cover image looks like the following: `frontmatter property > generated image (if enabled) > default image`. +> +> The default image (`quartz/static/og-image.png`) will only be used as a fallback if nothing else is set. If `generateSocialImages` is enabled, it will be treated as the new default per page, but can be overwritten by setting the `socialImage` frontmatter property for that page. + +--- + +### Fully customized image generation + +You can fully customize how the images being generated look by passing your own component to `generateSocialImages.imageStructure`. This component takes html/css + some page metadata/config options and converts it to an image using [satori](https://github.com/vercel/satori). Vercel provides an [online playground](https://og-playground.vercel.app/) that can be used to preview how your html/css looks like as a picture. This is ideal for prototyping your custom design. + +It is recommended to write your own image components in `quartz/util/og.tsx` or any other `.tsx` file, as passing them to the config won't work otherwise. An example of the default image component can be found in `og.tsx` in `defaultImage()`. + +> [!tip] Hint +> +> Satori only supports a subset of all valid CSS properties. All supported properties can be found in their [documentation](https://github.com/vercel/satori#css). + +Your custom image component should have the `SocialImageOptions["imageStructure"]` type, to make development easier for you. Using a component of this type, you will be passed the following variables: + +```ts +imageStructure: ( + cfg: GlobalConfiguration, // global Quartz config (useful for getting theme colors and other info) + userOpts: UserOpts, // options passed to `generateSocialImage` + title: string, // title of current page + description: string, // description of current page + fonts: SatoriOptions["fonts"], // header + body font +) => JSXInternal.Element +``` + +Now, you can let your creativity flow and design your own image component! For reference and some cool tips, you can check how the markup for the default image looks. + +> [!example] Examples +> +> Here are some examples for markup you may need to get started: +> +> - Get a theme color +> +> `cfg.theme.colors[colorScheme].`, where `` corresponds to a key in `ColorScheme` (defined at the top of `quartz/util/theme.ts`) +> +> - Use the page title/description +> +> `

{title}

`/`

{description}

` +> +> - Use a font family +> +> Detailed in the Fonts chapter below + +--- + +### Fonts + +You will also be passed an array containing a header and a body font (where the first entry is header and the second is body). The fonts matches the ones selected in `theme.typography.header` and `theme.typography.body` from `quartz.config.ts` and will be passed in the format required by [`satori`](https://github.com/vercel/satori). To use them in CSS, use the `.name` property (e.g. `fontFamily: fonts[1].name` to use the "body" font family). + +An example of a component using the header font could look like this: + +```tsx title="socialImage.tsx" +export const myImage: SocialImageOptions["imageStructure"] = (...) => { + return

Cool Header!

+} +``` + +> [!example]- Local fonts +> +> For cases where you use a local fonts under `static` folder, make sure to set the correct `@font-face` in `custom.scss` +> +> ```scss title="custom.scss" +> @font-face { +> font-family: "Newsreader"; +> font-style: normal; +> font-weight: normal; +> font-display: swap; +> src: url("/static/Newsreader.woff2") format("woff2"); +> } +> ``` +> +> Then in `quartz/util/og.tsx`, you can load the satori fonts like so: +> +> ```tsx title="quartz/util/og.tsx" +> const headerFont = joinSegments("static", "Newsreader.woff2") +> const bodyFont = joinSegments("static", "Newsreader.woff2") +> +> export async function getSatoriFont(cfg: GlobalConfiguration): Promise { +> const headerWeight: FontWeight = 700 +> const bodyWeight: FontWeight = 400 +> +> const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) +> +> const [header, body] = await Promise.all( +> [headerFont, bodyFont].map((font) => +> fetch(`${url.toString()}/${font}`).then((res) => res.arrayBuffer()), +> ), +> ) +> +> return [ +> { name: cfg.theme.typography.header, data: header, weight: headerWeight, style: "normal" }, +> { name: cfg.theme.typography.body, data: body, weight: bodyWeight, style: "normal" }, +> ] +> } +> ``` +> +> This font then can be used with your custom structure + +### Local testing + +To test how the full preview of your page is going to look even before deploying, you can forward the port you're serving quartz on. In VSCode, this can easily be achieved following [this guide](https://code.visualstudio.com/docs/editor/port-forwarding) (make sure to set `Visibility` to `public` if testing on external tools like [opengraph.xyz](https://www.opengraph.xyz/)). + +If you have `generateSocialImages` enabled, you can check out all generated images under `public/static/social-images`. + +## Technical info + +Images will be generated as `.webp` files, which helps to keep images small (the average image takes ~`19kB`). They are also compressed further using [sharp](https://sharp.pixelplumbing.com/). + +When using images, the appropriate [Open Graph](https://ogp.me/) and [Twitter](https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/getting-started) meta tags will be set to ensure they work and look as expected. + +## Examples + +Besides the template for the default image generation (found under `quartz/util/og.tsx`), you can also add your own! To do this, you can either edit the source code of that file (not recommended) or create a new one (e.g. `customSocialImage.tsx`, source shown below). + +After adding that file, you can update `quartz.config.ts` to use your image generation template as follows: + +```ts +// Import component at start of file +import { customImage } from "./quartz/util/customSocialImage.tsx" + +// In main config +const config: QuartzConfig = { + ... + generateSocialImages: { + ... + imageStructure: customImage, // tells quartz to use your component when generating images + }, +} +``` + +The following example will generate images that look as follows: + +| Light | Dark | +| ------------------------------------------ | ----------------------------------------- | +| ![[custom-social-image-preview-light.png]] | ![[custom-social-image-preview-dark.png]] | + +This example (and the default template) use colors and fonts from your theme specified in the quartz config. Fonts get passed in as a prop, where `fonts[0]` will contain the header font and `fonts[1]` will contain the body font (more info in the [[#fonts]] section). + +```tsx +import { SatoriOptions } from "satori/wasm" +import { GlobalConfiguration } from "../cfg" +import { SocialImageOptions, UserOpts } from "./imageHelper" +import { QuartzPluginData } from "../plugins/vfile" + +export const customImage: SocialImageOptions["imageStructure"] = ( + cfg: GlobalConfiguration, + userOpts: UserOpts, + title: string, + description: string, + fonts: SatoriOptions["fonts"], + fileData: QuartzPluginData, +) => { + // How many characters are allowed before switching to smaller font + const fontBreakPoint = 22 + const useSmallerFont = title.length > fontBreakPoint + + const { colorScheme } = userOpts + return ( +
+
+

+ {title} +

+

+ {description} +

+
+
+
+ ) +} +``` + +> [!example]- Advanced example +> +> The following example includes a customized social image with a custom background and formatted date. +> +> ```typescript title="custom-og.tsx" +> export const og: SocialImageOptions["Component"] = ( +> cfg: GlobalConfiguration, +> fileData: QuartzPluginData, +> { colorScheme }: Options, +> title: string, +> description: string, +> fonts: SatoriOptions["fonts"], +> ) => { +> let created: string | undefined +> let reading: string | undefined +> if (fileData.dates) { +> created = formatDate(getDate(cfg, fileData)!, cfg.locale) +> } +> const { minutes, text: _timeTaken, words: _words } = readingTime(fileData.text!) +> reading = i18n(cfg.locale).components.contentMeta.readingTime({ +> minutes: Math.ceil(minutes), +> }) +> +> const Li = [created, reading] +> +> return ( +>
style={{ +> position: "relative", +> display: "flex", +> flexDirection: "row", +> alignItems: "flex-start", +> height: "100%", +> width: "100%", +> backgroundImage: `url("https://${cfg.baseUrl}/static/og-image.jpeg")`, +> backgroundSize: "100% 100%", +> }} +> > +>
style={{ +> position: "absolute", +> top: 0, +> left: 0, +> right: 0, +> bottom: 0, +> background: "radial-gradient(circle at center, transparent, rgba(0, 0, 0, 0.4) 70%)", +> }} +> /> +>
style={{ +> display: "flex", +> height: "100%", +> width: "100%", +> flexDirection: "column", +> justifyContent: "flex-start", +> alignItems: "flex-start", +> gap: "1.5rem", +> paddingTop: "4rem", +> paddingBottom: "4rem", +> marginLeft: "4rem", +> }} +> > +> src={`"https://${cfg.baseUrl}/static/icon.jpeg"`} +> style={{ +> position: "relative", +> backgroundClip: "border-box", +> borderRadius: "6rem", +> }} +> width={80} +> /> +>
style={{ +> display: "flex", +> flexDirection: "column", +> textAlign: "left", +> fontFamily: fonts[0].name, +> }} +> > +>

style={{ +> color: cfg.theme.colors[colorScheme].light, +> fontSize: "3rem", +> fontWeight: 700, +> marginRight: "4rem", +> fontFamily: fonts[0].name, +> }} +> > +> {title} +>

+>
    style={{ +> color: cfg.theme.colors[colorScheme].gray, +> gap: "1rem", +> fontSize: "1.5rem", +> fontFamily: fonts[1].name, +> }} +> > +> {Li.map((item, index) => { +> if (item) { +> return
  • {item}
  • +> } +> })} +>
+>
+>

style={{ +> color: cfg.theme.colors[colorScheme].light, +> fontSize: "1.5rem", +> overflow: "hidden", +> marginRight: "8rem", +> textOverflow: "ellipsis", +> display: "-webkit-box", +> WebkitLineClamp: 7, +> WebkitBoxOrient: "vertical", +> lineClamp: 7, +> fontFamily: fonts[1].name, +> }} +> > +> {description} +>

+>
+>
+> ) +> } +> ``` diff --git a/docs/images/custom-social-image-preview-dark.png b/docs/images/custom-social-image-preview-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..60c4e85c06bffeae9e2ebe3a37a68421398c42b9 GIT binary patch literal 131924 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 z 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

T_aj2!0%u<|A~*ETH7<7$!W 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 literal 0 HcmV?d00001 diff --git a/docs/images/custom-social-image-preview-light.png b/docs/images/custom-social-image-preview-light.png new file mode 100644 index 0000000000000000000000000000000000000000..046a40708c4000f8ef6d64e737da787c85026a7a GIT binary patch literal 134759 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≫&K;Q!ZVfzQ1xPVO# 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 z≠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
    <~10x~SIyOV=W{lDNxV`TN90Eui* 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 X8zLcS+^c@bX8?I=6{!k|R{{S8NGUr= literal 0 HcmV?d00001 diff --git a/docs/images/social-image-preview-light.png b/docs/images/social-image-preview-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0bdbc756b7788b9dfc000633cec0a8dc05764a GIT binary patch literal 137192 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∓3#|Od)Xr zpe9tq$=SRHsUYtq>&OJ>g;elVr;mY#{?{WpEkuGG2a4)8M5oqvmP7`0-aXiH_h4Jv1hf*W)W3BFI5`+C5aXtB5l5scwuu z$P&9SNx(XXFuuUB*i@HGO)Ry%zl=sCp|Dn8Hm<}t%AOOEARQdYaH6tnBeUY;#JP!M z27hZqX|#{PGbzx+#?mXp1c08t@|F+q7y^kM=q9=Ynrca3_1W&0cy;Md_AO{k4>Mih z`B>0=i3DYKE_pLgp{+3%QqDQCbLd%Y5NcWdFp`cH$1;A1l`n9e3xz)FU$ zD&NArhs=xZcn2d{2N9ikoRlBEmGW-Ckk(IRy$&F8)d@2`c)7o%NUkHL(`-BG#9izk zYWV6k!`QWrYjNHAMa+^CLXfCJCRnIFokHQLvuqrx2~8jk^nY;Qtr=^S)r7k*&LzlB z9&qRiOO5`k`UKY>!YGuAu_Xwf47GW6M}~ba|_ABwxe$MgG3ZZRlb67mHFSS(W0_T+N*(^s_ymXFLxTY4zERL;o33 zs}-ykqtt2qdsy($$-pP2&hT9Us-DA}_YlS9$z%tlzfb4bn#$8bw5mtWy}3ZZarhVH*c*MMMV?RU=JON|6h4Qem=+e4T$w*bpUPT@ z;tNAWenAv~ETM4)Y$+3(LzLl)yKlkKTodDH(H!;##Z51y4|P#-_E8BH6CJbx9hj*$ ztF!OIf5G=GoY-qlArf&pea)$6vY++K>&gFqeIVblIs{J!4CVH2Vwv-Z2-GkJ_N-3Tyu~_YnEA}>cG;uAS?7OgImx18XrfR>^mYh&4V0CUYQnEgb+_`ub5HIh`D68p( zbUM4x=HX*gxQ3Evmp`1|bNy}wZo-eMq3Gn%c}WkS6j&hAjbi=+d$oR#QrZk_|U6lHd%Nk*}@Z02M>r=YS{*VwC%zdD|pDDf3f?Ag(v2#Xqf)* zVG;RU!4;wpbK!A*%biGv978pEq1VX2$N8X_Hxxh+=b-slG$M@_lS@W7xrR+SpyLVe z?-}YITv5ZKByc6zmC#^fn0TU_nXr4G8WR#v?e=i-_pF@GcO`^UZT12om)Idjc8l_6 zHKZsOwP4m>VFQ;Vm1=EFMx^u|a@~(Vo+_+7~Okzm0`ZN8)7Y{fj zmuE*reE5*`5Fi&&J+^@IW^K3y^^%fQ(2n!N4Jj@c(o*}{bJ7|$hzh8c+;1n z*e|~1Sk)t=DNh$_3g_C{iscyX>3?`R%$FO39bcO=@$`E&GFgWUOPum&sW4njqcpPy zmYT=_IYhteM)-XQPL2OF(P4x}Q;etf3j(+s*~{G*G7lDSKnZxk$Lu(Z*yJI}-P7-p z08D|2C%z0~$W~wQS!>o>CBwt4eK!97ZxPi)jv+KrPpLykO_FVusM9Xhkb(Ev01w)x z-I(oeoE=c(xx++f_;A2}hK_XiNtG=sy-~+kFtW%?ms=y|3?6GUDa{$Tp7;}P$z+s_ z*%>u}1CdDEnZmxqA3j|uJ2yU{G8G#XLuCG}9?G@X^4G7p*cVxbHhnc~^nBZ%|GBY)gelgyIbVatxiFnTM3c`_WtUc*6 zg&xO}1k&ePGY3PiK{Yp+jH!DnEoCDuck(wPcwiG8pHHD52IU$%>i(L)F|zUr(12!J zIa!zV(t3b{KT6CaE!`|_zZA_0afv<$)rK10CvA2j)09~%G|&2_BXTX@(kBSJX(kHQ zBo)Th{lNGJq=il#M26N0Ug4E)LY{3uDvZ&3;DI`6A2Yf`1m=?v^~VhAJtw_^?5jdc zof7n?kxFjtf_lGz7C5%9`BHk=-fjTMRB;47+MS^qZ$T)iPy>kht2dNl{|6l8gc&{)?{9|O zZ$CaAd>#2jra=1Jo;{k90k%jT>+fyl^-SnZ7jEhfe38Tg))7o&o#+0H5yw6ElQZ{q%xp2Rq*Zr2;9{Vn0B3Yx==_x> zpxwpfukA8#0F6KZ2_iR?rTH%Wbi2O9s3Dqop8vDF>T1m;gL6Ay)J}@va z+f*}mw8;Gr&y4g!><)vjP2BY&hLfgWj;TOZ$F?SE)&WLF*A?)-A|PC=#tkQTax%?; zRFB=svZz4*qFSOge3EbOsM(X_(2$(l&4x4!8~n8ZiJFf>B&Ce3ntC4e&pTrdC3g=k zND&1bTm7^MZ^e#T-sIas}=6qe%9WJ&MJ+0Y6 z1ngZV-?(P}Ezhmlx3w{ir2G9`NT1k~0ADg~?DMKI6*TGDYK-1EFWZY{d@>93)@!=S z+~;ft%2iy8D7h1Ve4nTBGd-BMV#=#HMDCUKg9HC8eM#2q@qlrN@F)Kejbid*FU>-O zPxLraw3gO!SM~g!>Ku6oa|or<{W!3~{+&bh_`FRtOBXR}W8AD!?-9^H#DY8MQ&uX< zwPjI1raMvJU>lqSf*%f_{eFhgK+Yzi<11?V3uuH1rjG`S2Nlh}8hqUpLWQSzghLuW zWNF?opBownRH&J-u=h~v5gMgA$FLb@>G`1!HjLJ_`5oXJvgYDIjWG6es#@i%IFOq0 zA+U2W-#hO?R)M}AN3{72lR<(%jg>?#4OLYgv@5*~LFbE6BpW1;PshQHImOBEtfB&# zbczXwxmvluV29H%O`qUTeDy`GF}|{Pf&H{vO;Y~msxe9AWYmW&?s9pnTq*FXe+T3H z@1615YYW2gvZz`f8S|{XnbyW`9?}%2c5Q3fkkk6fWd8kHMLt=j)Ti0}!z*a3KC5@ zukWa$)bH15eyUFRC;Y<)>$%ZQSd%ps!xgdXU^Uj?isz>JJ^pNkW`DvKt2w5`H$cRv zgCXxyW`^rA_37o&&&H4j;2J#B^Di8_b?NCDCG>VrCapZSUzuw;7}&$&(M^rg@@IYG zC7%~0epFeU#O=OxjvG>;p1!mD!aH|AX?m@gIwW`5 z&3mjpRAm_`aZZF5M_YLquRkAc1gDJY+!h>!<)N;{vE<+@@*;y^3SxbKc<#6t_LJJA zOqsErkrM)JC7w@e6*`RAJa2)R)Eo{oO#gQjRtaPiZ#NjW(Ls#oP^?OXjNStVhFTDu z1qG?^h=shLA^_hk;X>*oxmTRZC?QPZ&_MuHlY}P0nGVmiPY`UUkP zUr9o1?{DrHMmH?;)F6~7xt|#c`Jv~W1k}*;3*eJ>u27M<^Q$W$xR~!JY)Me3sLE0W zEo4haS}hhKfLYniUH1q=%3(rj5hvf{n_+)n?yyC1qdSETU8`7s_N~p7D;_24d#QZI zq@tKWF9cd`Y8w%ZvE&F7S)J5Ett>%b-5tE{@KF-P1II%Qtcgz~Ug!2zfaHj0&>qjL zm7THBtGyWOSTU0s$7JnCPLGXIJ2M{^6kC9=y^%jp3sJh7uTo~e2syE5_%yFinV3gCp=CV~MI)ah>+>JuhK^?S)c z(VcQCpn>54(rzjnv{`6sk?*MDQSjdbwkfNE#YLgW8mlIiIDc32AY~(1*0L}T0Qc7G zdqVu+)R47%$1Z}z2`MTF59I0L3dxGrP8E--sPZjjP5zxs5*`acZ3{w!Kl&Ur01?!p z6*mY4#tW*^)2QJAZ>w*tt`?zvOf_I3Bb@%7(+=KBIk&Q5QcYg6=0c$3{kZFn)Z9jRcEuLDv%lZD)mfzpA z=|u9Lz?)%_4sCDpjo<70HxvsvMMGNQlV*V^5&2xMXEHXM_u&a|aNxJKRql@!fz_F}b zcu3VF$|tj7X#R+77D)Ey0DO32vG^3(;OcUnq17&`xZF2}@1Y-b=IPVX{5jWuluww^ zxyvct0?9?L8L!uvWU~-nkM91R5H9E)1j~;GRLzx#y+t#U$Wv|JQo^`9@dluLWv~f|L>I?S`0T5K+M+3iyiR zcIT#>?sQZC+ve`a+hG}!DLdDhd(_eI#Z%78xPx^>b6K(6E!+!?1m`(CeE+lG<7`6zT9^L)s|)H%@#+5k z@Hzjt<|gyArdO1kSunde0SFZ+qaN%UEdRIOUVb{$5Xs~&$VP?^na;>#uwi?kowRMh zdmUx4>Q`zd(&DFt%5ofY&ro0ERW%TG*P0HoBREs+5;UoqU`vEWz^v|AWOf|o=9hQMbq%(3PxE){U8M{NX=7lB zs~6o^_rqN3myx zg0N%H-}Sztx?;hT-Rd~fAEt=IP@r2Ly6aEVH1X}b>TD&$O%Z2qxE{;XNlHLjzvyEy z$>-u5@n1aI#) zgg#itTfJEUE3Svuv4O?Ch=ot0lf?Dg5l1>qV!zgkHdF4mZPKLybW!=bP~!3PzeDw| zgjI`$^De;^yT8d)Z7+!xFQ?1h4=Z2n3eLZDEsJuyj)Z83KlYsYu%AgPORwc?^n8Sn z-)5eDC+B*Q`7k927Z}(hF&?z~j56frv`tR+j?hAFBl@m9TT_Ixvo(|!?)8BdH?Ih0XPlO?o&x-%n!9-R>Tnsx3w+9nbPGA@~r zTXAbt!*=M?jo9-a$(panV5a5;gLKjuQ(Qb`T;tDAxbH~k9^-qvszUoXC9O-1Pu3;$ zM5vsbi$564VBm6w`*J%^I7#mgkB`B@S!%vXB-|kb<+BdtP*}U!k%|fNn(&a?H_+2q za4avf&95xG;=0LXDL@H*Ofl4Ua2&9hOED6UE_4y(mhq}?asNM{axVDgm}j!U6a74Grr$VHQkGN2KMZ> z;^y%)FQX;eBzg`gADL|g!;|>}ia3pObH8i{nG(8BnEl|N@d*9DQ+!6qeUr}mdAPH_^Tia?BLmTuC@LSeKI`(*RywqC zq+?dkH~vsIML;)5e7p~iA`%e{s#oi!;AXl3e|H`XJk7|^+`{@XbZQ1J7>ZumRK@O9S6;tHqB`I zX;sOA?EMRfcB^Yt z;HYsceTWhr!VS?0IMj3TW5STCp!yM@q8k35A8_hc)DyUGL|&?qoW~$V()NpYE-3<) z&>Rxv*!F#6meA%a1q2|$gj9W9_yO1TkwKXL;}|`p;ALB3{6<{uYAM&n4IE;AGcnFb zEInJOp`1lKZQ$HF7O;g6AjZZbVt)IeHWFSEcBGr4i$M6lc80?1r9v$aR0XQ0gGN+P zY4!fnnUGbn*aUQTDWXWFAt3!j@n%$FNvB zm267o1rsw7e!AV;o`27LrNY+@1Kspbnncy>t{4P~hBaAg@~EYrj!I+2nyMnd@E-M> zr_!pABfdx_+rK#>lYF!`;LTULjgQ&b{T5OJ%+t@&UdiIY_)$Sep#TR#MiEF5q~Gq1 z2tByDPQP0I>iD_WP(j%(R|C);OK_ zKU_37U@<3bk^8aF{{m${yYcLyPngWK0f=4PM=E>1&^mFrIeeI3g6oVkbj&OPm+btT=ynlzaYs%aQ4-usH zM)unL;}0|}U^`n!>k-I$44z#>QZUxAF*kEtNXGUQg7f8^Coe9_tyG)m*>%3et!OHv(5C;4ZqK?-5&xqWwkYLeUapTaw&k=dUuz5 z57VSMRk2|;?*HAD-e2u!3&E<#v}}Z3{c}RIIvz>bhuHJjyp|mH(WX^Je4t4OYT6cC z?6ue|AWgLxB;ZmbQgW*J%ciZNb5AyE0vSAU-Yz2?|HCT^b(KzS;ihdYmN#e4?u|rv z=r|ypUYgXvu_111Gk8%om_4SrGPnW!nM|+FDO=!i`-Qx6OTX2AalAFrUfx88YAj<*SYob` z{|1x)lyO3h?TKD?^Txzt#wUEEgM0Q2#E1RH8%&n4c%42QD~+Hs|4B`!0s*UImPWje zzhMju?(T|+hbVdugtzrz90{j1ep!;qSY&w{gmqx+?hdA=z3 zpOMYyMhPSO7&t`Zh%nnxmubV%G8kk~?N;Ivz7*t>UP|KeJ##vhWe-c?J zZ<-VR0{X!^j<_vOg$T1rmG*>mZYDj{ zSht^!6N8JH#{;Lb%U2?Rdzs2#ZLYRicnP9XJK)&zLa)YInqM=voE}~Lk;TN2OGrvv zot1>{;D5@l^id|CfkSUY3W^hynjM7?3(E zMZS3k6L2{48wp=fUJ2IUe)+?pHH;v$RuKX8)3!tEI86{D9XCX(3SYEi)$dh8SXMfNnRorm z{rgl1mq6^p+m?+a08{SrZ&Xwin4Xdnxd^OhlY+#-&F*{ijE3Ov-F-w2w=>dyF$k5y zTmTU_M4#{SsL8HVxrW8${Ul=2?xUtS2-_@&5a?dIBDc@Jj)_!Qp`T{al4^m}Yza+c*ll9nE!3zY7~y3F6k!<-!#N*4oLuoKMEm~q$I-= zFb$4@j520$rh+<)8fh{qFB02gH;#-ZJ86vDCO3!mtB`6{QfXiK_s{2+T_9QO81ted ziMN**4Bjkb&Fe!3mK48fBr2uv&NV6jvj<#>#tSs8!Go~iijDhW@)CVK;2QTOAX2#C z{ayYX3ET;!rxbu_p%e)FDM=@rv7_eN`On56z8}BHpB#0aw|jz zLdLDlFxnDZG-RWi*`nk2eJ%=8|7{c-mR6scGE$CdA&Z%=T-D)UOI750K9p;o=R!>{ zYKmmCt}r3NQtJ?I)p@e0;y0c<%Vrkjn5Yp$kqHMuj6DnY60i^#E ziUVFL4^coSrxsx~v4ud!|NH6wOmEMY4z>-y z+|%1h0Q-Vi_VT~sY5kvcbpS3nT_s z98LMvPT9!2)^{Z&sZakM`>Ld zv;blWUjl`xRu+Nsx`oeZOKqh<3+(?Y9njCF$kQPOWZlbZ<6ZgrWxZ~JWd6{JVEETg zP=DRRZ+jIwCZEoBHdw)T=hve&B#jxX)( z8c_x=xfW~f(vP>7zCr#zegW=o-hl!H8-_-zY{RsUWc|lVI&_-rJ5pz1IHIfHQ}WFvI__5<7 z7wy_Qb(MizvUxL`IMm@-#C8N5hbrf-A38;@Y~!XI^CjK|fH2hTJ7ok^wX0$~Kc+q} ze(yp@LoY@jb~3|+ZL-QS01Rxi<0l1hv& z4^)@DI~yhLVh!Sf@Edtaj*4DgzlQ1oSqRBUK9I_VSGG35LGm@N2JU8@3EhZB4(_Da zx_QLl)}K@2NNSu^Tnt`FL^y@aRXNwks!qedsgTm`-9O!MT&nMZy8q!Ze?)FAV(%V?z1gS)$-28flG%2C1YPC>P z3VNBaPDNs*8e6ZC8S@)$7I!n1+}%r*%Zv=^=;*S!b-Y}rCtv^aadp2vXYi6Zo1XZp zfi+}nd^_$vEZB(qz|254Xs}Rl4K0 z5&d5n>)^uPpuzP@he3?dLrrU8u|WwU+tLA3u{S6i%sx_no|HS2(A)o_e!rb0ciZIf5tzKbY-cDo9U)=%-B*sdC|2(ov zPVNT1N$t0TXZ{T=MkS2E$dR;sE$2<8gBUL>JmgTs#~u<=IftT zR(3!mcKjNH#3u;iE?rviNM9M)U7x6VO^A9Dr*94SW+Y+WbU09%RxSA^zUw#$f|kQr zhb}@==p?H1NZ>hMbCz|N z`9YOq9|3NX*Ovy6MIF$$>dM09VZe+0~6P0d&CGgM-7W>_yjfFQ$i~$K4`MoD3T2Xi)IXd7oIoIe8ZK z!Yfy%VRec(?m5nGX(dlDYvl)=+&jv@PhP`ck!J}YVoxPv=b>Ndoo`YJqQ>6Neg{OT zey_&6%M<P$M;Y$AfVg3UzPWByGOe;mo{e;cT7m+Zz)- z1==2VY)@jw3jnBLJ$SNMR1v-P-bU=0l2$Ka@-nWgx+gbnb$T_t-1AfEHYU;3Xm|m2w1GXxtOcapnBvA~81(j`CHKwx?^ishzxpr` z7D{FF3RGY|^Wf0p6%;tcKR9W)8X4y3wN&%Ie|Tz$N5x^Yu+KsW%Z||hYgq7%X8vpU zQVGxWscm+DGb#V-EIN>kiNyz9_}^#zcE_<}Ap`vtoVp!ylbf}JK4d}SUdf%Tq|!Yf zE*HZCeMHFmaO`|%nF$8)Qv*bPD=%6M2-F$iEc|}IxU9D$tpG()rvp{wl5z5w&0Fhz z`RTV~c{xtTSMqGX4W#+|O+VjSy;UmRsQYY0a{Dkm?G03bU4Pq4UwP0p9*6|wGvDQ0 zN{z7gGq|Bh7yJGTw>`lWLqZlRo~RcopZO~LEqc|M>ZX!no+vZV@IwOnID2AUtS&N% za*9_>V8<&>W+MSm+LoPb2ZQAL+i5kuCi~wTl!BL6kAgQx`+zO3z=^pk#Pgniy-7@M zvh5fFMvuwu0%e~(T%0x-=@;yo&RZ1MlHt*TpHTR~RB(y>pG+>+>q@dS_u~bxwz@7F zZ=tG}*`UtMpv-RW6~{{Bk(Y;?)Bot@gFOpJHtaFXc>jv0WpSEZ{|)M+^BzB>Xxu+M zTkTi0c_Xd8`-G^Isydf-VMM(L9jR_2`ovufb7G#@9n2o6V~$ZOgif{nI+ZG)l_1{M z%0i_ig@G9+;4UMi*HN;I0Ab(K@ysDIp^Z>}5RKRxrIS8W9AgigH^VJ+r#tj?n+$eM zuo=y5@*}O|SDD~BcJzs!&N4)j+L$`lN1n)Us@@W`4f6i{jQlNEVZ2K>OcgN!{>HiI zj`!8I<|od4N8P1+1pAFsop!4kfx$rYkJNISzx@)%h-d4vyjzv*aKy}PY`G?~Kh@<4 zERMy5j|O{d;Uo2kG_<{*z1ICLR0sGbbrw6FWlM1D{JGt}^Cgx|C1BK2weZ;i!`U{= zWOGVrJ;byVQ_eNk`LmLZN%6g}|2m<4UlAEPt6_Kg?K4VkhUx%d6j84xAZCJA{`TzCsolsNY!vmbsKc-w za^=HvmLUMfraLj@r(jyz)AM0iY9OjcNpZE{QujIAvgDs}mZ#!)&CHZ9iO80kwJ{O^ z6BvHtz(;>{^Y^Ib5Fp~`>)bLOfyn@p#*XlUai;iG-cRH{J9$o#S&gC##Vtr$NJ4v? zW@U45{#{~b`0iyfT#>@#F`oFfwG4X;X(sc?)lhl54z5bOEFdpmr}SP14cdEGxa=WX zpllMv18z-NVmLZN`%54*uzmmm5A@9DXd5E3H^qolx{0X9U6ac5Abo>{BnIv#$K~da z6E>=61iiQmPzDexs^=UvS3K|~SkM!vsITE8s(29HA*)Wa&P%$5VyPtNKMGyr97R9F zNa@nhsT4|X`!x8y=VfYE&+SV$l9w(bmM(7kbtn*@57IXsm zU2^-&bnJT~il*u9{iRTdzd2(XcV{<8C>9P8DLo&)E>k_RHh+PJs`LrecIV1~b^nIL z8)n>1W&4MSm{fU2h&!u=S9_k# zxiR%S_c$s?{hL-T;u+L-g7=4WUmCITU@KtPZNDwLZF;4E&C-G?v(23ocv-^6gkv!nygRvJtfqGS)vv6ELs>L_oF&a8 zx}Ps1iAxM8c!%Xk$0N~r`g&y4#xjZ%3~7;MzBAOXC+|lE-ATuF55MicR$GQzUl#;s z*B!M6KK4bsvTrLL2tljRN81eHI3FFTZFgKOmP28-E~d`dCS%&jJba)*!Z%#aN0j{C z-1jE*TZ&NOjFYNO@v=>lL&WxDXtp}*cNm>%D~s^Ze@&)VrixUW@AT2Fj)|W;%2OiH zl`fWy{|!ZqP6~bIBzZu|JzqHBT9TE2Ap-N0JH{!=v%XXtHq{bj#zO$`CZXRY?(xg0 z;}#iZzlQHDT(5$-t#K&c)gxEoX_&$?@IrHJ&HU_?bxz$HSJM=0TLzIb=8(I#vVo)$ z1Kv(7^Yb0jeyR9uc)t+8?|a!>c#NysSzlz3_#9DgA?GxkT27>BUQpzvYy2`b2^pk7 zt}QRXs%NFOX-sjv7C}g(pqWIqCKI`ezvG-lSLQMhVxrJJEv+7p`?J*Q2%kHtWnaJQ zNSetj=rLqKSSd)a0dvki@*{l19gd->OrCqN@&V_5zGw0j7(VOv%}>V%-~wSkmMzKR zT=(oYc+ALk!DC61RLx#7t@%a!%w(`Vn;rYraq_`-2nTd_TS2BCSY;8XC%pFy15WtF z9D_8He0u!XXJ=!(Ik-;A_O+LR_rt?6V>ckUmEvEuK)DxlwbvRLkTX18vIV$pkB#XPB^+28Bj@mY+0h+IHu- zd_7l?HcCq`YU`#4k|FX;_#K5gKQ!UGAGi1+CUtLY%c`AR>Jajj@ScD|J=yzKC@gdf zpTRZFi#hm=lDn8nyg@*zk^%QP z7Cb($e*EXs*!qswvIzjcmKuc7+;yjCYmiHtauGdnFws{r1h)+ZMyit(2dM>4nEzz~ zl}q^Q>sPlsCgbc8Bc!#jDAnSA;d1p_A`zRoA%o3uo|{;$)-XK3yYpW#mb9zZWgHF%j`_33D{GJHRPPRU1^bHx^cKs=dsaMxdf2v6Bi8y&yRNS_>F(9DVq^ z8clNS*sL<{92wY?J$Z#q*&$3(>IfsN6$oIV{j}-2HL2b@q7+-l3C^q%=`1%KxW`Dz zA-PH0A!FDXy3=v-bkccxWe>e#8+G367ALGoIBBWqHL6F@!7P+Ol2$)E?^{RxIS(HJ zEsmhjA6emAY#tAKs}EWbU8@1yt*%IRMRQwfNj%X0g6!AO0ze;igOr|y_v$h%agH_S zIJO*Y26se5-#7L!#1cTKAuD&Jni z==nR-G5qZUCixHArGXPaHk=J(1# zPxMfaWoV5#Z+8Rhec_Y4$WQ7{nkuPJg#U=A)JE^1{?Za(74%o?n|K};ozYV}c8rx#*)Y#`& z>+uMk&nQuog8Hc1!VpbvYPNnAg}Qqc&-;3K$}3uC#g$T+bdrgASXr8fu-jvu-)k_aA~}f`+JUC(S~BX55klmJQFpg$$xFU zUMt`yH7^xU;EL%=sgw*<()&4Y>|iSm&~bw75_?sTcl)71$u+2}r=jx2ZR^{6 zqbO9REwfpnDW!aa1KweFWMLiajMGv(WgVIed&~(6PI+PLu65>=-Ll7t^x(bOf&?^? z{_RlD9pNxUc0&WrbD=WpIShq~T%+)yAHF})U7?zs7+AXESa>-lYQJnxTkI~*Y|MnP>_m6NB&1WiGLHC`ZM77P)QN`|!FivHO!CI|{h4gEF!y6_HLkb9%2+0f|XDn*; zX2GM1kT!shGJHMLW}Be$gqp-MMM0DtWzKr8WdLkeVfQcGdppGbSryR_b1Y8=8)*D! zoSaLL_-*~N8^E>LLaQ!sH*o6N{4;?=>5M~0p4$U35U=0&=AQ5c3E;*A3r;z(ucSwx zzvZW%i?8Rbsj)ZymIj?-Yrd0EOg|NT!D~%Cc+W!^4BIi9`I-l-;W5~T@Exd z5Kc4yt4zeKpUc<19UsV|o-%t_r*h6hYE8hpyhP^SrZ$KrcF1J%>>izd`WekEO*oB! zr4_`H?U|s8cx0|jz)1KjTVp64cj~1-|BFRpT&+Wa1%>~^Dd#=?rzDmBdTuy9V?@L+`_&1q`D(kNY^PKrrZM~TiEZXoZUr?Z+Sa7}>Z4SKU*@J78b;R`}EcvE|OlCChh1_e?s&*^%&FwfZmV`F~RF|Dqxw zMIDgDhx3=l&fGd+v5oXlz>OLOS8H*qm?BD6nB&Xg6dg8iz>RqF9O<2T17l6=zBjoR z=+QG7u1EwIqr8%J%$+%2AxwPYp$fRUgV@D_^2=QgCVo6(`+FMaV41ftK!A1LT_ggx znZ*$e8lQhA!wI>hW`qaVSF9vj1u9_%>$b+yf7ot)8+K$G0AK;YWu5=93C93cq`!29kRcGk||` z`kbM-s?U?bYo3B-EFwg=O#BvVW|%E7m3fiLTWAf<{zXrHl`sIBmMGZ@1sgvjjvU1p z7t06#QUHos0AbJ?zB59f+$!M%kU4&>gmY?g;;L7}F|{Y6j4~5LuV2M>^t%N|)AC)< zLf@)_7QpsXG*Tz&+Q=ueK#fs*Q?sVzbUZ|&WXq#a#pdv6Jr!rYS_4Q!a>B;MgJlCH zB)(;1ZR06JMl_aoQ?ZsGs#lmYkRmxadxn+Co9hv|0a4`}%vVzc9@4PaXj+Wqcc}P3 z934N@A=~2D;q=ja4yig3ERZsbNU?#n3hL=XWkbr@*GqGr`woH{Fa3s&sUVShYVN` z8`%zDJCc}|g4P48a+|=^_@zuYE}XlYSA1r+x6Ip}<1}jBRp&014N+6wRk@oe2?lzH zbE}E^OlGPUV5jFZb2?HarFNR(;6<@Hq^lc=xRjt*61%gF#@onQE3RJ@X6{E2nNbve z@F4L&r@`W5&}l0%nMtQv5kLk_wdmynW4hRtoJ|T4!1=dZcLdufAJ{G|bz3cX$Ahom zFZaSsy(V}wi`xxgh%#oN9TQb=p{J=S6SSXs-{|eUn?|`)vGS`Y~*yU0`a$on-6b$6PYgEK!q3;X>x{`+{8%0L_6ZnvhS= z5h@x45#j1+P=0lAWag|7ZGQ)_(gv%kY*JBk2YAHZw=s?u_EfA%;@wez$1({@R906F z;3$6`cw#|G-d1HFJhr?|QHXC*#g9KNoL~PuY^`?{uF4yygzeSWH0sIY_IJi%Vr9Q= z--jSN?Zcql)KVs(rUs7;F&kcY57v@@`G<&;s7%znSj$ZfLsY9o=)vA|p%&pSFWnfj zBI6A${dd)L0EDj88Mps8#9;gi8NgLB9vapc10C^9@PR=>WSth}7H)0xqKRxAq@Z>4 z^*Jft*OU7>+-;0gG5~q;#$QFP+8jYCwMjdhXglKrE78Qb{Vh~}oZcbhdm|kJ%**!J zmgpVCkHG@qawxD8Ce1e!*se|W7XZ)|tPj4V6MJrSc7SSNUDQ?;*RDeo)t^Cequq>VBSc zU-y&^Zpd#C^;+?>)4kW3ru{s1Jx_==V7MH~dO5es;U#sA4Oi!fXLY+j|F;nRXP(~& z;@v}b8>zpOAfU$AT^v3HHaiXJhgH;{Vd@6rTs5X}8IOrkG|4&~H31&&l~2%SCCw_) zIIr?yzNCB2OXZ>A%xEz4jPwqhMscSfQTp$j!^B0r;)hR(Fkn;+b8TF_e2P8g8g*4t zb&R6?Yp+fv$zFN4p7jm%J4|JPJS5k^RCd?c0r-XN7%n+wdBbax!LBUL-{1i#n7RC$?B6}fz1SD60yKUN>p|jsC#A-) zR*F65hm#vu$x45xDatkY_9FmfQ*1(94?8%^cAvF+q7_k7GW_^S2`J}b;Gc3=p9M}o zB9ns{+47n#Vor=*>za(T-C(Fpg}Njagr%s9Y8N-18#5Uhan$d)xGOIYPc6ZjbV z7s%?pui!GA5q_nQ7tir{d`ZPjUs~K8XRpgaqr5#w8nP6oNtCGD5dqX=mZbg|Pr=?TzhWg9D+5rovY{VCx z?Hj8y#J*+u6F3jd6HPzefF9tNJiRI~kM~(AG}BXct1zD&di!(_M-ouj$&nc7`Dfev zm!oL5LbcboRS52{(ER3UPL0+|9Lb+7AZ}76?}?2>hF!n?`Ej1Tdkyz4RMTAV8uXv? zQt`a=?sl1z0uQ`!7uS=*R2}B_Y+hwv@d{QY(a1#Llg36VZvx5?Hcb5}lG!WMiGUkZtj$6;C+Clk()$ z&})@NJWA1kbbT#uEv@Mt?n!WW@0FzAVp4%l1RACafph0@`>-SA`D;YJCTCRe*Q;;@~eDhyd+Z;Nx;+;d1QDgUl$26Gq?OWU#eVE;66PUQcgf z0)_fi<_0%|^5EEJs;4-KL2dr}D+1lY z0tLaBtNFo~7S(Z~*!nTT+(RVEA+ob!G}+3BxacOj3uTE!>>#mQr{+x zn*^$P6sJsJ?SfNL^bl6x2(Q*^FHJ|C81<>NWLPRJ=;^zSGmHN^p0W~a);k^@9C~$6 z%QM{>k?SGJ=|;!0fGgL3{20CtyLf|7{-whXrW2Ka)2R{9z?62hN?KFjcPq=#x0GuouK!Y6#p)OyJ z`$v0I?5##;fjv%z`_iribX{9G#8KR}rBZ*2P?`?9yEPz$-g&BO&(0Hr74#CX*k5zu zjVmFt`>|Yv#?cVr66~O_^IlQPSBF%|3{1T(qN($Sfx({F+ zD+2N3PlWI1@kofpTI5+Q4&FPB5Hl#|ED-}I6ap3b=fL_@6VWd!*X;EZ6M8jaKUV}1 z2K;A3auSSf)Tdov$^Oj)>Sqv?W^uQt`(a>HqTQZ#Yw@dl?8zicX^Y{{AUk+T9; zH1*Oz{T9=B66U*RD8uvTb=W-)m;j0yXckfO+Z0D+vx0);&A}K*bft9-QFzd zB3wjNK)(!Tb++bgKLOD{!zDUO!&Ul!(>>3)f^fRj8~whiPvv*rZ8Sr6X@rzocs=I4 zt6jt*7Pu4RYnVrwNa{qs}g1`r}1eN3Z8WG(jSwyyNS}{rvRpG0B45!n)Ieme3^?>I5pT zwo08!O6r5&z6xrm@w-dO8AlJ-Rs79d2W{go7I~43JgPNHilcj!AXK&0h%_b1_IOo4 zs@RxPWMB-2|9d0XU$yMlNu%NcQ}3niF|u6c%9LWknXjMBSv*8s8m!Q?_Sxi0Nd2uO z3+cFv$U5?Vt@QFK&h|92c^rb&$7+h&vcKXt*7r|P0X{(%d+En7w+ed$ih z)K8#^_%knP2aDjniVQIFZcoPAI>$90++-&!=9&IIaAu7$cJp`2Iz&7{UJ1>vd@(Wi zH4Zxmbc}n`!j?HXX7ivE%uZORJm?~%$W;-%RnBu6?2r>>z)*4$q+YHaHd^Yb)G-y_ z_$|2MlNC68Jx1?N=-(%QonNFo--45#C%T>IOM;K(dJe^Ax~W1h&5~8SsL6(0X!AB~ zx#W7NCkq<({&VxNL=`Iju{|r7Kpp?{p zULIb34rKqpaS%5@qZ&cTql|IP>j&pG#@eg36mOLOC%i=g(1IWg89bw)jRRz=lpw*T z+<{~(O%s#R-WMK%(7%FwU`H36v=pbP4tpuNjSo#hHlh9n22fK_7rh?0qd)Ch&`-8f zMJn+veyZc7-j?Qsxq^p!-tgO7G)PmX%!|VFAT!57N1WiY;{(-md-;R4g|Sat2oVxm zJP!X^<{l^cDsNv#qvLsq2a+m_ zdGI5RKnn4dJMzXY?S==4e1FVMa*6072pl@Bs0{{^?umQ%-!*czS8^cm5#8g#E~I)Z z8bd>JD!cqo!sN#uCmxsN3yCznKuOyqe-BwfUn7FU=jqD%2yMSgy}FfE97pH*+xnsa zKlubGZP$2+XRTcIq5;X){px*^aS0~POVQ~uNw=mNe|%ug-=(}Jb3>!+tz~}?9jhfy zgz3*h!@vM-sF1OlXq~W2;=2SlEZOf%P29@Thx!>~#Qm}s>sxn6(FacJR)LR%Q7 zknP2eKb)}04-|mrVJ+=3=zOm6Lq~()1}&m65t#lpdw(tSGggpNpVP<46A`U2s-6B5 z&dZ3@io-_tSk(>yH+46D-%1OAw;<~aPX6Bl*V$4(Haj)3yV$BZ!wwJXX4#%z^Pho^ zB)U=2kdFf4zM+o=xTkPmzGd)^)bfK|D8mrM-tLDrlaY%Htn>7B5%-;tGna1t*GETe zRci@baN;B_MH48lqeS0O%GGq_Tg8*|7_Ai#|3SXdwvFuc^rFZi&5=>yYyt-%T2N2X z%T+OIAhi5K2rv1P;je!e3Js}ibjlNDpEUU358O`;d?pen@INGAVobW9xcHe$uPDE~ zfFhx!CB3IIh|nKPGqjo9JWXdZfJu6-@F6{H{hdzw7P6Vp@BpvCbjiS%W54BXni?U%nsD{JdAp>lRHz*%dkeMu#gqkvluM2nTw!i z_`0I-P#L<%1TtLz82Y<80$rl8Gq6$opyBBPsyI$Ij= zR*)R4pm`6T7lYaD@vWrsic^ASj8blq(Lu?|Qh6=v-AUUSELICvIx~$a$GK4bQ%|T{ zkAnm7+s)B@K8ua%>-GLENTgDanU=Ovd)5AmU0--WBx4ubumHYpadPe7(vBWz72_LD~6DvQSGY4S}%QQ`m7EuZQ#)?Ru zeo7B+&_=M^fPu^|RdPt?+3{WLyfW`u+j48Y>|7oj&ew=gB)7@{eglCriz!gClISNN zt4q(aGglfuKk((ZjZM1-S)P`7>F-s%c?X*lAy)C0zH%cCEiTag8;JKk1X?NN!t+lq zNB~X5@9TSg-pWi5iD*F1*H`)G%@Qi_4~D7pI4~cwIp1YR_?g@6`&UU2(s4lf#%ERf z>;GH(vwNvXe7eEiI02RabjY^N{(wmsqf$>h{Sgh59`r~L`au~r#@sv-LLH~ogct;ygqF7GSl!4b$EGBrZ4kX#+TfOJy7BpTy zd%$ehv4aePYshur9Rb_#1pZ%;L`tPEc^I>u5WAY+`ze_cdgRDVzYg-4_r5)4xR!|6p|X| z_PNrTv5Fge{8Mal4^NYqBhq$5no)XoHn*5{zT6|qhqIv&o83Qg z%wUb;g#~hE{{DW+^_==#i`&UYrS_;T++@&dtvcD{wm_G*hZGWTZ}IxOd~dc_f<71~ zG+O!#H*!oXaETF|m974B-?)e4-wR1&QZ#;&p|6|%fbd$gxH zky940WGM=}i8K9pIaN>*{#I3--$TuDg-LsbwU=F#^VNAm4s)t}p@qc6t?Cfr3I%>S zw=T!gPa`wuh?}_6#;5LQbUojn2OS(b{y$!}aZciSrm6_g#-mu-iqE3}@&b5>t~bVK zPH`4>7fuP02P28aSJbU-Z2Q8GMC=?{o2)%4$}VbAFYuei&k^$&GdL+m`h>X7CX>Oq zDQ<;G%IK3LJ*CY?S(69>;)#kNKEDP&W;+0u_<&{zHB%3h_S2Ia4LR1R6u-85Ne9z z)p-6uRDj|&DbmM8=}h=7qTq?~aO!eC9M7;n_zlQKS;czM1@HZ#G0=T9JQp$SUzfOY zvZy{>q{3%$K%)Qyl<@a2>`1_&44J1wi2MoX6YJvuz^Ck6^({nARjgL^1)s5ZCM;j*S5cTxd5G07s9WBapk!@2d=;Ki_i@O9Ou{8?%DJfy%C#~IgT$NB1lRkO(pjut^iv9+qrG6NFt z6ahZ(5&>S|*C9;BiOX|=utk*-l78bq8~l+>l8E#l$nD*w8)i1m#V?9BdD5Z}9le>yy3b^ViKE3XF#{j0_Qf>l(*=&1<&iA^NOuA8>9jSaNc@se7n1F8(Cj z{4SVYyf;pzji}Yk5#s?13XMQTc>^2ZH4yn)`j?~WLK?S2JE`_Ru>dbB=dH6ez`>#c zZH)`UVqMzaeSJ?`&Nn(pqmWqXfr(`5Ok1oboOCnV99DyKFBZRg*^OLivlxK)^moCw z*h3o#BeG4XIY^kkgRdQ&wx2Y>D*WW7VPX6Uth~91A-6>0Oj~+HKE{H35zoPLzHgqqGgsWm6aHQ2lT= zWR4-ZqPq`ITt14mU3}xWG42opO`gBjs_XMiozc3Qi3bQFl!tnGUCf_FAV_6Xh?bUW z^uK_V{BojNp+Nj8>NRC4p@dGG3){JS=!aCU+?JKKAG%JSi#m#pf~<3wY5(V~2pFbl z=&JT=D{BIX>#U}~%lw*AzN1c$pA(Fapub5}C$oJ>ujjR_MKjW0WW~T>&1@`5J8zwGC!@PDEBT9Ur&on< zeMt+7KTIvcKz!Soo{=t9kNB3$Y7KRYsVD%9_gzhbBv;OAox9Uoh+72dufc1dPXUmN%R11Lr z#nw_D%A&_KmybuDhDfSnX8uk(%MNB_#P5cJ-<-Z<1a8#iZ-nSHN94}pwlJ#O;?CE8 z9vY0bE~Pyn3Ucnq*=Unz=FZxr*UA1HPdc~)(@}jD&VlGZQ!6 zH06P;-*g>}7U(>JhueRoD zGOn2m#&6h7t#{y^{dOEZ=e}GgL7ikr6iGk*=CTm?A&~iFe2*EN3gqc`whBI(JdHI~ ztlHl(#tUT{3{L%A206>T2RTPaW-ccttp=Sm1ab@QkDwAG(ePqf`=_t@jQgt!qFa=1 zu_A~}j7aGFdWhdQf3Nww470ig!GHZTHRl5hsF53yZi0q)5QATDp>Cz!*<~?n$1lO> zb9U96zoD?bbJfIb#pgy(>en%7B9=8k)l~Hct085<0!|!e$W2VN$HIWwCS!u@3EW+Nb zUq>1td0;Y5Pn9~t9DJ;T7mI|3C2JsGouht}~3{j#ZZTWd<RfVvYeJgVB;xz!SFn-zu0NhZ+0-MzvQW^b@M!K z1A&`isAKWeJ)a9^E(3gV)OdxQU9)!Ff>!Co0te#6wT{qkpuNGZu5kLS%tXA4Mbfi+ zD)rB+nU4+4A~8Il_f;~G9P^^>f?1*K$_p!F(Cm+;d;%Ln@kn=wanvm(BljxK2 zdd&T=NpUfK6-RrzWVTkmYKB%RNp}1*Y8C+vjwrjvB~tfcfvNI?l%GOW?M&JH3v_mp zyW(eS?!3_qM$S1Db~LV{GN*Xj(pnCB^S^Wvj&)E&zR1mr|Gcz=+(pN!K^Nv_k7(1# z^l5J=Zz#8_w-rg}9!`C*_Nlr=1j;I2W1<%wh0sr3<`#W5<8TQ?IG4@sqkEZHH=7Il z{Ejkt4Fj5afB})rH$-Z#3Qj;QNFh3p8D#VZ${Sk_gX04A{f#mGpKMFW zM`Jb&NXa#Bef7PDsVa~K<52Z7>aabzBI$IbGIvUXczyWWc3vE1)yc&;RZ|>FmxG)F z_eU=={BUOJRvV8HpzlO^$sRiC3xggLd1SyUIW}JM@l@=zxb_GLtT17~JJ@aK2v@qIf zHmfpH<F8)Le|&PkMFJz~fhlMmcqw0;Gm@j4Oh%v3(WJ*oke} zc2aghOKcEn+`AK>hH9~sZjboZo>4LV05UFQezn9A_l7-LxJS-*8%+?V*)L%&WHQO3 zZ6Y#*&svUm*+kJ@Y)mSv&QRV-VYBVl?*(|M_-ZNTn1Y&$sC^EQ!mE^hM@zyvTm*Mx zeY+u;X zlRs-PIJq0e;cFp;EdlHd)!MX*ny6{+EkbAaI6zrZ)%r!8L@`k5R!^YR(=4|Y}pHF10@emsBKm_56 z8C|)(h#lH(OrI>bg5fI>QRiCF&|ltWllD1uB7PGCoI zn*y2wH5~NpjYM@&5~d(>_5w9}+1ZZj(dF0$tYW{kG!+QrKLlqqEH=`GEXJ@!?~b4V zN~kZ+Y4(vyA(hZA*2Dx)YRG{b@uj&ISvZ3&zI3G`-}l{S2_|||4*w}V7_OIe6&_$I zWHQ94sK?~BeLZ!(vW#a#il6KVyS8j% z&<&2RArolVHC9$JR2TjJW6wrWXm1YV?;S4w1mTre=6LI=E*i@vlzWwH>iL^ohU|6<^zq<3fuukCLlNW%gq zUS>2F9ti8mQZcUEIGsX&2FD%d;f*3t|3Wwq6EaUm1u${rO$gp}x+nW7pGVib3w8bo zx&OaY5gNXHJ@)Zt3@Cq|O~U&<#h;c{IRmogu98BTU1F|LcaEG*7pDL?`upe0MGSp9 zj@NZ>sk;pP(K`9xd7b1iJNb3Cj#7slMhVM~^bZ#ee`%40q*@qI?vfP>_x^YKX=X<2 z-x~h@(4dby8lbF!bwTY#uyK1`d>Sg1ZWhyoz}x0Fu1a@-p=+X3FsgTWMX1Wu$y5N& z_3qfM2EnMF){IGxMdo}6avIoA;ygm0ZMv&Ii11iBs;1}H)!H~7G$RdIIzAg5|&vK`(-gnu`FkF6A= z$RII2#KhH{%QX-DTvYHI=QO#p-@2i|o0w!<-H^ZAQWlq^=h!(MK<2NlT+RT5cI# zed&GwY;nz0AeP&AR-C`)7EuuZ?;#O(L~zmY2sI_E1+_fM3%B*cN#xiCSN6aJ5$_Gf z!Q=h2Ve(H*45XZY+@eyUeeAGZAc<+dI3Mo1i>Ie$H=1uZtkIgkG9%U=1Hgx#ABh7H zSI1i-jb35Gf+%+0^zg)jA+C*i%7@u3`A;A3C5e5i3z! z{@A?BfI-lcEHU2mM3*{<$w`p*Wac})iWYl}tzRML((>Zf&j==dMFdV^k&Db5{TX}u z>IU6wsKB(-Afr6qF74gj<(zJ>R&o-jb5c(Ekp+Ggp0tuxQwYeLua3-IO1OK4y#m;j{ z)_CNS#h;Mt$UT3)9_9RYnz*rrOA5(N+?K6G|N1=3SPq~S`0QYku~t}*eP7gh`OTtg zsk=Incy|}JI?jrAB&J4;0?l!dSet&~SbLriY=vi1R$ZBdCG)h&39!X74{K%Z`2fe& znc`4e+Y4wVQdCzThQP4Kh2^z`HBHGyTAAuq#S38`&5%b+Yj@ONXBRgRaWohn*a|rX zH7A9HcG{evWwcDfe^F~eTr5NMZsNR;To+%s1;=boF5TO zzp$y%RBU?`Ze}v0g`mG3?jCqTH^zZ^C8X>IN1T^XO%}BGr3*RX>GWRK4c^Fxn4L98 zxZR!|DQQ%b+nRa#J6HVMg`dUX7hnYCJB`5v5yI)2fcCog)8xaq50@*>hbX$42`x85U*U` zrI^NgB`icV6x9*Gi-WJp#W4$i;S2~&E&rNwI()L%xXgZz z=#zAq%{l2Me52P~(18aO&e|ETeqV+p#WxO68_|O_;>$-tP)Y0Q>gaddZ#SWcO{~!uUdLV9FB`*9YDa_d1 z%j~{3dx2@0X=W4TiI=2JV-j$_qHrPg4`n$cEmDcv^Z)Xgpb6&tpr#vT*5%~pFdbTF z-n?K#MhW%|F<{H3oFgF+z|SBA5lM*(Wy!;}wn%x68kzeszRAE#YQ^;+3KdEb&m%cT1VC-9_y+_-YxSQ;j?+S;4bld{o${nhDLK`puFKQ#>Z9CgkDkNeC<0Dc0$!B7J7!c13FV zb|~^4dRoYyZR270Q!Zt!N&e#*sV16(fQy=tlxiL9fYf*|5&Sw7*g>HNWn1IVpsU zTucs!fhh%b?E(4tcOU`^JKNcKfI3knW#=pmL39A;ZdLDL!rF{X{Z z6KF44dGB32f3OA9IS;vIZCJBb+CaB(i{7WZihMPw<@Wy!;IU8_DBoqV;ath-*8}iw zav+m>FNUMQl$Gro-1Q8QOe&6qA@fg$iOWM}e(kW4nF&?6v#k?*^_|tTL=wC$S}16s zy?u5D)@5U~F|3rIF7FY@7A>caOGxRh>YRDzQ)^HGx%HKdCp%GG4UUdM_No~83~sNM ztyYZoLbTj=4O9`E$Cv>AbxeSt;J$<{xde9c1i13>BssBEh`#!h*KWV(j=H5y0R6We z77VudFIN<-%#5sQnW!-A_j?8^S7tT2e~JI1)04xFqr-G|MrG($>L4p#q%ddgwsI-{ zZA+XkxtwU%=xT@cqTrZg)Ypg`ozv#a>J~7GT*Cm!WYm8t5Kqlz+I+6V4aD!&R$Kav zugGYr=KMNT;5L8qhW9S`kDTuvh1_pg_{Xz7`o9vg+Cbv7;{C3+@fDFUpB6-rmLIAPbF!X#faTKR4 zd1rbgkWxH0zgv|7=K#C1h zy)Ph>JDUp@{xo_AI#}~qs$-iCNw2$VGxzpg3kHvuAcX!5-kT|4q#e2+=m$DBc^`Cc z{FG`}F}8KhZh`XX+cJ|9vWD$&WUk}hFKDEd24}vgPjEDl=s9LRhHNG_OyjnWXc^;8 z@(4p(Bv|{WbCcHc)FQE_v!Mc)bR$Un=M4XI=@#ZKG(i9ZRZeS5)AzF@$@bJ&a%G)q>>_G6dczJ@=Rw5qpxvv z=2cKZUwRTB2wkO&`i0P;lKwsc%uluc99K|1OKGbRMiM)uvItJmJl zoxKIXm!|7?sL9w6{xaa?ySJV|g%6d&Ey&bc4RZF)1y{_SCVuNUywR`vf%un9zJVrA z@OyWt@mugdFE%OfstBhg~moLYGffQMn^i0)EkOn zq|5l%#K2xIRvQoH(ajzgh6py!%-1-PnMf)_(aba&}Bp&;(Y}}gxTX&_(^Q+ zFePrQFKG19ML!W$t)P#C9pWrePw%fQBj3~65Enb&5>ZsM__VR7_W!W+aK|}x?t~+t zxA4VxjEl~H$wBA2Pc5f#@}tW43^GLBbDd}@S*xfp@(UjC`8|YCNZfVs!{rtULzI=hhqATh%1mG$4p^lX|AKq`x88J=`+Op0h)fuF;EjR&r!CZo^WZlx;~jM~-#Wj0 z+WH8Bj@DS_v`AzZ)290GQrL-H|HSo&K2*QQi^im#aVbh@H<+ylpJfD;Q36e7Wt}kb zf{tYJ;M80wj~-W&*q=&i!!3=w4xk$_)r&X`veHuR!Ny*u0fxOgh;r$K%9s~BVxQ=p zIS!{mOA}?U_xZw;q?A-O;9^YHU>0zg)Ed!1F_1~f#lYpbX-)aYHCn~S8R%6#X?|64 z7n_k|kH%Pij->&S3MvwlW@CZISkNqPZOVMxUoOnA!(UE0r#u)KuCbDv^W_|bRqgtm z?gWQ!Db@#u&`bh~BTM!w$Ga;BF2`7I8VuWM2Hg8uve+txji1WlQ2x1+! z3ch`khu5wg!g`ACg^+(OH*N2=Qn2uzU+v^3Fk|^!G-8+Ld+EHGR?AB2H=%}X6fWZT zuc{u-FD=A(Fh>le&;cac&tg@YV{YEsKf*LYH^LRD}*%0{E-TP44*KZ_+i*qd(OH z6|!a1#4vAMPzlVgEZ!c(j2sNdg_ehgYk&(Yd_}^$GS5g}12)5z!^=CzoQ6@;#e4*j z;w>!ZC+?UHKcp%s`V78rKy?>==s+)O!g;G(S`?t=AAlwnqb!bj$NHM_Mp|gqqwZ2~ za(#mH%20Yg=(bx0l_tLY-VP?~-BZYoCE({R5kSe%|8buq<$Vt`kDVqqn5dKfEf*gT zsh6IV+!ODEn&T+UccVCdX+#6J|4Fp!atyMQkmJP8umQA?xNN^0rqEjSbrvoD{U;0y z4_@fC(S6ZIaJNwwU7270*# zq}-q@D3#*|IZl~!U(8|pIgC&#DR%pI9l4D>R**!B%U3= z*3?ug`#kgR<+$s{GG5cF*~t&t&Sv;=>8rwM_or%|NOw3@M14+kEQ521J?dh#&=f|B zDfiS)9`A4C1n>vj{9m8>x3V&_FRr2zsbTXM=;JZ7%7g}9T>6vjaB|qJg?X(vBd@oH z-d2iuaPW@HD;i+$vD~#L0y=JyPQ(qD7bY@}R4J=t(2)AK%5oj}9t1w$@CF}hsSQ`{ zD=v9Le5-+UJ$!W|M-=)|obL@5ZFG3C3%#l3S|bEcg8o`72m9{{iG+FEC+>JHxt{+1 zx@NOif>B}HVf(@`M&ZCN$S6O*df>bHNur8 zL7$@tM(#P{*P!bkRkF+p5GouGa9nN!MibmtT@$cD*97}qlxeu+s=L7wVqQ?QCp?FL zCPO+n&tN#ea#%N5h+RSH94a98Z)r2^o6L_}-1nJ>nd#WJ67md12)vD%0Q5VFod(Tt zzn+BZh&AKu72X@*!IHv8p2Hd)C%r`R`UZ+m|J?tJH*$L)fRNit{65r^Nlh$-M+Q$0 z{%p$uaF)Td<4Fcz3ohKVNaef?W}y(^y1@`yfz8L$Ng*$sjF98ANJT|G29!WKjm}9> zP06NlogYq1!5G2puEPrp8{z+sVzF(8FQ|R;d>PnuCYqB-n}hH7LFngJ4U%K2U^>ld z5CQk+K#vrqI>fO2^Yu6ag!K2bVQDd}d-*u&Y?n88r{V;4aLuTTgOP^xi(|0s`fNW& ztq(IdS!O&Q%afwh8Af!Q4jxAPKfY{SF^MKEZ2p-jdYNwc`6*qh^%}gRhY?^9X+}a~ zIHxuOt~4(u!?3i`diJQu9c)1~M&iPb$d$y^H{8d;xaKhO5IPX{xj|7jX*jxjoWbQY50BwbIEMHL8oLb#@!EiXPX!N zK_eq}C}EqbI6N_cIABX2fN_-e?r2JUE)gzLaP{CY@|hi9P4uHET1h;jeykZC^oRjs zz{Mclu>Es^*>OYoU)Lh=yK=qvQKtk})KXNTxkjVZ#N1<6(a1{u`<>VzJsg7aQPcF7 zAOeA44|qF;mdBtZcG1Jr)s9TRS71hbh(i!!AQ2p*FpF%WLYyro1tje#Vc+YCI4|m` znqU*{!{X@=t=!+s1?}rSZND+~@I3?Pq9!cEfyktw$H3=oW~Dopf(A0u3F6By@5P-w)`O917L?XPF@}t!v(2txXf( z5eaSBc1`RoLNb8KG7GWqjOe^4h^!i9&`{?8k_*c7Yh0vSKj2SD47>v8<1oK zzkOyK>R2Mc-Kj(g3k&)E8$7lQmr6-1cG-OrijqiO@9ZKjIa`R+PC)WuwEr7Lw_)KX zOdW!7a3A4ObyIdBKNHshOjx0BnP{R*2$HZY`d-S4JC;C?wF=1;{w#1czsh6^!xc#O zn~7tFe7__qq!%W?PiJ%!i@PCD$=f{jHE9fMfYC9g;Dc3ySsEpK#&?_oqO zJ;*DPRI|6|zysNQ%2*NB{P`k7&mV#cUJj56WW{r)n*U6zhdn9+pgk#6i_Zxcsi6LwXalVVDa-7o_yyVd)IAHvQfS5{OHybm2XC1L z!|8xN9monUA|Zj64Zhr5(fMK=PJw8V&FUB}?GyoJBppG`;M?}DhEEdI`0!>EBNhcZ zVhlCxi?KjlyB}Bs@*dm_NXS~p1I&t_7yDrH5ri>8a085_t^J<}nH!U804SOej9m>z zw2SZ|g0nO7d`B-UEikENwAH=O2t=%Ag$TU@@$pQ8SO z$Iy=0ypsz~=L^f@yM<&=9bgIK<5o#4J2k&=iNk4iWC0wbURztY6CtmuO%nmFa)Z~z@1xX&d?QTIfByo3 zI<#psg7`_~FHY=>r0k4!KdD16==h1ZaQcjP73xmK;2|+F2x$!+y@B?ME;26uSYL%L zQWy`1Z3GRqeD=a!$)5-ODb(Zh@w%7u`Xwk7bne2~DF(_(>BU+u1nF)Cle`4JbT-F!=)c`RDo`P7aQc+p!|zA*iq@T_y2EFc)@@(|XLN zhIX5wZs#}W4T*mwPpEm08~!i>LU#GX3)JcVZeXRgv|x+bE`}&qD#Hv-&@H?$(3a8s zjikdKl2D|#$0iX34Cau$F@e-)LlIe=cND4erKpl7Gj4Na#Hs$lzNutywR(+^o4|M~ zOQWcvtuI5pTR61FdiN23l`rO;ZEY`<1o{>x(VTf#Q;BN0S4K!_lEnmmhTJ2W1=VHW z*cU3Vh>T<0PRGv#%vwm{p?p9mnEg7#t!@xJsK{84(S?GFRO(@$S;h44Xo_Jv9GiH0Jjm?33oZtf2A!H_Y(1)|rwP+_TC&h@jt7UjymhqoMLsA)tkm0I+VZ z9xhRY1W*^}r^N{qrV%K{VOY*w!F9Oh=j|&6Wo!&FRGanF^VVK?iYLB{APZw+bW?hO@^!~`^Gw|rdwVoK(?Lt z>ipyKL?bN-TG+1#RyZOdUrI2jG<3uE4q;WQEra-qgcVRh3y5BJH`nFKa zcJvKIXT5%H$H=HgLx4~=eRcpYUTNUgpa;Xcx6u#E+th@!_6M3qLSgXetp7XjjQ)|P zW+u2IR$a}i*CEH73K{X;UQj#W`t44(WcPI)*XOu_Kn%S4mf`KO^Mv&>5cF|KBVgpN znOXOQm0a*m3K-aa$m?e8h&$DWa}*Fdv?>0CrzF&P9z`3An|oGM zqq2B>&h7S63%$D|`h}N+FZd}Q7C=_F`|+YD%y-N4DGSUP5~|y@5NRpRoQ-PCGvY8EJ2#+1HyG0^ zg4z6q$|V?v#;BV>I7LFk-_{lA3YXzE> zi__B5O}rn!KC|_a-9Sh5v$T!=sQDr#?X*ytDKpWV7#f?m?JpSY9qDkc!_gDdcR5wL z>9s_JmMM zO@d`ZWm+^VbtdW1yQ5-yMDS=-fMM3BPZDQf@)v_O<-@_10xYK0k=s?z>-bLoR<-^I z#K*Wqmm(5MdX**;X&G4Q=(s_gL^X`CfUwnHumx`?sCt|bq(~re>L>6(Z~#V_&BhJ5 z@Nt;!{2nh-lOy0S@7ixO8=Er5k% z5ua;~2wBk*dd04N?pKxkrV9^JD%txhSoU{P!L|XX-KpWyD9D}y1?$IA{A5INa6FU9 zmsQ2pFjV1Gb9v1_&B~Q}dTj+_?UNM%e&1GW{xnrHcd!1`o?$^ViJfuidXVgbGQsNuF+N&Q%Qm&D9^ zrJtwvaTf4K1Q@m&=XN@pdu%;Ft4!kG)1_HcB{+^<9p`8WT$j(QOgSZRR?sA z@^#H1*P=Y;m>s3b(oxxk2Q6bt0^AK_&-kx-%+evx34|}FX{Y`K^CpNqwD(aygKd86 ztsm%e3g!2-x+0_FW!fp{?4Gx)t=sPOrPHr&3vv`-_?n7A6EE6D6P^tJkJ|0G?_WRq z9e&oJ8eF>20@K8b4Dy~$-;|u}9Sf*_o@n>G5UMoWGuEkv;vA_7s;fLnS<&Q-&D_R} zPi1*N9pK0gdTv;3@`cv;fFV7+zsygruA28OxW zo<$r@{UZ3Gz4d-?@XCf{-@?l!J)#3yr@bL4Q)Q;RFZ-C};CJr-QPRFdVro_NSP*5t zOA9)wo%l_PGF?{wyixl(+#N7WEWD|H#E&h)t`!<5_T_dNQ*`U6CA0+HZGpDxOV8)) zXWQu(7AH=#h~+JC5wmC0uUhPQ$ZQN?@Wm3rSEbRY1zYZ1YAX9zr+&rXo-MUSjo)`> zjDAPQAAClS3=frlJ?z7~pJ#VArnSeJl2!+ph0t5Qwvq>p-g|l9Jz0Hw5gzj0BIAnt zy$q+nDS6>X+(i6XtF^c@h?1<};;W(#2A%irfM#W8ib#Hv?2N=)$#2_Gl2r+=nS7H% z$&e!|nDLHv{f*D|H-+MmBGoA9#99u_t|OfcM`G{tWZYFV!rF7+9*<(gdSLMMJQEMx zWHYOHS`QGxi1${CwI5l*;x6V2V=*TtnwMdm*rmjk?e94YXdbOeSRCq%F1DV zROgy#07N4BWp368BXHU;CPDog=l1oR*Id$HS2i9|{hNG*7!l(M=FWi?Y2gHE1(>}* zLAve^%H*i`-<)y79@}-2e~ROKLxjcmU8si1*1Rg2gogT)so<%dJLQBDSc$GcDWnA! zwH3DzEU#cK;h(=$lJ1rKqj3RM6$qY)QC6^t^RY6DLN|vo$2!W;6ck^Gu1_AV0|K=T z)J9HLI4eGf8y1WP`vQ3xQViqTaOu3?5dxS_ffFd|haG7qhA#xK(q$1lqU&4E(3rvU zjP1Q}zK$1~fs(BC(b7M4n)#TDepj?DB)Q(z#NHbn9%IQ|o&|7`6?ql0p`Wp!k2V|E zmGFFR4)N9)#LG7hmc+H7RnbuiP}=WaDOqzxFd?T$T_~<~e}#l63AlcjKg^t2MaaDI z5qRNC{C<1iUe^T@c>D4h@4{o1&GqW1wG9Z*26IdQfPi%dFt6{cp8$7yP|t&&{~{czMBK+e z#*f5I1!EZkSn`mueCZqxkB8HKjFIE~`XCL0-3xiHs*@_hd#CXO2 zJizQ2#}q8e-?WryXY-L%O*Aq%7`MGM?~^m;yi3^q<)oaf#0VpgjK0SPiYa6LhT>IP`yM|XMIfOrfYi?22l?_<@W2U)aa40HXOpNUf%CssaDKiGaM|?{mh_ z6ufU+AA@NA8+i2@h>M{YiLku*Q8g~2j!dCTH=)#}Zy5sjrKN2nhZg=XrOlkS85xY` zLWtM7H^vmVhqXs_+%xpmWphLugFV7~I|{fiZdM=zuBnAImSWk;z2NC{Y+0TTd&HUH zuFs*XCwc4d*_hBixpn7tSH3H}=4Q~OoRLNIEX_J|_20?}n!n(jA=n>y|2eBK(-)C0B!XM~e!%A`SQjG4(Nrx-J-1zfbo<^oS#RTl0-w>&2G+ zRKYu|MqfqzUZwA|+==ChQQ&@NDu-0I4Y>3xW_(>ig z39o8H1)lrx=)}o^+v#(QW!7C8lP2udVNdZuMHuI$lv_w-u7={;&m@wUkwJjMUQ)UW z<%vktk|;B7@LKAtAy=~LC=8PM!#C?{|A8<8;m1t+VW`!N(j~Yre8z-v2|_c#*y%!+ zI9{8EHAU0Au0&G)gz`AwtLMtUrO7QJ)GJM@nOOQ&491+Kpzz;qS9CSRU7! zFJHbP^A1<`>r&;6Rd{R6o6Z{WkwRe^jz4TQ{}$pYGp#|7(E-DuCLP^Wb8J!c(97Sn zT_RdaM@xvtDe)UTvKhR_kUV=I>Fef3vLo8cS`B7@=ceKxQm|Nx_(Aq$u~R+P*AL#AX@J+M#a`S@H3z)bktu zcl-A{3J&rZ30pa$HAJ5b-$|1{%=vj8YsZiS!~xg7bd`m9hP`lDk%@jv{nUuvf-dc& zfuq=p_-;FSni&T7oxe}B%0~rZ%O~z<`jiKVa@!$=*=DbtQ$5RcAyacF;raf3cNMfK zBP~A>SE?ZG;xHwcuG$RZ-W!zVU zBnLt`GR{ln>_xXc_gm81`!dNx-;>qIcqVWXzFGnkn zTHe)6d7nqrA8wM(gts~fs{cNl_5!n&=FR7+{EoC#Q4@v}Tr z%t(-MODc2CAav2=Bl|}zRze8Z1Usk-!`!j^*>v#jFgKa4 zYuhSWw<^P^qUG~%6tn+SGbf;uKzS?Ipei=}><&;o+!E&2Q%=dS`>r|`Q~6KfvoddV zLU)@|jtKsCPwI^9yiDU|38S?_QUbq`@YAMAx{ZMNwvGxuXq1(LE9jz@`(5P`aJK(> z7v{9gEm3FLHfKW4Ii%9R9_jETUd<%2)uq`lL*gzU@xphsOTlp*-16n3zs~SfgL9Bv^OU?WsDeoykm^Oyb zbdjFIxUB|Pr26}BsUA@mKPEJV$Fov#=76g?%$%uvCGR@%X0zc8WZr-fWD3f1XfMe% zWrp_pHRF#U>Cil&giBs`4RHlfP2dqgR$fj@{{+JOmo+h?dtbCHl@X>Oe|NZuj`LF| z>Z3)nQUfj|*L#SXy+-i{Y=s&8iJZ>ii2;^nGA{zGvv5rYv1z)-hh$X@l%3$Rl-VBc ziqNLe%MTL&ly#@n;MvX+7(yTLy;92`wUk&v@1~pb2X9x$7TA%UP81+}p+AXoQ1IX# zRpe#mXgT^xWMJ6ZbyE%`GuhX?4Z8``a+lBEZWU-hqm7oyV~28miS&v7e*4#K+DH;w z?S4cPd3#~-S$Yx^!d#R20UdaUIjw(8@RrwXBhl#68b z>63szxfTxhNHI(4x@HTb1?gOwj%;wqLNqW0!x{>cdv@hZk8zw_-g(L?IaHZ6A|j`F z5@^kEmn<5KMteKw{ecN5^CA-%3{B>f)QM;F*9X@VQlJB?i0Fo6X zxwIT+`ecPDyZCz2YlWZfhY7J&5irH|a+aZ1(!mAWSZWc4&!t0XY{z7YNPG!o@;~o( zAqVtz1fO2=esmC%jW9tNW{|weMZ(9Ozz>K&A-IeJt|DWm#Ll{-QiirpP~i-h+R}CG zjrHY+m2-sGu=a3f6A<76W&%+`ERpV?Yi8@s%ySuR`zhVbhQA?v!F-Dos7 zf$eli;c9rn2V?bksKxb*{|7BW(!Pp!)9Jwgnj+uS=b!xar!{@FiMb4opkqcQI?U^+ zTK`KKr7JaU%@9d5hb^)R&cTh$e|9C(aj#9sV8UAf;i&lXBCwEoWFE?y)FmM|s+`60 zV$OO9Jb1?7Z5fO$K?|0f5q-{0r_I%4rYL=%(Ol&y%%6z7vmRR%97ER7FZ}#xlng^w zJfvj3A}65!KQACeV>4#j{{sxdjL}?@sw6L(2?aB&4I+c4qy^-JS^Avq6 z1$4yOx{Bx1mcb`_9!DW{VYqU?EgX%@u58zPr~%zDq1<4+k$Ti&T0$kT*3rRK;o;E$ zxtn36R_c_#qz78eX&(VCRNPG~zw{q|F~LWrmfdK8N=XN*;?qa2=6&T`BHRH{s`5M~ zZ|V^W9q6u%7nJkRN5M-px7m?I~f`&+%y|XB)671n~CJ!^0DO1ob zZEsC}&Bcu+asz1oTV%?H^MZ!0E50Kjq-XR{hjm*lLshfhWg(8aN0xS?hHo+RV8W>? z(<%NN;__ICmr0_vDCA~Go%jbcGn%t!VUq%bLc<^v6ZZH1&ff*6g}tB}m1G1X!jJ-C zQ|#rU15}hGdV0S2yA%l=&S}w;MrVF?%!@YyLiM-#1!&O$bxt@BmGBAo!0d;s{i+GT zW?MOjB#St}jUmGg@!}$691AifN%6OHgTuF$(c+NOF}ACo5Fz%{EBZNI(JC%hWSBIK z2xS2215z6WPm&+#pGJ|_hw`*UPSLsxQOu}?5Y!OE3j1v`n^s33Bh3N!*aisO4OBQr zmbI>$HJ=-!R|=SZl~o>xQ@##>u=3mQAek%&4z@(bfurdN2{9%EuuT!EG%uCP0^$pNM!ub~E$D$se0A|*=DLjLMvZa*d+hrcqhJe5T>#g zT0rz@gLU<^nSplGilQD9p>ktaiJs?9mA%F%%iA#al0e#c&<+ihVS~{yGfAB_NB-Ud z2xpU6C%$TegO~%sOEWI|H!s=bS~XQa%|2khe683+DdW*hab-+IfkxbdA0{gg*x&$p z-JsN9IEFAAMan#39ScZi4JkQvh znm8XTwz`t+OXkruHfW}j2t71?Eu??=gC8>WFhJ4M9@7EoKt@-X04qw`oY&WFHe9qg zkh+NTQA0O8le;W2m~UNVM4`uWt%~>S##g@dWs}1Ftu0IbR&qeyB}a3oiJ8w#6U{3u0Qh z#dJ$4B#E(WlD^Uhc?01XMujO)>A@@iAFWi!1BS-6@)uGvU#T*qSXDg=lvdXUTHz1R zgt)@klmIiABiL3zoeArj6td8kuw2sNTN-uXke*{~?T)bnoTMGLXlYI@h((-xR|wIk zzw|I68cWRuC#}gl(Gw`Vj7*sbkFh5D$u9>5=~(Yh!8Y`OAWjJ>4BVtRu3P57=2@SF z%@El?soA(RmcX=BhlV^R9i5KlZ5uw!R>GcQrsA1aSW3* zX{rqnUTSaRFl**2FHfF8t#W~9patIt6=1?NtnX;aGW&ly7vJrO|nr9QN8Rz2)K z-XLFwBlW4tsvAdT95y)Ci$-CXW!%t^I%cG8hha^$+q#*N!fYBPM6*?oUcw=mr$jRa z(Z~pw#;jq6da|XP2JHK+^#bvTocOeXXtO?oVrDaOHg=`ZkD9e*6oo4M+WO%X+FJ^P z7xN@NMvvA19thmhW@ait$Y%)HZ!+6kjF;x}luDzRk^(Uuh0lOYbI(IB0=VLuEAX&A4phy*+3yBd$&y-%3Gtt5t z+pmdo2`DTTW>GR@0m7ngp#sm-O|w8W=dS=uo+0FU0Bvv&F(#rK)s0pO^lECzq6c^~ zA?-Et440Jdqp3TPV@hTcCM@|=$p<|Ggt?nkXPJjn_z*Ng>kpo3$a*p-yk!guf~rc$ zkYX)jntQF?tFh12O~VO;u~K>)Ak=QA*Y|6mDP;!UWBfM5=T~J60x)%+87M?uB81hm z+X3P9jgLh|dca-+)PuKcXaWk6LO%r#c@lVUO&Lv}wgrnFVyf{N7m)f670jNo*rUq~ z%L+4bb2MU)aj*S4shbuIJCLw|f-)&;QR#UBVQVj#gy(TDAS^Agt>kE4zGR^p z$kszvPg-*^o=N0fVk-PuhRi&vS{*}wz8&81Wv1@LIF(?Nb5Qq6Kg)+sy2nM}H1p1r zVx?dC%}J<6MM?CksVsXf2dkAFl3v<^e&+Gy-xM|A#242u=)i|aa5PkOJpM6!&2fT_ zRF@Lu2`6!0bs!fUOG7N1b2%PN;SwGOi{5e;09ItGGIde~IVB?Zm(JxJ=?PAA+2t3s zyJ@zB`KP%sa4^2SiDXlW;afJhT`gUQP}aTuT5m^7Z_~FaklDn=^NWni#>2DU7#oKQ z^ood?Q>4f=R60k52$$!NGXwb>edqygDYPQ`7``ZmcaN@MsZ3hR$TbK7%#>wnMl>|? zThF&cWpW?OWTvKKfsni{tCv>a+cFOVB)wY2aiUOxm#a=J6%!ugx+&lzHmQz6CsBi!wd)naz zFf)=;wh~(yzKzK}EFYu|JGA1M!YRJNbsoT47@#YQ2MRV`ZW|Y_^RbAS?%`f9o&&-kx$SlF zt=1lrpHmG78XZh$bm;u(1zY7UXk4*nK!z_uJ~Ez0IEgTmkSKRQ>Jh@Te6 z3QmYu(<9F;PO5myt3cAE*?6|IV;;D+o3pY4LRm)Y9Lh`~_65aDjHGD7)t($f z;zgPwOV7(MSnJ(pK|@E|(_8Tyzij}aaS4{U+OUm_HATZRLgglv&A*-OU*J=R3qvyV zmnjpR(exk-=in2+&UEKJTT=}K;|=C*avE!kLTvS*+3ztu=ctwV;n&jO)zjSXY>S^ibRRE!$^N^aF zO@6@`zjj%I2zSKP=#*@gA#-7q+yW4tA2=cdw6r6OTh=n&2_THBR+ciTWrFc|=Dg6U zwovPwu@+Z!+=aKw2xYk~SxmNDzs|7%Sg2I+(iRe~mUQA$x-0()mlnrOw^$9vmR&d$8d}~xe8-i-ZOsA&rY~T5BC6fUxy2GaMUzZ`crd#0thSB76a(aguN;Op^-K2&Ybr{ zzSQ5lc{YQKB;}fm5_EakGnG?>=ZCjVuBv+R5)fX7%tv8nK8iD{3ZdGOuB=nH9x4;q zP<$>TFtMc6ktrzCvc*!gt+rg!;)B_XG-odO0Ck_E2C2jzjnVNx_X5HWz`$A^SF6#~ zW`A|5B-;`qYPS+LfD&`)v6fEGn*Wq2L(MXO1$2DydcJINgcT5a0IQRl_`y$WG(oar z^Qg~q=L{bc)~h*Nxb0r3Q8G5w(Yz>u_V%9LC{v~92?zA9a-_X40U_cTc(S&gr_hr{ zYIGGeN?%oKB3T&ZT+?-{3uqem8Ffr08u>=b}5Hn)Vr*%tNuf;H?5+&tzLT3@W;6t5gw@#cf%FMv)Jw^ zQ)l9?6%eX6U>qoYM@tILwvekcVj_`cn=dS6PRnmffh5J99INT#6u`e0H{Fsp)+I?O zo>AH*II-Y*$OLCu?gfM!$R9u`vhfiFV4-bb}n!-||lT2MBZP2{r9q zjSk>xKR~;NWRQA&1uBI$OAaK-;6WyTpw4=Tj=XK7rdUa`)yVw9%SaL_1s6Lx0F=_P zBS4tPkW;c6U`<757*#tb@bn0^Wn%8jWfVU@hPqg`#Ol6hbSgfvp;r1^YEC$;)>sMDR5(}k(sm=5aJ5nd<&j~9Eulgk>=+Ggm^nwfKPBQ zAT*~%YB$3c3~pRJBmR*^V8X+w1YW;9-0*9wNF4ZM9;x~)swdb?~r>{|FwJh8RGf>!5cavISmHp3E8 z*vd>U+BncXxdOtvq-na>16u5vn5w%XtjeNfqACCp!7*oi%eQ7zP=Hs*NcnyU73;Pc zp#{m5IookBAoQXnk+?2v+pkJ1A>7&5>7Fs7c!k z7Q(|S(VsFz%JkU)Sn!@&&LVTo)65y2I-H=<;Y2)b9=X3!j&9hKY* z2&GY&scui%QXV=WfEJB_#M2b7TNA?)I+LQCNc2Qiiq{bBHuSbTCX$*653rKfjoZ}^ z+zK3Q2dBkRc&zBT5c8H?fImx`@GG5`4%`Yt6&mh{uSnYHl%v3q2Y6`BxE_{}Ql?l6 zXN09&Ob7_Mqjede9D_tMimiZ9rf4cXGTw40r-a*%fD((JWRuw<)K-+dDeRQ5;+ec1 z5?4xBho774%j-;&6x41Zk!u0e4f7X(V5xP!Q*N%yv#n?)M?1*(5l^!iVaGc#FDLBur6XwMA4%CpU~>AVtU)E>S0BT&6GHwaj{aOrxOKOQ${=Lpm_82 zWLuHAG@S1*AQWj1Uu}RehfL~`$2zuQ_MGI$^VLv;3xaz2KvO)>jE9y@0e6iaU`osS zuIE>cQzS)U4|f7Ezd@aA$Kr&cYH!WH3li$xj=Ko;_2L@)7#+oxOf!&ZzTLR9O)KF| zX;=bHWD53A67@u#F>1_=NhTFJsqf~rR$WvjtZ;H@&>Z_DqEsujIHk&c$!AreVgp;; zIK|`^{305cE^L0SS8z^kd6+P!34?+ogQg%246{wz?NI*2$(ZngvI4?Y4~#1FKnhB^ zdY5KxwdN09%we`vy?VBkFzniy#w`}5cy9rO>vVL!U$<`X=R&#L5l|~2j8I0g(j;V< z##2NSnqPk{AfROGB?hKL^qH85MQ%%xabvyeu=~&*@OPTysrDqXHUo+c!ckUw4P-^*s|74q*2*wOEkCyXy3K_q z;)>BrmK^HRjey5vV$H2xo3c(L8?+pqA;vQNIZJb$X#&CyrZ6p~wm)J$_o4cykP&LC z@LUJiD*-mE*11ym0zy-H6%eXN7LWResixae=COzH0SMpEl2z!)lMd&#CUX^XTm^*w zDSNx4?MRehSb*?q@w~0Z*#p|ynQZGF^lcILQ_E;&jBMp9Ae;kQlnoGS>jV(`0A^%> zNjojmZin^BY_RWH*;@c%B$`#bOF*cG0O5MZ@c=?2Is$~_Xr9c@Er3v?f{vzaP~3Ls z@|4Mz5rYqJv@vfrU`K#3f{TWB8h%G&_~{lvxZXpE2t|c?ExtFK+=WbjzmENww2(H~ znEC)A%B+dR9b&!#!g`x6dHH~F<-HXUw#jE)maLjsPj*P0_0kxJTV}haK(Fov2wP7+ z0)&0f__a7p+`xbhscxtL4JAV|z1xKug?>*~BjGOW7b9^c!&;NzV9~yZ9IQ1tW2L4=WvaR6b8E~gY?2x_NN5hJ>OYV&khKYvCddn^Dx@tbC%k?tgF+LEw!ea+kJot;#QsW zi4=3PHwpv*0yEai0FSPea01+A06JNKMb)6-qOG5>V)s!&J4bq>FkhUkXs&eV=yM4R z%LERVx0DLXdgjQ-2=j2^P$}zA-bd%WIv~_}E0E%hovCZZFM7{;V}=$D5t*B@T?ym+ zbb`fXNVrV$qy5Pi$wSxva`Q5&jS(O$hPVR4mDBt)iwr-v1;FyMFOL8r_Fe(uRvv)x z0SMpc(ux))#`JCZ@Z~w=7>O!SZ8I)0PXmk44O42w4EUO^tB^5vVh=~nZ=}CJF zuNG$5V*x_@i!xnxatitEJTY>(4P=V0`jv=w9lWhm9BU|o!kywvXxSL)rU8UrJOYIN zxq;`(?SQbWz&1cQpF;V^sYTg0}gA+X9f~07_8zmlF~xv<+%W%zi57mnt19uoIAb(!u6S30HGeXn6GS^0wvT9{-1*r zt^&eIG&Qu~1UA#{=K_Sv^8!NU2oTa>YZRZ8nttvqes;lJ|FLiTqf;mru*&TF(2*@# z6i|CcK$sFJDQ*DaT95chTj09jAsxPram9o(u07l#!}XzD;#naaWa68Uz?1}#M5rOz zafrYcSvvxRbvwnYhD;LtjLq0wdWixzr&EwO5!2NHgmq&R`KJLwuctOCit6vapIAKt zM*MDeWu(MnbhRVyvbo)Y;BS0FwU$NMYG=D%S<+qsMYOn<45)LMx>Hv`ffbmz=fr2b zsHub2j|z&>hc>MR2nAIGDp%=~=xIyeq~WNagd)+Ak5Rl>a8@^ppkWo?JQpDJaJMX) z>+(6n;l9kSQFK;uyQ?sfpTc;xMBzmcJ&rZwNAm9IpdcTbiv_gk*R0u{6tE}n_D7U| z{wjb_6If!rf~(~L2p@p(eJjO0!ZUO+EnE!d7C_h*CXAl>Db?EpM}RQ%L%MS87|vw1 z{1Cs=kCaPie3b^Xl`))?AbtxVJTbssKkbOoponTe^gBODs;AVSyyRN|A)35cK$s5l zS*Az(t-HqRNEyvuCO}KCx~Ys^xg}*3ZJA7)qnNZV6cz)10w65oOC%M>Yhwm;rRQZG zcdwD+pYelV@s$io*oHq5*J*12VN<|^SMz4@UKc=k*|$qTIG1!;%0RbP)FV_UC`LV> z`?BM?yCre};kj|*9Mc$qIuo6{b0Z+kKl5&mZwq}VZNUt4A)9SEIZvgW`2gse_b%G* zr*{<)a&)>fq3riz+DK8Eo61)}xaq@DVou>-$9@C|RVCUTI~@T+e4>@6{<#2QEvnG3 zF)+!}#0enmv>wkZVSeiFbp(WMoSSTCil`mAN=G)n`lL&tbYo#^ zwJs?m09M(q4J^hA;WHvRKfs}Ho(m8r4m5VrWWGn6PA9lvg*>D0!*#!CIw|WJ@T#?XGJ_9KvkLWwX#7=~kxxc)h-V&j8^HhR+X`>7Wh( zuWc$!8eMth_|9>umPyOa_`0w8T6Sga^UF!Cv_uyEFZ_``3l(%h zIkRoLt@NT>1q~5FL96&2-9%gcm-2h&I z@Fc|%KOjX1dpayM$hTfQ;U^Rz>|?4gYh(EFYDwwbopq~W?t*PFYs%=+gi6Cp-VqiV zTb;H}NKs7j4P8NS(iWcNNmwf&R*> zw`YHH3pf~<=*4(PDWgRtOjdDvthLPuRp0&Zbhvc8R%X2TegVSmj;ANeP@Mt7 zfG$~cA{Ub}h2SV;s+@(^-a!K5`CNc-4pKtEBS6>+VR1|e9i3$opKql}G4CDPDTt;I z&EPWvLT@FfYMWbs7>iESNGQOGqEUY8_Hagu;F!}X)E6TA)nAfDQ+09Wd1~}sfG}gx zMSSh1lYbj*Ryya2TGqOHx;g^;(d~{H==hli`_>z87Be!60DN?qzTuNBT?bBjWzO6- z?=e8PH6+U`pL82O%%cO?tP-uzWC|)#LB3C=$6!bF=_Dk{y1G=D&*o=MpKmpCUW98MB>hfBCz;m>gh!_w1zLNGxfZC zfKUV)sRJROef#YWC*-4`-jul!i|U|NT3FcRR9ofsq2AitBS45&q^}7&0)!o8-+{Ex z1qk!xlx|YRljv+*M}V-Y0Yygk3(dTafRLM;f@&`Kj=CL{ENWR&jt-TYt5>~J({b9f z0K$T*EwQ$(R8QiHDIzRozNpH&3Qh<^9y!D`Lo0IL>eSii1%#4ZZ=4}ExU=|Xo_{Ty(Np6%#t=Gka>JG>?%!BOok!%?1Ip0R6u8#+%W$nz0HJ5&6p_B#c4; zG=nI5I8gkE|1DN`H(+P%MRPJ$%Bb(3H)T|QR)X^YgbzUY;!37M7@MUp=1t)eo^!~t zDus3+K!b#erruHkH^)LM8XHy`gBPndS?xqbzn0U*pEyz(s!AuSr2Mh$$`K$uQ9V>@ z=VeQ33g0SgpG%Ec&##|o>p39wz`cM_)9)%EoPh}bp-d)?Hat>HsXW-MNWbSH!{GN6 zs#zrspN$Wnc&op%^XJNJz0!eO0HJPcG)p%3dUd-!{*;{B<9IPT2noJfH#T<%gyWi%W@6~<6A+fTL2*!aG(yRt%fc5 z6~M0AIgBov-vtQQl+n3hU~?w;+2I`hSpnht%)Nkc3p$j~X~7|_qB-lsM;N1rEpDi% zD8582viz>5jOy6C0SNUx(TGXfA`y17Vvuxi8~o<9sv-i<4hZXv;OP+{#M^q9BK3I^ zwvSTgn8;8cNz~yf>$MXKHY@3IeRnno>h^l=#L8DkfUrA1auU|fnSupfk-FLR295$z zI7PR~`>O!LVzTPgf&3XX;jyf9WSvSTr#yVUwLVrNG=)%#Q>yhAK=Wk0rQ z5csi65PjxmuLfJmTa#YVe63e2*HF*Lf$J&m1ICVwR6(42u47iVS=f_XlBRocf+x*qppsr~uYcB9S0)(abrWWQ< znXcI|`x&Vg58Ll>1PDDAAWTL!HATuIRC&%@VD|wIAAsShyW*@*7S7&goYnYh^M*hOl|SbVVL1z&krVS#kFeZt zP_}`0gKTORnCcz zk|CKXb9nLy{>ap`07Ap*zH$a#sH=Pg->h>a!&41>7^#f9R6n!MLpP7v`xhXQADDv8 zj-%e3=S(h`Gi%P`vqVoCs;IQ>g@k20y><&In0k_x;*Iet9$Sls=JmPe?#R;BH?u&c z$KF1y2S@vLd!8=h4|LNY_TVQ7s2u^qxT1P)vAG_b3v9}vC2j&b#-bIZ%iWT~?U~JA z_3m45yxDp{_twsyz^kP=QA^y#xs+(dQfsKd)_O6$pRNKzBLxV3{{Vy!K=`^AtjSeM zQ&Y!Qv{T>xG*^2k3F~dnxjTIKLL&?_1yNQ>&icA~Q%%-+=m_FU+X@OM%yTQCMfnvF z9_$TsNoO-6PBm|AW*f=4CW3sEo0RI5%Q3M!F^imuR;4oSO6`{4+q-uG!YQ)? zmM!VO*9#D?s2IhRZZ?a7+Xx!{D~UF*qWXh^IU+|Zgr4NqXXNlLh&5B$>q-~CE1g!~ z0SVcAW>|+iaE}cxlK3tZZ2zp@3+s#E56Q6wjC@pNmw6O5+Ai8k$Re;sb55*^uv2)=nY0Ac&J z_}}`>Ss!;TwJ>~`Pi#SBT_Ie{(V;Sy1#+(w93NEDhE-K@b6ZqTwFXh*$r1b>crRB7 zHODIrx|=Vv7Avm6DdCcNA@Oy#jlp#*9bP46bS+1F2#K&>4P5Cg9QDW@0Fy=*);`Z& z-g8FU69A!5MK7v+Q)s^V;^)7Bow~+`w%LS;qC-*)Km*L$9o`N}`j2X*F50OK~rbOzYKClh~$Ftq8t%fP>-WnjC;`QZ83TV5sML^1xRVbFA zX~<_qr~Yq_^41g?BJtP}AdD-@l{gt`B`ul>_Saoy=FTAkFqL1K#dfcx?URU&--JQY zCv87h&gPV^SquhMX8Q-e?sp)mp!0Ucm$oMRl*VhNal5*#oDm3rxOXUg4hYvM{{tL8 z0O5-$q#{d3_Yod~;V)>E{1c%t8+|8knlKdQTD@e)rW4U``0z*km4Dxf6tf9CY4lG& zk*gy8d?2+I1zZo6v7L|3rD%8wD+s(75K7hPh(GQ^%6c*hr(^)SPlDzmu~bjWZg!)k z;*AKQ1{>7dDctdv$W$_D@Cksh>>a+H2i#?Z^5ytxI=5`}#l3*=^6oM&I07QI=3o`A zH?(ax1x*LTX9fB0X|Zhsx1Wlpv-j$m;OiJa+Fa>=>Xb4E(WGReJfCY~UmxXbJGdt~ z{c~}D&v3hS)lY4QlgnXV>hns&abD}g0G@g-x}O)NE&n{Zt1T$#)HTG^x3Pt<3m{xO zz$w8A@s))gl#io^IPG~D_8wd1?-3x(cXyP6nwe@n6nQagv-5Bb>?*cj9ftkM)$%Cji1($Lp4JMV-+h4&0*S{2Nd5 z>P!$(#Taeisj68Mn46}<+rD`MAcRTk^ARA#CxINbNvKA&f*tkeX@KzZY@7JMJU8?~ zaC6b3**Joev<4xx>CvoNr1JgwwG-Zb8X!bQ&gffjys6I=R1R@4VRAMIxpiIk?uVMgdVW(v@APhVIo)c)iZs;u6YKsH6n0& zTg5#Bge$FH1rVxg&0x1?NFkWYuE?*4dGM1DIlD_HsUetg7a)Xzv;Lbxt3}In5rk#~ z9XGInpIff)D6E)&qG0`#8iXzcu+WwoNd}Y0GLyc7_>2W|*-)br+?A0{rsl*{OPZy{vf3ge`3y&Zu-hpEmPdf+ zXuCmo&?CEKS^;PQGI|3G`B29;pM(PB$l+)7$B>Tr%2m+w!Guw)?FM=n>+0kv)p@ux z4iUtXX>1eeW;0PMr9}|@WzO{B91wo>UegC4d;r3iS4u9T#q40l&E=WkY5F=op1ZI! zS7b&c&s&8{TUHXXA~PK=V`+|qGUjk1XS8HzTYH9dF{`Pt#IjcG${;gYAYRl_%IGbC zP@v1N8CM1%6S9pxUCh;XR#jue2_kqVu~IdbS<>LmdA!cUIDPel)%TS^`=@W9`~0RJw&CBPjYz(6{@k zTZ%+sAw7$G8LE8x9_E2b@og2cosGCf53@0&Jvou36^R;H>uU`ei8dMOkVcN}s zyAcphk**dc;XSILV9G|%e46&p7`P$GFAbW8!Q!QX)=tFnp@r)w0K#r(_1F<0EQhKc z;4S#8JhXguWwLS(2siZ=!Bh3ZLskg8v_@))L7Apm9we2Yefw>5p|@rY858qu?C?yd z1Zff1%^JlM03p}BEkn!-vsE|p$%dX$z%&)bSBgGdEtJm@Ae>9#yNprix#sbCE6KC# z6-`>qNw}VT%IGF{M}V*=D=p#`ZShxyxV`BcOz0IjoEkKbQhVrU;o6Nco(u>#emeq$ z?Gg+SHcgi0OSHjbEO%L0EWr4UUYc{7q?#L zTQ92HlLgwsxJ&cZUs|=opbr{f0b!Q_>jvSy7Z9q18EvaemtHU^CCh{f8;)-%0reBW z;B>^iq))w?Gsa*fvycc-O)A09>GMg`MJOGBk&F@IO23)SEp=JnBE<#>PsbR39gA=k5K%mqv-X+qs z8(pT5&vvtTF?Q$hQ6kJwkdL|IPWe8+pHI^TL<|paUi>l@Sq;fRm8|y=u4?N95Y~qc z6tP}uB7b4jj)dM;zzBTG4i2PP%L0N-#044hU}3efUgBY%fweM(M}Y7u8VpkMM^`|o z+RNzgY!5(WdKps6{)GugN8AMno8qlwh~_cwY}Y-pb5i)M(hPAJZ^|^|T_SM+3_rXh zAS_Nl{Xrj-jyKw*>ZBRw8Ra|1gUh9><=AAc1B7{ylX9Fr=cwMUfH2-W0)(9cSCk!N*lSwC&%Gix{eJ==grzq?I2&%KRdD>#OI`yRd@3(Fx-;}+tWwG!{g;IGGb~@keAv`(Gn^3QSFnGVsJ5bbVF~$Nv zwCXi_qt#AKYZP1xHokQ^f{*J6_+Y}+8i_z0%oacU{?!5DWXesU!JISE4bB9F4rx2I z@9WI70K(SUx&hB)#M#QQfy?wpidi1CoQrAACQhToFkbLX&yN718GkY$R5X#Er?0@X z)YMkekWT}I5xHX+{Us^7N|WSA(wyvzn4?knHSMPcQ2_A~JWoU3k}s;1dAkC_ZQ|m< z7ITgOVYY^8)2^ywPLd_XQLo1A;!NEG?Ass3^rM@hZNOs#gqIt1v)vmYtclAj{x(2Z zK&KL%5E=-_>Nbr5ZwT!TCM;74zfl^*3MTaZ69Az;6rGeJJIjM?A0^MGXqx6ny0(yP zwiO_WZ`(gytS8R5pDhV0rl~pnzXHOp=_+f6?05jjqUybXkhrNwI+aO*i;Sf+Fi~$X zp$7F$4~ZcS+&2YouIlqVz)6Whd2G{Fv4X-DZwpvZ>?ld0(KZSy(Sg=E+lEjm>Ie`{ zB>D+}Q02y`wz&kt^i80l!0x>6pIBX2+wfT$ls>bkg9+uka%tM^fZxceQ3R@|lrC$f zqzHvV*jYD{QXYYyRI3T(l9D!na0?t~xK}{!WUYyRg*TrFmx1nF;`k1A5&Yt z$>U7f@xbQT@ySX8AjyV@bJ;0$a_HgAQnmSOoo9`hc3OR!NZ5&}6FlmYbv$vhb+3(! z0O8d`Wm==pUXo{KhIXJt=JNeH#H{5zVV-*1Wz%h9W-|G*-c1Lgj7khV#X5!3?@Dw7 zKLUi5X&6JFGp>5Lh3mTGD2s*cfnFWp<}xijfO+!VvE%G^a2X$+noGr8f=@++vg1R; z!=*hG;7tAbAoYdnJlc}(%TTTw(uQC8(wB{E%^PH>!0h7$A06aVB(mtf_2Cu? z{mKAr_eNA9Yh)5zwZmz;>UoXwc&ZSgx`!R?X^fTD8xga%_;XFlkuzbHBfkMZsI#Rf z&p+W#mnOx@0lB}1eOFY*uabTugZq% z4*m8vV?|JZ7HM08j<#LAW>6vL+?uO}aB*T(h!uqr8pxKW$WhRZL;x|T%&ABkr2(*0 zf6IDki%W;d>nefm{MC+IKv+Gz+$?0sC}ZqmF&i43Vx$zN*~#IiLoi|DFvSqK*ILOV z35;=?^}%d*Zhqz5(G(FNdc~5q5XnqgNLcPA=FwJ2zGHZr`kbdy#7T5DhmhB{#P4x+ zI)UppNw)XOSFt(bY$DnV*ZmU|H5L-xK)}FxfKa2lhX+jMQ835=jVRei`~ify&a;}w zQP!66&Q;(Dj+ya~N$<4At|q@Rakop4I+s;#qBfUK;Uq~?2pa8v(TK1`{a`0Z08hU4 z#+wD&^rvEIWv?Ze7P|yrF0VJx83qEm$_(WGdS=6fVN}?IjOdKE@Y@CmXWi0?N8wM6 z$|s!j(iCk4WtnEm)-!k`X4Z4FX-+5qFlOU|6TlOmIRb4I%)Auz9>@Y=LBv-cP**;$#iQ- z;I-OXMXZL3kVIxh4Y(pyZ+`DR&AWI3_p;!1EFmtCAWRnMJU{(0UJ;_)(XPFnGLDCz z&=BISl?@QK*d9Z6CrV+UUeCS6^VF}!LnJEOWeWhQ)?byBY|NVqA}TfXfQ1i0_!3L^ z{P25HaOozpmx)T>v3Xoux^g=kh4N9Pn z25U0ayn&5yc-fWQDLpsv+=UdSrdv?58cZ!70YaQ0h>(p`a7#N0H%CWtOiq`W8JgiV z(T2vTfQvu{f&>FJEeN+Q4p&wC5}|iAY=Y{xf7S=DYekv|A7ulCCYnC2KrX zjNxJGV&W8FJU=XdXfxPtmXlqUsA?{`zFKk$W=5=``gkAkNt`MqLyI~0{gi&To>M6AWS7<0qf-5o&m82s~C_{u$H!uE9q1;+g zHxZe$0vu~syB^SEnR2Aq_TkT6piUo&4Ya~UZkZI5o$fI-iT)m&u1<3W1@JRWm9bE5 z!bOLOxtP`t@U(H1-asGaUO))hGLe}){h3nq4eJWmh6Xnuy&eL|O}YwoG9;D=NS+k) zGE(*D5>Og*Yi`J}8MOSELlO?GTn@Mt!2>^?OkTuC69Vfj)XDWN`kXu(sn2yl|L+BarRLhz z!jvFUE8ZqF_RHQ~t*z8(+BIyfClwSrKB|Q@^hy)cAq2f84O7dJR1(;iQy#wKnQ>#XvAWT)4xen z1K|YdK#q&C(3|!^>U>K^RXAB;;FByhuz?y4J$jM$(HtY8hjYHj=)r=uye^hiTHw*8 z*v80#&|wJ!#z=i!-h(&DmI6XCNQsKcc=IW#^)2P2a;Z%D{bJ#w_?ioI=9#U1u1iYq zGIDAEF(lACp92BAa<{iG+ihzB-=&mbDjPK@)(!A`rt23y%_^qn?ETn3t<}m0f%`#U&S1~|GNXLy=iyABvw(exH1!I`~ zC+s04BRLkv&db5urp7#O0otpDteHVHv2t!vF%z=MLW0w{NDV0)x>b2jOh_j2#7III z1feLh;sZE`2PO$~R?qxB2NF#OCTYJYNwKaTfWf*5Xw;mf9w2vEZj1gV2=Xljyg9F| z>?GqElw70Y5!vPy56{K)XzNK-!m%eHg#U#87z~rJ;-fb;47{ z^Uutb*0};CD5{d90{nLS4Dl198N2yX$f-pDRUKs(2yA(VdhxgBLP1j~rQ$p2te+)0 z=Sn&ugHoMSK+pAtZs-psPn&so>un{;nzQvpi};0B!}y5p;p7uzu#Sv6Ne?q9i-eRj zVV^TFo(2dzL{UhBT=UOpp{_Mzu!v90Iq(LA!vp5UKTl-eVyV8Nxin(~sazU6eHM5! z_4t;pM1itB=_Qk8@g#~(n!tI9+Tsfa;;-5CZp5jqXOr-c^$^?ZWZP4x|8rr?9BYIJ zjGA(uBCCS_%$&7|5tnYc=+Zq%rFTg&*jWH&lizkb>xuPPge41Wc65d&Yb)xPhR0?; z$9|hLP}AB`CvoP8w&`v)ny^d}^~3yltP1z*e zveDwpRJwO(`ImaP<%C32bY5vVN%T1&9OmgHXLQ2=)S504D^RMM4REsekK{;Z5CO~; zDZYOhfxQI~&VoV0MYP+%SzNmS*%4}LA0T~BSWMOwB47$S3#U}@E#NqAVRAv&VcPDW z>~0?JvB^dJ9>7j)pOIqPEg&AR@~F)q6Z*+0K%7BVmlHWr)Hc=lcN{HYjHo@vei*Xt3hiD~*kJ#xa?jV6`p2W~#qfjDm$MW72#?Jf;zl=| z7GAo&r13KtW7SmExXuBgCliD@**v?lIf#i~;pf%un9A4j&gr;4+0i3P4{RXZV>bfA z=EXz=OPXSfHrc|?sl!?^^CoLb@|f3>n6R>4L>al1IVE_wD;hSIUi9|_fkXk_*koaq zh&47mcuz^_biNFwII2ebDRohYJ<$0~^UvsWnaZoTiBHhtYRQX25Y6d8hf(@Z9VpJ@i~u1hP9FUXYbyC_4MKy`R^KEt0I1a@9b?|W0%nL+R2G!55iVe&XtR@E9I z)U{%OG?iP*7!)*B3MaB}L8?aK=+Do&wFlP6XZ5-TV*}hitNQwRi<%A%>tIfV{YSRh zi6p!0h!ECNCkjmA+PEA14B|lx)4f&-$r9UO4)|Cm%ALmYL$1=0ntfw+y{7rJAV~sl zs zlC5@z&mVOEu|9%6GgOQQ>bvmkVt@WT9;7k^kXrk5nG)E5eU&Vw8(eeC34pA4%>~;3 zo%|TZ0Y*G>TR|Y>Z!DhBrMK%2+Qu<}+++8$4RD7+_|KzAgFl5lj4U#Lqu(esXGNd7 z=-5rS`^ui`s-PMQpV78Na$#0$GoqlrPkAJ)M-%L#PiH7%Y=JVJa8!#f{|ogbK09cR z8iM~`*6WJnV(ui(MXM(eVM{oQE!qZ2+EJ&!4Jm3ey^Xi}*o_bnZ!pm+P79QP{o?>CUOG=~Du?XX}YZ*H*NpS={E1@c-;Jv0Hj5`Au@eNu`;bB@Vb& zu|HFCk^HIDuow-h7O_MApYep6?vuP!P&R+mEYLx5WT1|ZF}7%VKem2ja-ZPzM))aULcbY8SZlZW zI4RKMF~Xr2qP8k$IV7yeEOvewF{QPHf)=BRNgZBN#0h}B-Ao(^N7g5P1!21ek?|k) zrjU>Fp2@(+S`{parSRS4%$!VYjxQw?NTF;#ht;_hG4_)@%U2R`Rp)4wj*Mb7_?*p8E}+zi zAhR_`3A<3$QMepRD6J=I8Za0cB@f^|WxC&Ds0&wfcw?TuG zMbWh7wZ27@{UMbA-`5P**yyQ6Co@sI@&|pR`xW1swqkVr>Nh#=<^5{KdYWcH0wrTe zFh@D{K|MaOS)a;3LyjXau|+kvXe!ixfB6p+cE2#@VUla4=1ZY&glrjplsbNaCcX7; z7VYn2th1+p?1!*MYFv7_;9LHwT-ig&Ifxta(}RS%@h8vOmeYrkQSFyx=>M~F|7m&> zg8DJk@xw3h24QHB9X|r6b|fQ}(Zjg;n^fx%+%9r^gAvKmhO4MpQ4u$;i zhXA41|MS1?ei;U^r6xIXP_3EsFMd;AhZ6+o>=_!=8n$&Wr`xXN}NEuPc(brP{-S>46Emu@bqz*q(>>wjrj{#-mInClT zg&ZE17PDA971q}MgY?7ercp@Z2lnV(`i0Rm@pqw=IPKY@Fkhau<^RuNg4qlWiW?z* zFKajzTMJkaYFTME0!6y#u|%KcOLes;=Av1(2jhPMhxpRE$2}uPIETO@DH;QfWWP%t zeIy80)c6;-W%Aw1s`Ksj;g1mHBhcC==mb|olPO5IPP5y?C|1NoT1dB}@lE>3Tp(0w zel;Z0)gd-n&40V7Eoib2>+R|4zg2VFV{=5$-BE9<@if&Mr$VQ1XJIJbGpkt$IvY2W z1#@q@_fRu3t!+!oCZa_u)P1vdYW}oNW@vZu8an7H8CE~%(J797WstX5F|Z*f_g
    rxl_Th%{lu8M-BgL;VAKSo{qQ!ahOspr{=y^xh)fj}SRsFkX zL_!OHb(xSY5C}p5z(W4-%MeoUwf7BtuWu!UPJ$u_A5*Eb=99RcTX+qIGA6XM6%_~v zeb*uar#g(-1+g1+*uem<(qRDKaKM1~CpJjE_vbMrdX#=4*TPwW?3luxkNX={qhz#y zr|h22yx{@!=kLiFFcklJ`~O^8r9h32X!uBd4;KgJp!bKAfsWLmQN9CDI#Du!&%8_M zONCa&F{d%1PfNw`S8T&?m&WCyO?wU|h(LZ@FJhQYz;*x`KcavP2WJ({va%TKC*gl~ zvK(FSeHqaM=RDX0*`mV;XT60K2U;xcSpiN zB#D=M4S&N0I&$jd!Sv1>7ef9s(5+fHXtWv(1snjj*J8i03Jwb3LFjF#gneI+vR>?q z1!EF85>O!Uy-flB-3kT%?;LR`#s&Y=X|GdD1e@lipyy6$_tC6rD%j3f`D{0FM19dGqxj;($*=YiS zlav@cR*v4F>+;(Chf3u4xd8q%f_rp8ikaHT&1@!RQh1fNU?JO`ik$hTbl{|SCaVACoBr7A!6@SYcE9N!r1}&lvd8^fe8#to zG{p;Vgmwt>z|yw@whWC=@qPL|p4KFdC8>7*jXvz;X)j)?;0=tD4>)QMr;JpIj6Dj` z8Qn^V(9txGUYt2W9ofLnx8%j+GfvDUlo1aIA}67r+{m3S{C3#ZmsfVCXkK1%*5NkZ z!Sk|RvLp>q1P&shi1{Mt(M-f|VT&Xo%L&}8{Mu;?2WORQ>uXL8p?CX8M_3LsGsQhJ z1BxD36x_bT#-OH}xq%1~@`y3acnJ~y8&!aT^gqCYSKjfOJ;Q5P!<>(#Ha1qFRgrD) zB4^lKso4~_v?@pP#)GlR`Q^G zv|;~?cJC^T|iwq~GidwaE7>QuGVIznD|im|OmEZwoS_1($RsbgC~ zLK$5)T?i;~$Y_5@^z)KsMV=3zxMlD~R~&VVt&3goBwZ~H|=JO5FJn0{GqS8NZFn2c*1bIf%o(C)F+8Z(S&{V zKk6Tj&)-@($+Y{Vcj?5Xd+rHDHM1}^FS5}5WPfIR9?tyj1s96?$MUH-ENtW-syQzk z-FzN>*VoNeAJ-q1+^E4lmK;{`q(iY}%UvGpE2GRdB%pG=P<9l=yvOK}{$KP6(UEAu zA`7DkMkKjSsI{~V+|&L7d;u1=zdCNzT}(7&^oRq$Uukor>@t8qzeC&Teu8$2HC^CY zHOmC|Ge9Tjr>mcTl9?74Y0w9PreLev{p?2pjkF>>7zRE&lbcE8*r{=w*<~TZ)$~lr z+@dW0JNb6`R{(Sri=kQ^%Q{UIDLm)z)_;`qCAxIBx{hp)H`Xm#a6y|<;v0hMdF*UC z&k9yfayPf6san6n3BDwOgnb^-*S_d~2DBRQ9g%tr(S1}bB*=4f^@O4(Ip-RH3Y^=) zRyB$s&Jw|YWSk#l#YfRi3g`ecnU$3oG(|!c6Chz zaWVQw1@II}(n0!PHher&?vpJkkLP;eyB69qK0W5Mqi@V#z8%FzDEcYMIgvz;LZLw` zA&SG9(HxWn;+@U}sT-`%M`cOs78~~~r{2p|4a-lBVrw^*`(A5Jx9M0mxh)eg(rF7@ zieE^x#_9%d_q67Osdcgp2*nR5pj2ULgoSnmm|gO~JtjaKlJ~5Mp^ok?WgM~INppGd zWOrOJ%5Aqsia(@JQ}C%E#%94=qW@o@oAa(~23gnZ~uZw~tIc5qj z4Gl9JrVV9!p(D#Ryny4Aq4Brp$1$gS2;JJM7Z1Yb*MP1H>>F)qF$j>BW(gNM40iJJ z-}HM3U@&bC5XeofVu-4$s*Vr-K=o~*QVW@0b4~wCPEPh=7>6acGP9b9xFtS1H65b3 zppIoT8mJu6=$O9khr3xcylS*1-n^b3UI&L@*z!U7W7OpR+Z{QMuakdI<$1|BnU@yt z^VL(+Xn1BKwwGdE;9T&<)mK3htOw~Z^Wx$|@EmDjvD^iM9=C1?a7`4^FL{)I{87k{FE`^volrDW?ON znIPmzBT(F`qV>9ai>wEoyR-(Vmah}7ue5LqrqfnI{GDA%>@^?Fk0Z`Fyj5dxX?W-6 zU5qvJi_EAb`VJU;HG(_4I-cx9Sz-mfrGm0m+elm3|p*T>UA%$~dsTyREmK~A|@kb9B z7Hjirt2wQ%&Z}ZH*e}#5^L9I4eHs_pf1YqXudhm<-}y#Ak`wTZ^3;Zm#A^BxSq6^k zb>IA1CD8jP?50E4Gozq&&A=a99&DsTb?JRNe`IW8FAgOl^5v`OuP{HrLNmNQWGCeA z-{-^25}0l98FE%}Vnx1(rb>76W7=l(*TcaExsnLUSaF1`=>Nni5dyc)h{Ge{;G5!M zO>3IplF1{n_qQExxI(&k1KGJW|hlUBCp8~k}J z3P=&GYIT(7}83FGGPA=er?GWg(cKZ^0T zN1&rHEJaWzAdj9r3vl>1{wF>U(-)MB+I7AZRytwX7Py#Q(4s1WZsWuZJjA8Z*vI3v z(_(BD|Gk!C$Ouai%r8djwXJmKxii3Ro`b zvLa%=V|V@%^dV`$1E|y$6P~-SZiS3bT?1?3p$e;fyIY}XzEix!U|E|;Sm!}L!tci0 zDc;_9WJ1l7wwn9fU$LI)=OcCKzT+nMD>1QfC6QSuXOX$xwaMp4_}^PeGV{Xbxk*!l zmMKe0DcIyAwiDIR3j~S`e2-SsR{aw4Nq=DwsR?*8M+xtBOZdh91!yRy3NsuFd7OMzriU=J9g~hpJmst+)Bac{ zkxmdzG3OCNE^0K=>CfB<1j-1L_Y~Ez@tS4D<&yT>(Rm(-O`s9WX`>aZAp(}U#RKEg zUHYJMqqZ+`2_(zNZWvaA;03xD_A62)B-D5w$KMrfUB)R|kDOYGRcKT+StwnRTo>&n zxZeyiUBR+y4>`I8ta00qD?7!YT9=?kfJg_rM3{5KO&HQ;&+Lh=Le8v zbtVpw=m-fGip6h>L;-3tdYnyjMg|a2-xC`2LPoMnq?48-_Q$i$E|?A7(F(tjYoh!F zr}mVDf@s?N27i$4a&BSSo7M{|BklLs><>u(k;6%(pky|3w^}pm6qY9ioxp6yPhCCT zCUC|#*s;TUv(##A8@Oq@n5k!y!o+1t+oKQBhjx_f?=v=;Q-X{ikMG|$ipTJwZ1N+P zcmYgwv@w94xUgS_fHix#Udr<+k4Dv4T3atxQcz}pNIW|BA7^^%yQ#ealjv=jUg{W3 zg^2H4e}O{I(0HC5_Aqscd&6hLSs>@4#)qmECOYH&cDwT1r?-z3irm94Y#AN!P#grn zHpMAC@O!Xy&#d2iRg%RQU$_p-}E%(3FBg6NSg%P^Q@%;$X_9b3Q$bk2S zcOKDFoP-hDgI0rbRGq%!ij=G-h%k?IofK!x?j&MAKt5e|pzY1bebP(kW~<^pQ-wHo zsFumcYbRfmb!=2hEE_XTA7(N3yq8)=+lkZiA{ts>W|XwFn8f0NxCJi~UVu5UzED%@bL57_cQQ6ZmtZ+b`;v~mOtqO9B_p+Yolf4=in;`mc z`4jn);LUiV!`s|VzH$fE->y^{wMQthRzqi1cMPzU(9W_*K(5zSR0|u;dMP+3KL;fB zQ_kcGSt>t@95CevpM0v5{FiB=VNi4|H$DK@>)v5M#gTqk2|v>JEE$`)mp|T{Gz^jd zj4$6+PcARE_5s#C&@nZUMaG0db_U%Roi2 zYj0EME+0X%|6ZdXS;*eGeDUSHHEl-3nwS2iyT3)WaiEGQXkrSZojlB$x`rB~DN&SV zN1HNlB^6s9r7_H{Gp(RHZzzth!-RVsPsuGv8NQPf1X67AW7^|56fya1A(gH+8GQHB zs4VtaVDR)}&AGJ{IGMm%jCUb%-r=)SmF|GJM^%~dw^~2QWU65f1{_vD4W9&)|_2`aN~)J05b@ddUSuv8&kqh-;h5z zVd+7jM01*ET#V&iOh}6^lubbqSb{lsgE#nR(E45=lxM%i!SWYr>+507iyC{jH}8BG z{M~4*5t;rMnE2<{OY)b$iJ$olgEmSjyz5)n!moC}y$=^-CNwJ9ul_!L(eHT1 zwS_ZtM!{G;cOg!+60oO6L+JVp!zBHLf_Ye(^4NZ;H|=i~P1L>eIpMkGZEqdYL1|-3 zsLYh#80s(mHKE@$hvsFgVWKX^Vv#mRa&5bxC#b0LGEioPEl$S5o5w$uG6dJhf>zpa z0O=s-D%bWsv(P&T-jApT1Gwil`LhfS;}3~yDv^X6m)EIycwJLm$E46!&TU0=6sN`q zOM1R|BI?u+#+Ms)w!h^~UTJF2|DtjMnwQ%o~LtUs3-*L-hUt5;Yf06ilJMpqaccgjA? zG+vzL_C&!*2#zBaax-HTA$^}IMtGpVPO)B%BRC5)$qKl%2#{tR+1ZT4`ZcDE!&^BD zZBb}iYMk~#*{OLMscFV54_N-kZN?pQ{+sjh$L}^J43t6%<&H+y6n>e@AGhZ69a6iL zD%E^Hwjwi_a1CRwDQC;4HL`{`qqZ1wtnGOvHtE?R7Ke6sutrZfpJC>fjz2Vv_^awM zXEI@Zb4VAMnTeik-p)S`IOp>($U<+s_tHETS(7DfqY!lLVK7{O8?1Rv*G?7RU2hRc zed2QnB=4iMiFLbGzx)#Wb1Mcnlh>60oZr;Wx#GTls&-Qga|qJJC{t~WypmPpw_CB~ z09KIcDN_7??C&P+5C=fj4sic2NvhxgI|b%n`1&dj7ca_Oc&9K`ykjSEl&& zgYmTZis;HNUPf!#q$B@_p5H&GKbtyLl{K(_@NkojHvE(iIqh+vwsDzr3ia_eDY{j; zWJ~+x6;A5a&`$*Bx*%H3T_mme!XA!(^n*R%9+{kxDeMQ_4wA|u#atINU*8^!zRMUH zQ8GXt9#=JdHY$+4d-`M{ccsg!t8>|2JY>Q%f`o?1EO25tzwRe3VJ9>NOX`SaHPLw* zQIqDJ)N-7T7xfUCRBeewWpW9n+AAi^87c_kn=T2Y5uGu_EAIy|cIG14PJEM~jFIE1 z>d%~xJZy}II}q`p%^SD@%Cvq74JQd^dB?`ZyPPyP|Jx2aJm-}v3n|ny(9+{SI8pMt z#1F0h4nm?)9a*1hYWDn;*Gy9-J*V-b;%bPSVK!y-XP1(h05^g7+1JtYm)rAJfyL`& z_r9}2A%AS#ohUP`Fi!9S?&T8#VJ>_v@KIBvf!t|tk7=VOmBaDZWE*aJ_$l@Xn)P3i~y zkhSfdv|Ju@VoRLMBt-0(3kR0}Kix)yA6xAtlrzeT7J7x1&efG#PLY3tY7imR2koU25svH~=kXG%m;v?Yjd z0QKH}G6pd|-;_*Y&r?_>mSA4XqB_?x8_8D6gd5$A(b}e?s8#*iYq{a^A@E}Q%+W>P z6`8j;r4TanEtrhk6BfXw5KL3ZVHnA>p4eGiYDuCtv?vA3H}m&I>?U$Gv5 z9P^0YZx#1O6Knb&Rn*X=(eMNwOo7zeMd2WFm{{TVbz-S#Z(&f1fax0N(Srpbf9b0= z=lR}<5bS2FnQiO@iHwoM7oTDDya`$dfyW0qmT>tRHJ~OYvVuy-yn=$*g{Qlp{MbGD z+l$IF&(O=;gV<|{ofg7C>H=<#3SNHTxVjt??hSCdkz$z_PdRT1ti)XyAzX?Jds@mj zp9b#WnuCoM`k>?D6vsK}j1u*f9T_!l6%b6wyjrJ_N2JX!Cqu^rmJRo2*lO>Uv>L6f zau~J=lT>hQN_%t5)<`%hQ4cwX>77(aUH`>8RAJ#l6P3}wpN9rH`VoAVAyH{=iY3lx z&^w&2opP*v){cs^vp40_e8PG4ZDH_21OaM9p*9=Ugntp(V#%9QbpP8^)`|IZRD7M; z>ohJdJLY+eS~l|Gm!-7)$tbc)JF_CxY0p2+=(OdLd#R|h9PX1gvT~O+4j|-tj{zVu zfG>wXg_L7f^_r0aL!f}pYF0S9hm?aJ(cW1_BwX!9cZZ%L9sB!@XLZ+ah~SR$t(r2I zp%SsGbgFa+kMp&W$c@9}FKP~ilJ=scIi&E4FRuWZvphl4^ujAC5sU0^@m%w?Z}KYKpkx1H!Ca|V!%ML!>~{8@06(Rlv0`AB%*K1pX$x# zKwo)T2Y4);2xism?ZX1uI%s@oLH(nKy!ykpC( z6%|QM{E*sz{TSOw;#?XHYYK0?k^sv>;!$<*jrXfPg+fFB=)f^Hu~YC>Y|C48D2XEU zNkk+VvE?(NpnOr3mCe166Yv(Tcsk^CIo53R#m3GM4F#vtb96D7)pEDHC37;4A2HNS z?~zcs6tbxh+8xOeaCe?~VK}NOpgyO<WE^4xNS2lMi$y*89WRQj;W^Ce zWM9VhL-E95RrE?7EBdCmhqkuYljyehMGk6y!S6O* z^P4G3{Uyzj#Y)j4@?#FXa9DQAITGpLtcJwDa#C~S^?DV_gOjAThjf=zv9<1FKTt1| zbsLDtIL;sKC3ixnkcuMn0!tAHlJ`f{c?DaQuSFW?V2nH!?djcO0_jwVxEKmJu^M&k zw!6p#rpChY3w(;hEocq_RqgqR6xL9+Y zw9tbe#gbl-Wk0iT`2hjdj- z#DGIB_6`FuZ0@D+s+s$e%IWRyZ@v*JHR&AOms+n?g}C6VIRknR0CP^!^?2rdeve_R zP397z_QdI!I_$-n7ht+b)Fli>SfBkob#p_(zDw%uNT;PWmWDL~1nc`C$ ze(iNu#mKA<4WKs~0~^e>#pMuCfIh4|m(DQwXX}V!ktMbr@G`2IBBTK?;q-v1$XvQ>qrI$M!ibCTzfXM<%i7Ll5>t{hSr!FUi|Q z4ccynG$ecKrfyivd$Qu_axNavWX|&1Xj}%-LV>0j(UTv1;CoJRt3*%E-R?BZx6t-l z&mRi%K>^8-UtR#(Q1xm8e2Z1S{cL=u@GUZ0i|3^(Wmbq0w(;SQLMJ_Jr3p^+=re1} zeWzPzY{pvAs|0@!OgxRz3`?5ElcHr=T9>VospUZ{`%4kJnno25=UnZf@w;KpI{_&X z+isZhe<=`A(Fng6?_t)0hEVjr0;9jl*kv3nQ4kDxtcwj39_<90jC{r~(y;R1I0Em4 zms?Fs7OU9tLVMlqm8v{^ZDObMmPhFnw2pL#)AYQ!Ss4e&RVCpi%Zt%Yp_hU6j7*jKPZD&;=XQbNs!Q~oDI!}*P>^KbY_KnsOb~1|8 zbp8JHl*StNt>5eBSuhkQ>=P>3`6<5mj6t_XW+|skHFn%O?8A7w;F|7Bc${KTI>!W( zGe2-3wPW1(yAw)vrHxyyYZLG3BBeUnZF8qoVTeW9?m*H^Gofa}f?N3j_5mAe0|TM2 z9;#NJ)|^Pgelx|nZJ2E?hR51+aypM}&6Ed=?Z~@-!n)N-Qi9c;TeVj$(2cJgOVr9jAIS;c+GDs4aN4p_?Ky0Uo?Rqqm9#J z_ST9rmPNwCa6R=mMT;3r2vJ)?TpSdY;Bvvn*ie9|S9`k8lTs}%T9S_;oSi};^n*ZU zxplqll_MhGACZAW`OWQ*O`HOu(%Q0Iml|z%L?@SSgPn@Pb=l_2iF=d9)S^d!18H%7 zNhN53TirHiVU0|deol_Ybpj~SqwE{~EWQ3TUoii0i2ORMCQ2-tKvA|ks`ZtM5DWev zKV@P@$rFxTX47LY>dwq0F=v$stGRu%*b}Aak70nIa+y#%7SBS8(y$?av000;7?qS> zq=NO^J54V0*jpTr>(d^}jfkdJaHAD@jn)c`Op`HTd{RudPEGUrQMUr> z%Fq?maHaFEQGeTWYoZo<7i6fJG+@C(s2PR0abRq1H-0fYm50gYt2llbohJU$1w+PS z&EqTe{U1Ir*lmv(mtI``B%MmLZ|(_0758GdcO(kt$lspvL*HXx zKL7i?B9c+VLSls(!BKs2*xmYyomB8ln?=OhNr~!b@*Gnq1bjX@Ia|K14Vsy8Vyo9o zU=iwQXtd!Y($%{}-Rtu-JoNJp0Pw|^5u}J^`=b{R_(#=-D0sm&c?5%ma@ucEp6yv?}5N!6JY z0gg7ZhDNDm;)5;Dn)&Q6WtvP`$ByIo$XV^*LMl*Yzot1aH*HJyOzXc%m0&x~S?m!O zL?=Wji*ClvoyJV}jfaGnjiZ|}S%eliwV+RF5oWVaG2cAFSt&Fou_|!V@?F6wHHAMA zh`dFjw5m=|EDokG`imRa@;>P)gc6Dc2mhKhocR(@H*MzcjBnE=0ep1PkPMS!C!b#( zYdG6Zi`)38;+tPDaJO{S$%}&>L_*<3ED$r5oPM zxI9L9;C~G8ah*rnH8y0Uc=oR2B7}GM&0cthw`R6>U&DCYBWuG|1<1$2=p)&c2p*U@OO zI1Uw>MyXITgv}fEJtqy}FQTz#0x6<9WIvSgrrT*rByH6VtJ&GJYATdQ9jN|`GWhys zU^!@Tayu}gPSjZM$bmn#s(OnR>vIZ> zb@OsRPaI$KA)Zkz(TWZlCXd1C3XIXYuGQz%?i)OyeP@~s5)j`uX+$mTBC&0Z9qTsV z&6hn%<>1-2GD8Ouz_URZIN9)vSy&79sm0Ir90n324A)x_{ik-acC30#xoYpD!jr@9 z3@V_V1$+<&iJbh(*x@O!s;UEP)KCoDo6+FKu<(nY;iF)v+GV`e1So%kFZE6x%x`(| zc@1XM51i`fEV1V$KkY#fSX=%N+xNQ)mrLO4DETf9t~F(g$>G5oHu&KdAwh>I(Ifz+RtL6I6i`e$@->L9nGMPO|fbyVn+t<%Q) z*A}wWK!ORwU^1QUBdl58{~1&Om@bArhEV8?R|;+IsaZuRaxs8;?Sfe zq=!gwewn>YBYQ@p?R*em#EwdsN>=IL!DPfKaX;z3OQP7SJQDfW79*o+b!?LC>6mi6 zDi(#xhL0oBcsaVd+lUM5Tg;eqNosWY1)}MIYdm3Z7YKyMCGUZlPHX(NNLsH1%u}yJ zjHftCH|4`(o**!*Rv_JKUNb}}t@UI>+(WTJxZH9~oUtPRBEkd`^l$$G{KXh4jkq2; zJoHlq^|?i$>TFM-`39gpT~dq0Bu)MRZH9k1uVt*)~ahfD+v+#d1$R3O)o zT$RAMxiO}JePYlF&ia<%it@+U_R+M+nF8g)Mwr3L#ASWj?1&Wuzf99kc)%=7IqbwD z;tlSgyM%BV!NDXtg`rDo8^M@s{z}Q5UfA89R7`MV9lqwY6p`?U1Hs9rkzW`{HnC}L zVHYMyP_k%!{#sE=L;`m+wetnK9=$M3Xe$1m8ln9YBh#v9#wX-F?`zJasuuE_V{O81ghl-j3XCNS8=E9AxXS`~Fc{>E=8MMcD-INHM3$N^jvKTDkr1dcXbxvq+=i#0 z!SwF&4x2BAWacR=EiA2I6+{~gN^a{()Z0tuaWD{;QXO8kNEOUZ3YV+x>CH6RRaSYT zBps%tg!PQy)4i!&E&W8QX#afSFaIwbXL9ocsQ==^Zg^9#vJf7r5{9|{_zx05%KFok zI$!;^`OUq)o2>cr*mLhK>1A20o@VxYD6>y9!T;A<0b0!Ww86Qm9{=TNNz}MC<%C8I zPR1s#S`@{%@$0Wazvy6ln+uVN{|(rfb{tPHrIr$f6Rmrg%lly6U`sx{#~lQwsTx8n z<~l4)swnPrvl0V~j4|q(38T`m9xY*w)CI&nK5%_^X2zDT1*ac$@zi7w}D*4)#i9`J}7 zT*eO5%9)85Y&w0kPcpCLf{C`_{(}z;GEg$$hI#c`53GGK3Tx`9-|2&=^Nq0E@U|k3 zJ2FArSGZ@2^;-y`z8tZd|aLxo>-DW*R^`l~f-u z5eZ9v;{jo#Bsy<4Wa#4e>p+TwO14a_YMV5`xB-o^wXzqc_@Ya2MAdFPr^|J04?2-`I z4A+|(ruC`HTCL&?z8AN@4;vCVNt->^u1mTuJadN%fFA~{;Rv1VavTlos^%&d*A>9h z@nQ0m#;R}5u0Zz7tL{a6o{AZkUf@pj4^37Cf>~5GiKhp^=EUk{=T>3tHl~7>QT)+0 z1)mc{+M!L$G4j=3xrhvKVD?d;o(x(!dG%d7?wV$V9(>jK zF<4EMuK$mzS@YARCay21DKEK##RFd`wXV(nc$J~?+o|h5S^eQiAE_Y+yX6QMd^aT` zUS6-fHWJduW4Hz3b1v}02?FGuYte=AfngmRe!e{;@PZOxXU_abULDnxWFoiam(rE} zI1qax3Vv67@z#s$uJf<{m|b<>ERw7|%k&rqFnMMy=JqF&>=@Hj!S#~);;)>UA@T8L zX@0CB?=K$73SC7e@8$Vs#=cSXdcrFTF;qMi^DJ5s6IAzZR;i=#$h}rK`2G$$6fs0b zw$*Yy9}AF>(`LRdF4@yRN$4K_uEhTbh%)d>krFKzu{Yq%CV|mtH9~|EWIeJ6UZCSk z595g=4*sTcnAlcTb+z0|(bBF8#y$B`ub-W|IRBlY*K-M2VcW)wC*}rK`TMD}OAVr2+{jn*&P zL72@SmN+c-yYS%8>wI4*1}eTFTr;8k+gMx}ST-LN{D_pO|@(kRuq`Frdl-4 zgIg+$Hp;0hgGE6ffacN7iGO49fghGVVrvms;`OZhh2%}y^C*tH;avhBXG35i92)xb z4E3!Z(c3=*Rnr=Y($~ipwTiFMfkeA!>tM}PJFTeSDOR<<$^!7vvQYP_u<*#0&4iu= zCo1a{TU!Vcf9AHjf>F0yFM_V@7t`{@@B6o99|7KqoLrZ~r^V}GgyVx|&d>K`1ISIA zdh5@$x-SRc#GV&b`~@f6Et(5fzRgKkv+GO;$}6Qq%&pXRI2B2k3d0TvD`%Vb=suYZ zcPqdcO?y;NV_F2VXRW9!hWH~ui3@ue?K1H}wx%^6m#3Z??$E6m=xnUMlW#MFP>+^_ zZ4VbPRR8_Ie^!7&4V7xE=oVq>#5g4ji-@4j85W?xWcMdb*BJvaPuMH;^LLyRd%6=M zU^lgqdehG0@B2rf0{70$9+5QTsOR{uW%HKlSyeSh_G)G`Co1u;wLc^1t?{~v3VS8`Luz$#39xGxh zBmBfBWk=}(w*C9F+U7msYE=M~)4S9g6SZ)S7ve()txSnppc%`CY^VZQgn4;Z{aG$U zN(QIBc|j}YY{zed5BOZkT86Z z#?Q5jCOu~u2@7PP`P`yTlEtbsrmosn0yD8;AiLX4`dZ^%xbz=TQuTcy&5YtB>$vrm z2IOxuU)CMV0s{K|S(K*1B9KTY+kmooyDTL+pylVQr|HT`a#;@r@(6nrP%flBOXFJ< z{Y454i&TwnxkonzkZW31Obe-TyziOE~oqWa?zK4ng03HoQCg^!lTn940n@)Uw)UX~W z;sP5aXF0rg`S1Q#3Ybm0hClQ`%NU&9&tywuA-!mvbv;t@mTR|{V(`!gVz$dx6o9r& z8q2wGrYn7+5t{Q6cn_0isyM~^0G(VTTx2)q{get^>a+5#zf+vL-i4qPnA>jJJVe*| zKqPwEH1=dk%7>M995Z7NU!UdCqf~8NwV?6E$IpRNZg6W!Gd33Ru34+II>WllMDc<6 z^=M=ArYXz#mfBU6y(7j-XG25i02kFt7{Uwq!c_$5gQ*>X&UV=e%&3-@7dOI#dN{Ly zqw^a#Cv_b1=%D9?A3Vf8tLYCS^XLzk+Ax%n=|SFim=sQ@KDhM7Jno`o&+W)$>d_1q z;*tc5v}!AGeK17_3lZ(uJSd?Zl2=_1^w#KS0FRiTk@Q6BzwC(5%Z~T<5q)(nDA>$v6Z0@VjVe`yzj1m5! z14rC5+_c_JT}JX%|P=Md9sFSLdhbdDsP1QdP!(v+Nn4P4-kztVam_bkBQY0;lC?Z0Q+P zCC90MX@d{4Q($`g`vvv-qxXJ_NuT}XHZ>mhf?pcUX;&Q!O&Az(F0N&K(-srMa9KAvZ%e$Bj>w@%(X!&#x(kPB9xz6Cn6(tW4BVT-ibWo0 zmpT*~k!;Tp&SSh&@ke%uitynm?~x`tABK5;L6gey$O0xjfN9z2;PmNj(ZjA|0tOsY1qMSkd~tdrGFci}g)(1Xp>{{limy}nG3peM3-!Y#Hhl~hn*b~_gsZJP!Kh8bfD zoF}as;7cuJaD8#nunrTZUUcoXQby~7YPkWSCSBMByfZ&x^58BA)b?yEAlx#f0)${T zMcq9Ywle9XYTR$gtmHJZ@yR`rwLL4B=e;ngh&SvD(@Q*X36FibC4GmZ*)4WKM3t7I<&3o z__Zw7)-^5nUdju>HNzv(q%zS{R-qToM&8|dEDcsCj|&P|LBUvtReZ0`j~Ni=wX@=0 z9VhcaZ#s*09GyMYyz77XcmLkA+grBTNNYI^P@27+_rEMa*qJmr+(fSt*ODp7Ud=fQ zm4@SE0ED{3o59RhRSg>a5&>ab8WL*nYKDBy4}20JG_T^-0bvWPI=|~BfKb<%l^DiPz(2Zu!ho=ozA5}p z3V{s4n7D|%w~rU=HYddoAk-fBx5AL#(3ppSkU7YfQK3jgWicN>%gX28uJKt?+RTgI zA0YIU?aE5A)+9A(q3gKR)TQfI?rr9#;~7XjB6H1c0Hcx_P`&FfB|QFgSt{>zny)wW zfD<5);>f5iC_GvVm0T>p$(9Z2$#p}!ZkrU}b)vHOwzUDlf2~brW^F2j^He~1HoFA_ zyDdP-Vy0>?0Ac4ggTC~6J|yM2p4EO02t8O*SQC;*ByWaLwJ65tc^)A2EB+7RV?xd2 zNtSfBot}kyd|Js62>k6d2<)!@VnJWTLDoqpt-BiAgz= zHlS-*zg$4rZmTjgRYhMlnLq1!DgoopbWu;)XfAGRnGmWuJ#nZ(zuRAx*S20UB$~cc zm9z0C*T+2^3okX@(Wad@0pZZ$3=pn23?NKF1)?yKn|4IPDY?C4tMI|P3fsl@XZg<`)zgC7G(me!(@g5cQ z{qKIS-CSr7`05N0n$PiyM*N+CP8q-$< zgkF)XS!||Z&jW;;^8f^n55{7S4|XO~9_id>OGxyqt?V$cNA3VZX`Dz+or-5cTu8V1 z5*B*2-oZS_)bJ!gsK4IQ3?!td?{Q#X+_?cleJ6&~_-L+SDY};c!tI`UZ@Ls7ZXu8U z5(>N&4c`Fa8z6jI%4kt!g$y$=MRzE&ME4pH^6ZJCLOToMCL|95p-;)y>P#2k0fg1& zkK(fe4WoMtzs;4j+c5X$H0X$Tt)5WRiKOw)E~6zL5Zc+!@dyZ$=aF`y^x3N&O*&xb zC4dlU$(PcG0ffp52s7|{#ATo395zgdupNO->C<#fBl0#qNP{$IvX&II{0i^o5ke-N zVYnS`rfeaol_tuTf2;kKw&xZ{Xk%F9Y9aVhRecyhh_;#GGZ3qEsC`?y7yd9SPG0T+ z!Y13@+^TomR3OYz3E@Wfn?VQ`*TGhVs?aqQk zwhNj>#|uEncH`t?nq)yR3z0V-BM#tM^Lx(#ghoWQIE^j#E7a;ILu^1ZI__BkVViip z91!|7Kv>$gT;gqAYm^*dOpCg$Q%2h$<18ihEq(N9fDp#JQ9cDgxcZJsxVeiC$imQ^ z6<3Z?=XNu5y}Wta4Hr_obc%XrvSkVzS)KGF{gpF8q9!C())^0;ngjW01d`BC^QU31 zr?bkSQ-jx~Yj{HK$S+lfG-d;M)$U9HRzTS1H(rs{JuC$j)!_bg1P!ICNuF%3X0)mX zWPZSDx`{pTx-8k0LYw(9cM1n6zu(*G%3fEGvbEOD=OH01tGvw+RyzHh5=YoCKKuON z{_(%@pqQCPDx6x4+%|M+9X!Z1zNVI>&Al9T z{+24-m)YUA?=eG6dkqLTXU^l4Pq?ea%*vL|O&e%QZv9ODmqxyYMN5W6a1IS2J+r|* z!tfiNIdfeDFh8a=ye2{*+`;_GBjI*h-mAk zG9kmF5=wmx9eq@QP)WWJK@A~c!;J!D(|B=h-7r%n6D9Q7GD6K`wFOU;+~NpX;hal` z(%vChq7@cceVYj(zjf1a$S0qHK;eRwv*@~AF??!X^*^=fh0zqMXx9@#A}oi7EufVS zdOTNiHhuZxv(F1VcG^lgt9?<4jw{-nU7Lju7o}Od7FoEz?_q-gwxVVZfYz38WtJ?B z>P{MlG=1e4e!+F3tuX=AVLX-8<@sDsEuKSkXzbvbblDy!n0{@?tO%0B!|y^gErIG& zGX3gvyf1m_#e+I_;$l-71gF`GnAhuc$e0YKJjT#MUWe<$dv{W@DaH&|2gcUO5PoHx z#uOSW4_ddwCuNv?ZF;6NMcQwcxM{Y}*|wlhaBDUn!Z3r@P&;;FkD zK)3_KDKnYFcWj0b@A9QOOnkga|0W5(;BT>f(ultcBW^MmiXz;E~9SF zwFyb&zNvTnGyg&ur@|=z^?85*;&doTNXU-^U#Eod4X~B(reJ!80tkc2qy*x7J*%yPz zZjl9)hk1}FXF5FNh8$3HQ+Zn0iK))qc3bmr%vC`RY%CD)5m|fHh{avBH&*m0_AC$uk=#v0p>0YKLbnOffDoCXJF~5nC1apAO1Q+`5 zPHZMr6alAvS%6S8c(Gr6_Ibf3!YDt=yBcVv8EFH-)#lF;kX+%-(J=(xMGz>=AiW(X zTyMPcjK|UMy^T&olLrqGX<_+YwrgH_gN)1(K1~ZxbVEqU4H#IwoMNZFQ?~Q$s{_K; z{Z7W?3JAm48c@EOz96h5*e38-sq`=Oi@WMqtqKqZvGfsDRW1;tJ$gspKem+7DIJAJ zndlB~^o3xuQ*~T9+Ioc2HO$J>vyV=HKf^pj5?ON!Q2FRCK*R=$@&zFD(&F9tWEMuwl3fa+{axIN!)-^G z(MdY)079m%EU=t3F(8k(sCCNBNpLW{sN@2Rm4c>6ghRa$#0%+8F(BC5!Y|gfIszX;^wz{{mQX(A z3?UzM@XSMJbfV^dDtlS|0+U4(MHXn}=;k&tTIoy-j2o<`n2zUhih2TsC7rfu9>a#2 zs~LH@2!6_q2H=Ta{IA?!LwFw$qF5eV6K-nGJIvT<+Zu)xYOTxdIAUi@9!B@)59v5r z;6WxSD0U49kKSQ)X#M0FAk?-t*espf4ycJ?&-OP`Y{!ez3aAK%{LBQN0mAj3BOr9; z8Gtb0!7p#p-Wy>;^MnX8(Ff6P54J{2Ps{1uXcgS$b*ZGF6{2xB+tw?tOQnnZz>0Ps z;Z@Hu^pQ(D3)PAKP>F~o&WLDvO1%zhyG&R?D1B7*|t&h;n z8z~=gLjyXYbb`sy)ED){U@IVub09QBQ`}G`{J)PD5GwRZxv$z;^pMD)*cl-7lZ@F~ zNPILy4Y+Z@&ZTNH;;snZsgU5@iPa`GNDcCtw=7L@ z2=0wg%@?12&eJe1Tq)$uUPpf;jztv>Ll%TWVJ%6+L>Mn^E=pxi0uc~oif+>XjAJi?mr&9u9MNFKM6t#<0f-LtSlX}D zT=V3q6r(xkxRQbitT*|=BW+%t$cQX7u^c~lGQL2Jw;*Oy2>v}ffn=>nu1|xWl6+W3 z7)zGP1*OKlZv4+IqrPy=+Fi_hO`J6PA^GG3~ANkwwgMdcu2D z17!z)qEafj1=(&Wi(?MQpM%9KrT6$rzwUq^cuZ$oyG1WpgOOSput!m@YY2}gz*h3E zsD5gt-Q;uYX)!;QGCDU$u{rFRTijGkJiuzo0x}be2(~4F%8X!9TY5a^@yYMZSEzXk zx{GI=<(G7_4Z~?bQ3-Cwp~5+ z3oG(bP{}M}J|9ptnMhg3PN?tLG&S&YNS4u&(&HkTYHrYX{&azrNfpk90S~jZ)wIb4 z1FwK^=8LwCfATGoDIJj#V>eoTA(Bk#1V@^=f&utCdPm~0w?rC`3o%d&7{jk>;1lG^ z=Hf&K!J7xamj!ebtE-LA;31aoBrgd!BpFm&jaf5(kR9Bg9{zh(L4OsZAHgu1JtGfJBGB!g$prcfUrS-Y9B$YunpK|;M9g&Vmy|p zg%}TEMmwk(VrJLqXUBavv&5L{FB1lDnEUcmIh=O@Ar_?@n~+hVg1dMu44D>Mv4*wS z>)edyU}q~P9!0yCx9?@d*B7J{Zlg#U0ySho@Tc#C3Ac5yp)dBgvjO=+9*08!9{e0v zD_Yx~t(jN&U8hRlHu+J+nHU^*;kQ%|Y6Qde6&vr_L@dDJ# zkVh6oYi+#9b+H2x%ocwdGW8%k4KFlo)VO~hEXxKpR8`98witC%M(1Gq3;%OgkaqeMtp2Dx&!z&_YFnj1XHiVecNI8PL%YAIgm`#_f({(gZh5Y2?t~b>JBejS zTuf>24YJL@;VBj=>4?%fhj22jlYdWfmDGFzk4I)W5SiO#EM!RdHL~NOlg7?b@Fn!v zovuttle)+WxS7da3_ho-y}ygHH=X6*nncY3T2cO3O5rn;pxMSTYfWKk#w3s&RrajE z=lD{2h+I&aPV~AsAy?0*Arl~s4V30C=-fyV&rB(DtOo82kAZ(2!S5{JXUuxsm$i?x zuCi1pF9lRwIWs)1eJufIW*g3SNv$O_M$LUO1`Q2P$T=VsKFi<@Kl4T0JUm=ZAhNUE z@qgS%C_FemF+<4EvPqsA&Yaw7g%6bK*G&P=3qZ&aHV?pNbZB^EJkW+5g>QfBm-tmymlXht z)yZ|4f!q#_-0E)|4C=kcxKk`6Y0W^Wu$hNsd;^o}7vpQVy#g<}c$^K^5&$Vb3GpfI zk-m+eskmSO`jjXbI$cMT-zFPHtETVyYGs$O5qw{_VRb&GdYZQk2FzwH6o~ulG7{YZ zgh3{n7P-7J>|yw}b;$J>cnC*n7>xZA+wF}8rN~+nLCqAM*){jK<0Zwb4FT+CMMj^i zN<6;sg)E`aY|2ynm>8BCH__E_0t;A*do@>9 zLF;i$)eLIg^u@GNkS6<8$W_SFP~Mp#w4`5brHxNjGO?JfeCbYjjE+L3@rZ`a3=lc$ zU?He4hN;Y2K2^2nLbHFH>=;48K9i+Ib1Eql4a*?*MkCHIDoNF^q0pL&8i*j23=4@* z;UC=r6iLK!qc7BM;kwW#-I(c2@Rfwu747FQsc`aQ&bHk?D}@E&94w^GK~S%VR|`0P z>zm)~I|D(B_O3I0)y!By*rG5gC3fK#zy1xx=jf`$Jw+kmuFl$x=If?brS?>n{^A*a zR4zx8_eTu(qiT`IO`>k|e`BnWy!( zMWW z3Y7^EM#-%<7dg;;&CJh~OtL7Kz~1bHRkXC;0Kz~4ry&K>A^Pi+vvLGqmoB|>E zE$$^0=_`U$Pd8>*ot}JL{G*WymC^`KDfiMFu?@DDJJ77@HXGm88raXBR2g+N?>)jo zSqvs)i`}y2fh&?_k`|p6)Sx$b=ct|FZ>0vbdXs|1&rOCjMUw}t8D>IgfJu^Xt6>y2 z0Z7Ae;LJ2?(h$Ul)X4vS!l5}vg`8TXve~BJCyGI}?8GJ@JQ+?ius#Dm$ zIW*!75XKU1RVspmb4W)quR7br5pTZa{5wlIS~^&gB=D2|A!{opv~61(mFE{7O><<# z36f2|@zt*(+7x8eBpN`Jysiz}*_IF^DGr|!6yYEhB$|!g*50t;GkqI6%&SN{|9lU$jV9?vHmKJnd`skyS9nq31TvPZTvf-goVj%^CXQ=~)OLP$KXPw_9;S-GlfoZ1sKK`uV0>x@svRbEB%<1e4|5CBS_Ot( znL3Z9Ay5_nVC8`Zm${g5FT zL5>5{)vohOF@U^`xOz&cIDsk+EL1<7xe8z`IwEtiqQRFQIXlZ|O?QXQ@FdP`o5xz% zKx7@##=`?7w-IzFpeREXC1a=Sl2}En8Lv&lBgJenwe8sST7a-)evdP~M;fldzQT4g z2F(#+8$zW06uZ(kS`QZ|XR=2>AeYCqA;{tys$ z!w7YP<{#zp<#{9CSa7jYnw*84bM;uYF^W8o06KWhi&I)03*;#sk)eZ zL*b(#O17SS&dV9M?b(1((L99JFrVh4!T8cWM048bJZI0H$DQq`@x7}gXB|NwGQxY& zW^A9@$-eX@dF+^woSCsxlaG+aG1i1dB^uLqLBow5QMfr0Jsu0yq`q8x=4thouWPe8 z7^L>SeHm+Z{hbEPml2aOWJ!Hj#{9hj!Z$#83lNT%5E7HUKq)jeB#${kb=!!+LqO=k z7M!RmOPPlh)QLNNj@BlJ?YZaX)zbT%h3{M1ThFSN1**ZB{1jYemJ#=C#w=;P285F$ z*o<6HW#DJ;zLZ@*4L+GLYGrl+OZnabgweLHt}^FRqg=7>KyPe-R%0TZVD!4?HY@%%y`x1 zYMYiT*MP7I?Hrx#XfonrgR22qpl(Z9uhHe%)o}J|j~edG*(wGRlWgWeS(87b|528+ z%Hw^mpOs;u=#b;yd;4PS)Ua9f8TY{6pzaM^`Khtq_&nJeJa9ZdtHw-c$NN{-O2!xL z)k$bEh>&UvfIFf}-t36d+42>tETz7zTY2y2 zf63k%=Dbb=QFNgo76xny#9v@DTJNt@DM>FQHoUYa_NJ@#?NGyf)?^9kL> zT^l?XX1#oCmKp>@=M})N@)6M#C^PeN#svdRyMi{_1P7s^Vf(aNz5=}%E99yC*xG3o z-1}KBqgt`$wG7X3CJcyY|BkdtU|Y%SVzcXDX&tY^L$H3`SJT1PvU%FN2ZYFdAF26K zY>!r>=oD%IDi|jd^}1UZYu`54;*FE;R2GsOr!qaF*%ulHo&}KejZh&S$d& z(;8*W^+FQ2GQpUs7~3Tr9f1(}PJOfOXD>7`g1hN5v`H?%?^;J}V6mm1q!Du!OW5XN zrWx2i;}G{yx=W0tVbbe*tV&Z79t1029Fd$Wm=!cUPBH$Rb(3U>e-3) z=pmkU(fVf>Y?n-|@d!Q5R%v8|mFpV_+bj5FK3nw#YxmBTl`tQ)nMTF0-@N`fZ$m{H zJQbd~)>z{?zRs-v$LVQX|Lu;Tn|0;NxvSZ2`WG>L$i&FsPB+28b{`d>UTbU{e(2r3 zwC9XXZj9FJp5n_&vq(I~IiJ}*zS(`XeW%#xQ1k+{($3ownqb=}V&HEZ{OsAa3&ZkJ zWdDgA(LEoUWk!~;W7bFu>_*^M_W)6jp@tXu4>g!-!Md`O+)qGnvHqg5>W zLS19X3uIC~Gw~HX$OZ@lghzo;jfM^PvI``^l>57)u7ObYN*l>!tVm+++-OCksw>dntx=&P;i4UG03ligLTeoet#zx5 z#{XRbLgcbNgaot6SzWgqwt7)~r31o6@Yp~jQo?AaD-S^Juu^alwR8EaYvi3#Ts@Yp z_xiC`AN?(KE)e>ECzjy@fN*D&-vdIc145#vD?ry>Al&G8qq=hlM@+yT@*HXpq;>$x zEnFPvjY9Ij?SOD)8NFx;i$I8O0%1LF9sxpW0|-%oFhF=;MYw8qM`+h9p)bXRV4+^( zYk5+ib)3xX^0D@^+(B&sq2=Cq1PBYQ8xh12>%=-4wKwT02GpYP^=kA4&(73cXxV!% z&j3QJ0KygVmA!$@XI`%2>C`t>prdyjDK>y+4@$b=wc)y2in48}nAp|rwmZ0p(|2KM zG=0Tn{dquGJnOx7BCXqm4O_jaaV-Fy4urUgIu?}1U!u%wXIHzud|d?)K1s)|gz>3{ zjiNnl0AaCUR|Daqt=j-XRKxJ13e?B{e+0rB{x|wv0X*zrB9N8*)CglnTvLK-s(3o0 z;wi9AeWwS{$rGBPFaaRky?99F8BU z!wolY>-Eq2^hpvY@7n5p9eIK^1mY2=C0A12l73c>If`+wu$kI>us6b)(- zP$`Q9gy#-+S4|sEcQvBTu-=N0TOZFIelbA!%|K|K2!xu{3ICLN z4_`1PrsoaeRX~UclB|HSns#c{PvI@p1xR`!1qcI#0m4^{6?ezVcin~?;V`pXhY zo>~+jyg;+C#Tk&ID7p#=TU!(>6#cKo*g6Zs5!bKi1uv+(Sf)iz-K*!Ka#9NrMghWi z0>VtiqA0p*0v#ZXKGoGfdx4^tsg7fuM0QbtFhKa9#<0Z!!YGQa1;Y3#L;=DmdL9ra zfk6}?3=jqgqbLdxMp1w;3J?YeqX1!murU^%hh z3=jqgqbLdxMp1w;3J?YeqX1!ma4;4LdmTm5n<(}t3J_*$9t8-aC_oq>jG`z&82b|i z2%{)K7)6f*VX9zVF#%B&MNt$Wi~@vdby0vY#v&#lilQirHeYK82&KH$4-iICfbe61 z@KfEla?4S4*F?mnb5EDoPn`c>DTP65>pVc1LH`YbkPlXXFbWXFVvX$CK}&>_!6FCqVY!2dqtnXQfOZf3yU0|!7m||#!e7AbAr&>HiA$D*Ymu> zdY*yzv&sy8P71;9e>S6D?p3{fE{DrNzW@|7oH#0m7kqeZGRQ#9?>~(oRLW(pM1b3s zdIlluL+{TgySgS94A}~bM6w{BZj`>43PlQ@pvhUkHKQv}NW>I37Gz+JAe2)$Sj-pJ zv){_a5(k8N!G$cMm_T9Y*0R(9F5sj5YGNHCL;YYnH4Ic^;b5jV)u~Z2YZt~;xZOV^ zL|Gc&x59O+L0h|8~bG=f>YLEWuhAR z1GBj4l4=BslENi3t%oaLpv;UQj253^V7OcZKH~(TGbae0{RIsGI-rnBCLt3G^PfO@ zzMwv5w;&XMA_6nhAE9@P3tz;mFcYN+8Es%LH9I+;psO{}NVuvI@)45=xkIQ`KO7ys zd;89nk&)|HuRR?bOS~Bmia<-YWtP$;nwp=TNipM>d8mVOyNYKy{T03Rd2XKivFT{w zAbbKSct7=yh*4U&NvxtS2t{F6msiLg1pw&j9Z(asimKH0ZDIo0BtEPOW`-ul@Fn?S zng^Jgm?TFKL1w6J&a%aVu-^)Z~oWN-Xdc1r<9wJTx#k(BFUS z#!Vb&GD14g0D50f?~$QH$76A%R1v`K<|AwlX5#>vIbw1`n1myok!)Fx$r>uTv$+wlhoy zabU^T-wdibebbLcW?X)|-IC_IN{fA^P+3|s`xxo!{vsq_gmj?a)Cdp^I& zTK=UALLIsw)bT4p_z(_LBB98TB-%34Aj%Ozh$;|bfll!4dO7lW7;h`>!6AgTRTLnQ zGfWoA7FrEPJm}fnO0;_>TuM|EM#;LOxC+yVt&QCg-LFgqaQaI|Xi0@;BkqiHD!-(Fq`Jo241*;rdA{8R=Pvj*{d=Uzri zr4+`rg5c@vwUPA{+eycS^2NFTAP6Ol<%Xn9~?RFy*X!~E`p7o0qZbdIYIzL{gfjKIe3;xSY7 zLbmMmecRCQzy8MbA@L9wx88hWh77>w#^*t&GODuc~6IA8e0hO#H*7EphwOm#8kXC`RjdrvyyL}n90oU$G1g!1(@ zuBi{-|A4uZZ9e(%BSCUm0A8{Hi<&70F1ks|tGA*(gBn$>&p~BongQVq2%A)$L{)&0 z&AA-{2$6;rAVfp-qsDC-saCn>1laS2Cx2GLou=v}whAE3)-pdgF1s8Z&qVVJ{R02Yc!e#r# zP#kE0kj8lTsgw^p1P~hi$Ubg9AcPJOKtLma?-$EJV&G>FqxxH^zyULJd?`;I$YqXj=r(kg(EN~oE7z)MFRaRfS^n^Bw=ZcYUGclN!_;Nu;Nd4ZRUm;Hph z-eo<|03mI|#=7j1OG`jV<=ZCBm$+gG2)E)U5zXrZ!U^}Kb0EWtD*@r;Rj@`t*fRCD zDXA|PDj92tC7T|gt1OZ+09$^M$O;`%kpz>nYmz!boNpuvmIzo5!+;Eh&p zGXk+_31yh0j&8+G6ghL~!H3`~B0tj|8o$2*VL66iX@nDq=J`2FS0x2pUqfUw1Td_~g`K*)ewn@FRd;}M#? zmXkAM0zA$-S{)EV4sS&~Ur|O`dC8w0ap4=s)L(_%G<6%T``E zZjJ*V8C8fCx@%)&TKWXJeI!3ieL&cfIo3lN7vU&ej1cdTc9~MT?tpyN@)2NU*x?g%9--H6E|L-=uXMi zVvrRt;)!c5?GbK)=>GrT|G7pyCv3@E$`b{L%|R4UV!BSc_gGKIctD8PE5UNOt-wt@ z*v!RZa*8D-Qi>scx@1foD0OeZBH9P03ZD&K#!!T%><9+>B`y?c$-N&ERT^%&$$)~ZNV z?KR8tPFFJK4M|jnj)ck8m*`HpB9y}Vtjc@#R8|L&I}4Nn5V~X_3Ts<*ay)8?S33@! zgzvJG773@Oe2brYf62qKA=bW*L>Dj;?8NFoIB@LXn7apIba?Hg36q|=a}YF2TDEn% zsrwc`+ss*yTNbj!M~2*>N6Z>gZCz*`KxjAPaifo|sPz7NP ztUHctJnk@@N#ai7=2z{{k297${CindTJFwNL9{`GZj%& zPF#fsEl{2xMxsJ3oE)`cNxs4a(TfTY@*KIr8bP)b>4ZcGvUg}`R46cMRdR&3WMk|c zi&a^>f>4@N?jJ=B$zaOB{=dkFzTFiD2vq~p>U+Kw<&s|WY9hYU zL8GR#`$+*x&VX>H84&I`K&Ti(QkT9NW!~OAkz#**_szFnhADTIBAbQ^2J%Iy0VGb# zcCSPp#Y)XI@?=lB99^p^xvYhu)JsP+H7a*moFrd*;YD9zn*PZ5g}0}MI6UQT_KJW| zLlAQu`OZ-WyRfM|q`6N?ETjq$hAdNpw?Km7eq;=bR$}@9?9eLiordca5XymUIXi9v z;Vol5{mQ>gacD9iv~BWUHLc-203i)F5CR|hyp!Y60~%t(JdrD zGFuu#Pl+cW#KR39BZz2j369nDzEKU3CH4w(I4Rl*4&0K;&>cin!6%%BvKGGeWEMple3 z-#;O=ZEi#^CS7K3%t&qLxPk;o_O~HPdVtVw+L9p`(YD0Jv8R2?tIJ9< z_~kOmbX)ECh_wmOZR6Dr6a3=ynjdg7-g=`Fh=&BANEO(X4 zeMglsRN^{OkcL-F{6!7@op+NFSfc$7tS3kd0bylaTE5z|A8r;@=26Qb zr#yg-u|63PqQmGZ`ix#<@OgWr<$F`*(2r`&WQ_-eEsdUwH!?%4xA2~M2&o4O-s|Le zEHTeW#b1uCRry7e;3aAD8rM-D5N4M|Zg+^n>Mioq7Efk9idb6UTntv720$G#n5Iqx zgf9OQg+f}NIYWbyJRzI_2ut7!$-|LXLEXdkI0g`A!>d}G)|}(G{#EGx0Jg!9lfAk zXGt-<$eE7gCB#QxfB6;b0!><8|Cs^dOfw+d=72D%0;=b1eGw1(zI*oUzWN$2+`sVL z^Q0NXr$t4sXd4d*C7eAVj6#G?WG;lS>HT}|#WH^Afd@IlqD(f@LWo_0WIp@!GrKl6 zNC}OH&%QU`WaF^YHCkBOvQ$f~5i)&+@So(Nf;;|2zPFQFCY=7k&i|NiH{{&Ubl+;7Ai zg!*|)$Z8pLcHij*U4R6HA##*4N5ta0e)n!~Xb7klUUh>{An+K(FYdNhomKTREU+2Y z7_-kc9#Ugdc?$F=SM68=LUTg_%i&de&FnCYv>~TYL&rJ7;qpZy-w>D-Zinqb#p>*Z zq$!CQl*kW3~hJQ3_wj+xp_$zLlCChVhRWw+e|IM z7{*{;V`B!Uy8-bM0}%fQvcOE>BY&k(D%V-7);agws;*o6Ds{B)-fQI}GBP555s{hy z=l2m=N;C7<{LXncHeQN~Kp^H6%`c*J!I)>Qqb6nBLx@%ZLQfjVfB4?N!($9$HCQr^ zF1XmCI(T3$>)hd-@BZ8GupKe{+1wSuu!L=GB}{N;{oL9;((T0&!b&D1ZgeH1V>ABx zw|~(xBq3KoSeyzoTtu0+ehxvZA8pA)vpGd8|K?x+4v~T^s(k?<3~8uA<;jZL@+InF zJ=9HgFNEGug2L*-+2iq@yB z{4HMS`&d6X27@+!{Vd(X2j+gm&jY|)Wv5lQgD4klg@TdOp zPljh`tT~L7`thXcV4G5nDxuOKK;P)nANk3j>SS=0xcnDY*~*)aZx1B9L=DxC6IL~> zl{UJt0ATxOQ&GQHP%loSr40WfcXXn!z=_vu&eR~aTj|r*>I4q|ES*(YTV2;^2^u`O zQ{16A#fm#Yix+oymm&r!$^nUjwBw$Nt z&HY}U;8jus{@2%FmAW(pEyD7LXJ#;Ihli@nedCniw%+2m=gQ5#4Xz=d6>thy9AiBF zbb?S~(&yXPTuW&1TuTsWeq&$4$cWILlCH<8?VdE{0LY^M!;rabs?B?*D5^+y_K7}fOL_$aM zkzeZMj!O4T7mdqUb5F4$baW51&dHr9D7T2_cgat#XnCAzgAS(mH>w7xszM|6BV2*1MqGFY^bV`+uVr$ssOxit~tyFSxx=Kx1!ycgrt*9jTch7H( z`)8qfKko||tu>UF!s!2~f!!uA>E!vE3(a*mp zemR{i{xA_`V7kAXobgOz?$g&71rQ84RDysXSlRJDZz5xoK9xELbOA&tVH~%0rVt1DK>Yn!>}Bpp@-S&WZ+x@${H-mCO7qc572lcRyVsRI zij$*y$Q>#5;=RoHnGYOP&KC~)!;Yktd33Au-&&_UJt!(Hxc;@vg7Bfpzo*RH@5FzZKfDJs-clUP zZFu1=E~xP&_c^SKnP5WsoW+%3o;=@8L|pRS353QyUOq}~#d=i#7 zQf)$WjtY@G<|H2FK^u(>!hJvQQM;w9KZ1%0a|82uaTa^gDsdls2fcLGC&xW-nnJ0^ z7d{F7!<%bSTj`$6(+8LuJ9)cN0!%;b20>gz#}2Okp1~Rr^L86fTv%~7J%~xa#Vat9 zDZ0Bm9F8yGyE|U56j{qTefolcaa^SO2ZdKdb^h;1s=5=SH^$~^tdOGtJ8k$o8XwE* z@WTK?p18Z}xD3;_`K1F9uB{*|DP6gkxPEUFRjA(RtCp6V!j0cw#kQPo`(cCeAWTgG zHA+>#PGLCSdNJ32=X>h;UDNGECHijm$1RNqzy3-BHiG84&mDYvrXD9d_1TTNkrOTh zP>f(q{;+HW$aBWKVYZho^#86mpDzMc(Sq8i7Lw zs=7Hlc{ywku4pr`*vo=g*k}38o&?d`)aUo7I3%nKZSQr&v+9<$_TScY`g3L;?5)C{ zZUIUMS9i6tjeuR!o_nHUcWE!m57Zg{i^KR5Us+~Zj`MAWC|?3PB3)e6oBaqnWR;z& z>P!rYL^5PN+0O1K;)pUehR%MBa)oFn55AICAKm+-i4H`Mj3AlxlBl15E@d%-R#jzE zmu>3T)f^xTNFNx|La@dEFu|S#IpA@xgdQHMG)*uAXeN|N_l}M8-B`6nRbeoqpEplR z0Xh(sEutEmL^g%c=VFm*Qj_-V~Om975G7J|Mx}gH&7zD6f8<_mLzb zxs1a=P^XTbg0~VsCRT#yu3!x4)H7$o8ys7mSJ-yJBQ@Uzdv!Zm1l3o@9SM|+1(56^ z(IrHtfC20n{5&hi>=`}-KFO}MOIHha+4tXm;t1k=a3k^!Fz3IR%cGp^ zS&A$+r$QrRm2-Ac8KPtw6a*KhQ)gH&u7c@Vf5!QIcR-Va8%*l$Y+}+s9pHjOqI^+6 z4foj9G3Do~uDyE=hq7zf!=DLNhY9}MC67RY44=I@t&aGG328&6xypE2g&2kv15j(` zmM-)eT9RiPvY0OrG$YtjSi;fuan=Y1aXwmZ8^bvV0%5EwqF515sIDZ9r`7hxkPm=o zSV95Yx{`1=Gm04QJLi;>vL*g9#qR+so*Z-?FJt*&65QI&(=VJAFYI$X@^v$f|Ek5N zDNNMhJLDmK4nb7(Txr4Tkn>GdB7pRz!^F|L%JE#okgSMXorT? zHKZd+-)phy`E#+p{MoGzAZMB3Xok;yQVf(TDUEeRVz|qFDj4z2@2XWLmK)z#5l+02Nx3&KWr? zDA6Xl<>)^XjnToWONkS7BW@`qwy#Ti?eE-mH#DHUvw_B;d_I-HP+(Bvk>EA8zS@fs z`t0%nhwD&CQa2eT*-I_4eU?}&y*A;XELiPyTr!zD?dKvUgW}@YgIZl;-EcO*T;|_T zNs&Z9Nnry$nP`}FK=7?Iti68pvl|%mHwl5mpEUgvVu6aU?%!tP*r!ma0@7g5Z%x^| zx2E?C+x)g3Y=4>l^xBsZkSKmiX80x-&84|)&j^bW=K14L%9cXLy{}~Ic^*Vk>lFaA z;^Dk+X?jw}T-wr}B7=%XiTx*(=oyeLyV#6;!xeYLUYiK&R`5flD{aqw#r4Am)>+3d z)p0q$24zNUBDiq^@MxLGO4?kvlmaW#^1THD#NDQBz{8h|qpYCT;VqDZq0C!p7V{_s zlYZEPLcWbX?b9L7wg8;z8K-%99e)L}k6@;07E%_w^B&4o-*&_}%Z)%-O0owskShhz z#673=9dRy`+Ul_N8HxU&%JglsG?&&P*EAt7-`Nz$+%ETom6VLXKmH@+G)f)Zb9GGh z?ZVv1&OuKE@R7~i<1q-PfFNCZ=Y=ty6TZu1lwbev23ZC@f$(BtHaW>8?BxI<@zU+nrDKb^c+jiR^4p>o%}+u^XpG7eBjd;*bTt{0tggM!Xv>^u4T4IJNk~ac&8kq zxZ9E&JR3_w49>e!@AAYv_Y#wX7i7L~4xWvatTS36Zw(={M>N4`q(uDIH?l3R_Ah>@ zVj~(f0nLgFhQXJ?q8Y=@O(0+%jJu|Hcru%YdWl2StrTo(&-sf#frqTsQrKGs*VHWG zwWnaiDfE@pgE5s$i&uKSJ1`CRCT_+Wqv_pWaU;?HyYhWS2PUGB$IgSe+|l;ZxLpp= zld*o$>?gv=MSc%ZKkQu+DrKUW3>#O>Ov_RH5Q_wBs-t&W3Dz744sIfgvOSgoasK`2 z+tRgB>Lml-0;S+-qaVgu$wJmFZ4|LS>=C7?j;F&}`s z7mE5dcpoQ|T&w+rQQR(;;*Sf66J{2qq=Sv_#YT&%eN2=jm40}tNo%H_6Cs- zTPLCBdz+g;hd%teOx?dL1A=*lYMDLsG(E&uCQNpjrm(2!|z%`eId zsa6!tWIwtpeCc*}8mwkEry(+uXGT-Z1g<->`nY zA8R?yzo}pP54bSfha8ju6YWD0%Ot91oJ&qWOllky!=R{1?!KOgO4 zjGx&oRg!-y^0ZK}3=0V;^Am2^;A?)uy^2Pbj)cb50!UHZPzkiTy(P8Qdj=(i%!gu( z2u(Zo{>+5g`L@r%?PkPm^z6$y$1Jr@^u)q`n6Ig9=0oL=k1yZL8h=RZ#?o7ZC8Dd3 zpY2Y2b{QqfMr)3NRO$#*@@BM#&1uW0_>$Pp_?IB5Nm@LrZ1|N^(=Bm0)K47MS3dKN z1C$J?1J{v35YzZy0^j9nq6ePR7x{1uCTw&ln!4X7@cck@?P*68=&a(PEXw$ryGbq^SJ z^ptY@=>95)Fa-ym4THB(I!-q}+C5OE0bt4_99}Be@iVWLU4a<29<5#Q+a&`GffJ1` ze}0DyH0U4;Zu4{#V8GNk{d+vb16}Yj_ztn7%MA;=V#+RsRcd8tn(~qP7@~^;V z5394U=e?#p_;`-yP08~D{#genjhSaRv!Bp4@-|r9`;GZHQvj%OE=IgmyzV8fxfuKD zBa>!O)g%fqF`a^wZggZnQWVY20c@$xMD|mPjAa<16&} zs1K-R1eiK|Mxe1nlepzd0MutJdcT|}#>?7nRDm>iuE=`|cb>?=8`NK0{MbFnx}iYV(;KX}E}ZR_CefemIw!Ld$G)sH4f(6{<7n^F&Dr>~>~}Cg zGuf<~QmN3U9a1Jy1;-v!B*(ytIrBAbZL;^BqVZc=6Yb`1Ln`t2GY`lQ*_Q*b2cZIIkNln=i@rOs+Cr$+u% z?JulbDX`s3f}+;4&+DK-vMmuMbJLWYjnTavUzaiL%#a{*AH@vdSIUD4M&+2pY2>M| zkKrXroKoqFQ=-}5U8$uD+p(3magB<08y0-*L4GjvN6kJLa{Pn1gQPm~R9HVFZ4b3} zx&=w{(he$1D(n1^E-$;h_^Xz!K1$t;HmxB|TD!9g8^&_)XG&jTuvjdG_t@zUp1tq@ zRmlnn;X9=-sbV98ZL46QE%~M@#(xyywYcT#%FUk$qW7o~nFPL^+XJ8p`;y1(w<1Dg z*2%IK4lrB^lp2Z*RALc?mu%cXfpiz9?QddRTIeR?YyNykvzr@mPTYE5jg`tzt6OnW zjM9T(iv($hk*_O;8%vUb1C}E|00D4rp{zblOWcjuzJcgHlgEP7LQIK1Fy>BQo8fU0+fp} zye&t4DABZ*U}OEg@d}P*%_vl-zIeHDoc_G`^g-L_ww^fKthsmkbKyHGEKsk9!@sdc}@(3Q!RXyjJ|Ck_nx~%hQt002xN>U z$k&3Rr-CbrF@35K=dXtl4#{G79C4r-WzX?IONJfacOY)pwOqzYl}w?TW~~7dM3`>H zVMWpUz`>t89ln)GyDNf%5Q(MgTapY4aw=1KIx)r;hDW|_V7VlD;QnoA zEBZDvRhldZ=Q?UoT`l6~qcWa;CK}>W`4aEI09ryhYD$!m%PPJ{!@N6ynx{>wcd973 zO#Pe5=-s${cfu8vuD;YWG=(l%2S$qb(^#}2v|ah_&0deBA&?MW@4!ZJFCX-qb8N?k=d@X8tY0&KIO{0{u2Nf=O|Cx#3Ube~M>0F9 zB8fz!uA9vQ5ZCd`F6*DE^7O8!xiot=T}_)F^C^qREHK&!u*6>SESA49kvU=aAnRF^Cf~JNkuTcoA9arZB7ioRLiqIbAXi{Ppq zs*|BvH(_Dk1w&u`>~B1>yx9E}Apq269}YSptxi>l>#vKQ>#F84(-6Tl%yzdIcb^J? zxT~Yk3v`v#V_C{RHSwE%32i>e!vbaSfBqo@{P767g?E{v?OOSnz>tu>pN`HENFZKi z?l2p~w|}&mnQOWz@HhNgFXT{qh_QHC@C+VrteAEl6P!&yR6w(%bG-$5Byno&@XsY-*unbChR7kY$H`_L;)!zV z(*v;hs+CD!dz*mx>aKrKPM_?VF@;7C3bW-Qt%LL`jo~v-m3W3pcMjU)9k`udJW1&N zSGrEOU}JPp!z)87XI$lQQ$sa*OCwINHkg6*d69mzi-YTxE;^q8J1MV4Ytm@H-}IaR zVRx`g0y1C5ljm2v_abVqA#lyhYv`~p)<8<-Rc&##g=|8pHr!*pUO4dC*xHAUmy$Yfg3-J5cMT0~?F<3ngC9r8OjQ7wRBs}D;rx9NOLEPIV{s5{2 zAG;<4(qrClU(2w+&xdfaQsKj`xNm2Ev$v#=N?75^@Ux3q3WM4Ov5VXMK^x?6xsO5( z*{Xv-T!4oxn4NYZAg!z{#r1k!3Qknn|E%AuXV+4&Sy`&1qKxeF_=PY*tRffg7~I5d z-e_WS6cSmxK#e7+$uG)bu@a#nV%*4YJ-YGkJN0=p{ABx9Rq}{HOg!h3*ru+Q-3ndC z`{ypNz5kARcK|SP1puCHe3RjJN7N`{!P}79Opx`*%(tTZ2OvdXcelz-`cch%VQly=Bz2FVtACt}uPl$9htVM(--FOS30n-`LCYw5XYXf`gdk!2r8nnz>J7`r4- zBf#v(z=JWX(~tV*f0ixkZh`f!KO?L=ajBLR4-q1w6I00pD}k^W+<~SH%SzZPX*|U; zE@xtV-L!U7l^)CoPnlysVPQ%^0ig2siXMd*%$0O3BUrk%u3X7RGL<>sW0UM!Hcw2w zGGJR>V)KU)SM-`|JU32|fvowe!v6nssm1Gpy?(b(y-l9|Hbx(c!_Nc2b+oaz{_HUi zv`QGww(m~D4ha}OFj-D5%0Hw9S)+qHl(q^5=^scz4T1JFXBtZV22h4c$B3CPFtb`q5LNbSb=H?pIrHMz;({6A=Z^c7&i8PTk;WS8 zG|OLqT9j6OS+jP^Nmw0wFIw8;PLJWC!6Ca*>b#Z{I8She-wo8#*ys_3BE8U-wW1Uq zE_Py^5|d)Yly&nFyfJHppB)bOj%I~&yAT9ZSEC}d+?dk9(|C&+&e&PTQ_B_5?pJ<+_$h-{=MqhYXTi=67sS#fnCYwh)QdF&1x9n5xYk{pg))PtzwQ0Kj7g5i z`q2GCOb}Zu)qSYcn#Qu613#_pQSgGy+?%yB-bk-OP5Vz~97o-X2T7RgBMnT=Ab$0K zyKBF_jhY~3jYJNo2D&T$4eLIu>qfQ}8P!HZz7HYQM&8EHX#jL%&>aVgpRRmkOu|Rv z>(Kb>$dj>Cp7K^~ILv%q6{q{2V~A35;eG;6QVa?BLtJNF9WApya^n76|{dnr-08sn{Ka9rk2OVVP$D-wr2-%d(@FdRq?TdwLLl&{T@-&U(w8KeV zYjZiB$q{>)CAaafoatP(egKW?UOBkQ`u;AfApj9lLn?0L@f)z4SH&!JuvyCJfBRMB zm5%D-KJ@Gq8m*`_pNZgr=K8vW{VIO^(CX0E1%U2I>_#zyJMD4QnG(U<>_lubo*gh( z<7JV_vZ?8lFb-6I!=xCOksLtXLgxAEg$iU9regCFaN#PQXoDxFE?j|!i2kPr_N za}zzF$=#y#J-7RN8|}G%m>!Hd;L8YHW)G!EHtzSfWte`iJ-43q3l?Rru~`~bKTB<}tIswL9SDPw= zF^LTrkN_CHTPj6NM!c*3#;KIgHQ#&lZ}?^KxIecJivJrsK(d_EGm`%l4%0_EjNoV) z4rUM&5d?1gVH+c3O0a)qad+`c%6fx42{r}M<+C!gta1yo5VVdPu z@wx>XHiv^akUM}mf)TLm#nsp8Q!PBW1BNq&_Bi6Y>llEQso#l8S?UK4LtDS1Z>kRXa{An$GjP6el&&(ip$0dBA{Otr>|_DiR-*Zrf; zxaam0x-T)!|10cItOFne{{}j5IRKKO5oziHJ0hvvYqAyH@v}GV?~x(@WkEjG5`et? zxE-a{gq&O_{GPb!9ff01@J~1#^9fB0ys)Xco`=Q$NZH{{oP2f@Rp$lIRDi2d^b{T# zTY5RD9QN@Z8p#go$gT&A>)z!oQKqv&**dQ9#EBb%WW=kc=B___7!=8dxO?-Yt!t;0 z=_%Rz9>UZfhVzPnTk|0t8nX7Vv&p(L4jI@wLmM@(?*pJ>gR}9DC&5YM%=MwvV#P`r zKIpf2oBY*GSO-t;i9;O#p!)P(_s0(!x}`&t{M4=R7>4H9i-Z*wNF6Yq-;aW87m13^ zl6MA1_*@BA6D3gD=Ly;zPAT&|&!C zgg=oL9r8erkTNU{8UrR;!d9Gm)-+xDGTOgrz;mgcUobTA#IM}JW13yiPS>@X8+`g% zv{}@hK1|&dpYto}cK{BQxjgP!Ya^(fXH7dvznDY;c?{CyacxD?T}UAA<27-z_DdM{ zqNGwpO8-!GlYYDxR~YaS-$hK^1*fjSZZK2b-)AIJA-(iG-s2*^@7QYVG>ym;9d@%6 zxd)gV%5YeCk@`$r%cVTsz$AhHm5$Rg;h_|0e~sR4VYsdPlrQsG%=!L^Mvv8IZo4>iPr$^*Htn}Trx5wwla*QZH zx=Nkh#jP#Z-8PC)m7I*XR`HP}86=SlbV^?^2vG(R4Os52;m)K@V zV9A?%@Qfng9l5<;+H*AQy%)Z9goBEd)+Y0w=G+UM`_2qsSggRf?fLK;Xl*FGfyD=( zh&jJs!Sy9~rYSdU7*&7ncjr3el$o*%TKkp=oyU+b6cM46PAWYWKy< z&v`;F%TgXZt98n540w#sFFP+mDa703N#|eJCIa^tmuacuehfdV6pUrLBPmt2TeDQK zl_r5nm~-BMFjQti{rNK-bsCL4RqIRVm`h3A7rPFDVWq7=rC_yY-TTNX3)h?zaL12Z zxvkb6v2*fgyXU%66^Gl23`cb}nN0GTUP|kcuaMh%*Squ0puiSl|Gg4FMNv^Bo+4~y ztv%&j{;wvb;R+U>pHwIBU<>Thb17AYRB4n}Sj6g(t61q=MZh8ITAP{CG%96jl^ z8Ub35oxIravYex+?0V}}`iqZhN)-GzN}fpaK5H|KRTK{=#MCt(cN&ve7d_ z^2gTdV6OM%N;@d!kqnzI`44$>(r&II*~dV4r(c^ zTfROcPZrD+W-dPk!9n^1WW;?8TdEKpcK?gG1V9Tw6bbNXiwmv1(^kdke)LO$rjKu z(^u@q$BNl^0&u8BN`_$AMxMez({~Tp6f=Hftc?Y*bAJ4oCZy+=k__uX*vucd{a>pJ z{cv7rqa}B+tO0uCY{OVeXAC<`KY#@CvP_tGN`bnu52~Vr&N`Okd+Lq~0&eY6E&h^F z;a{9FNV#!$HKaHS*6QJP!z$mp+VTP#J9wn^SFk;Zp`=*=mpRmdUecZSr0nTodPC|e)m`aNLkUB2?tj{q+d{h=wDrD+S|fov>ZVlYeDbLYV$YldJOi;! zC5J7jbxw(2NBUvTDMzD0h+UAUxbAN73{>6XvMh1Ngg_-pdeaw8a0HDJc12ON!R*X* z3r{(SBmH0E^pHN-Wp<~z7a@37%vR9Q5R5j}=iV)nP5_z@9isF(1;g!vn5(ey#&4@naxlaLWLYb5B`s$61 z78N?e86(YBNZ;DwcB^`L^^Ry8?_iaqC$`#e93MWX8Nb4oJWAZAh*f5nH1$Pb#Q|p+ zRu*%q34qrn;=->=Ion6%s{v_2#IqL8!!)?|FRZ{F-%_CzPSdlX*BMC6v$j3Kho9G+ z*=tATX*DqkOTb&y7Td6T&sEWjp%EE|SvHvrlz zk=bWiF)pVc60>!4+^EVo8v17U>ORBnz?qI1w>1*)ya-iAHG||$VOO4fC;4mA!o-Ma@Oa*M_tzx<3T7O(juPzL`9sS z2#rNl-46R?{ge@E0=0QyiLKItVY0_De%Fxa$_PFp5c2?**bY<^da8z#6iLby-5h@{ zX@){z+LN!8itQ91cH4p=DobXBtK-ev+LD)4Ba3nF+=6Z1vH+ zfxSM=7zHt*xUt>1JlN&Eou#CDKgaj^R!4hWNccSMv>?xgpn?$W{e%Sz*hv-h(__;X zwvDIUVf^2nTK9jXpvOZ5%#RboNWkBX9K&G~Uz52fR^(B<)Aaabu8xh3G{|~Z7s_A3B73xfmuuB<5$rj9qqVy#{c?RSyCi5^2UAThAZX*G5#kt|B&$7j&F^sbbxkG&f zUIdCXNJW!1=N9nzN|$23s%gVk4t6OY7%4bmyKg1fzn;w#PQ19Pn(2=hKM=X(^>R z@jw67`nUod9Lo*=X8AdMMCPwX%BV!PRX^V?h+#+NJVXK&J>ZCM=JSDxQV|}5UxoDA z-CbttoRIBr`d*2aM+k3%_okGF)7FB0uWJTYg0FS6PMdj^It>G|Cx6z}@}nOAS$9p& zEyQXh9BQ(=WsFbW>LD@8w5fc{7whI9e9N7|WIk!{(T@t;*PIajvr% zBp&s@W=>8jI^iBi<|mn5E_4R(0c$3I{UoMwC*WXHpM0Jcl3RWU84ImX!%e-1rM7k{ zse?6XyEigWLJe!5gNzO!g|q&V1Z@kZ@G`Ppc#yql@oRxF1%VlxQqup1Dr}mL`Hj(B zv3Pk}Ni#fT*?cqe_beKV~Gt7#}+F$ms{vl|k7sQOBd3QSSnBH`#@qC`B`c=@z z^u!X(Y2StCon481Ibg6T6PtlLV=>A@(`=tV(C<~^h76SZgJG=a_iN$~gFgb*9-hw( zj&FE(Q*TWo^GxIt#rzvj^mP{0ax0@uVcAny4_*RKHqG#ZH8ZP}SMerC>y1TRGlTGs zdj&54vS}}bn}O+TlU@hLxE988I4i));xjGkiVR4j-7q&{s3j27y1`SzmqOmA5eJ&i z@O)If)Kiuj?>kis!a(P3$6hqj!9z6A-5t29ZA^9CX zK0zd3%H3RKP3jZ-Z;An4OSv0>fqqmf<(gFLFp)6FF|!4T^{uk$Cu676JwK%vkR_#* z<7=L(yV)N*bVd-VP3U$&VZcfA)faJM)&>sA;br|xM(i^f~3LI!<%m_t$7MrKDjpnwcYN4cLj{HR9?@GtBhVSf_b zlh+~_va}zqwc~l;ModfnM)^4pvyZB|Vx4xlJY7`Noe~ZS@aa)mbGycx+^%G_0)*se zmQ_G!%dBSn@p|~b!31kE5CcQjQGleSmtck_CmJ!WlL@Cbl7L0Gf|(NuA)Sovr&fEj z28T0T)0PO!q(N|~LvWI#BC_G}fNy5}9)Zf`CtBCnIbebPSyuH zrJQS;l@l4-7VtI)pIaffc6VVGQ5g>~?XMa#UP{gE+QDaA^c2^PRz({Llr0a7su25g zxuBECD`{Z11V-qLmGW;+MD?qwV3SxiYTM9+kn(cS9TpWYl0IEOUmEV-(TXoJ$r)FX z?NHCBGWyQ)fulDhn8j%&IH|Eyx!0v1i*xo=a5JeAWz~L@;(RQM`r#NBIX_Q9I>g&K ze#HY;!>u$?HkN~_;y5>lf3ci)ZB7G{4JSdo;tQ39AJm?w?M7)C_>}4W;r>hs%_SWu zM9;=xXR!$BGP9#0=-hctOJ%;BXk0E-6V>j-lkEyVLN1Wt!vf0Iti)3k+`uZx%$|$< zM0H!{F>{`_s5YISKW>^NE5$5d;!AWlj9GJ$>31Bp!kHHGB#VBg+z~+__PDJaAtNJ0 zmx2tCdvg)$y>2X(K?-}i$T6yp|Ei$!B*KuYLtWSN4scJUF= zP%^13+5VyF%MczO2jBH{3(}snW@P38(mK5J4#kdbDlSL-qM*4o?Ibg8*iBREYa5Lfqz|86)@wRX_Z3K zM$0i~RQsJp$~qwG4vbe^FIM{pD%LaC{NqFXt992oL7=pJglbDA0&!V$d&X3uJCS-; z4a??As*&jlx(+mzp$9V9q2e54^xOoK{HYq^KlGAga2gVWSemqmX@}QJ~jt)dUJx;N@z14M%_xWEVJyc_hlml ztE|D*4|EaDNg@4Qhz#T|Q6vF85sJFayOF3j%2-8tI4s5P&E#mh9iM~Z`v!ih;1d>$ zR+?%t@E4gZ{$ESwr;m4)aWf&CaUvZu$k_uX#RK6-uk;dQ=zq%q5IUtEm-0*`wTFZ+dl};*M;3_EM(RE zjd(Lu@RnHLxVjxDZ!mK_bYpX_b~3O+VGVANX1!@B-%v{ggIiOCd+J#q0-Df*_9n$D zu;W%j*;%Dj@M(VZ?OLA@uVi7h5@g7}*LojD_Ir=K98pA@svdhK9{}|;*a-GUurDUa zK!EBnGbe!Q6po6R&yn z5DRP*owm(j4#e}_L9gzwXI%B*q&8oC+O`Ft_+n0O@RL$6-RgdiJkHQ$p0lX_LoZ`~ z#j+@bXVPFIFuKByfkpV+NE}%#0tAQCc_d9ZSS=g@NG&jHxGiL}mMK%&x^m7hQfF?0 z?6r1cjQp{vR>=|kek!3?BIlr2Vj6C zsxt>+>AAXN=&!?>5<7q+cftFeBdNQ`HsOk36tPeY=B5C+-3}eWQMpM>!*L|mn?Z3wN%;zGe~2tCf22Lwf!%K6P$KInlQbG`)IGi>I``9@BC-A zW@Ay=T(x&XNmjOOeoz4kn?Kd%Ly;xOmifZc9Hk#eW9-7nZDsS-Zj31)oJ@ggI1%t_^>K^nz);jMJ; z7)=;%symJ3i(ZnDR0K5AMLq-3Qky1~*h(Rg$hK!{`u5udg`@fE&$}R`!JIT%_WsUn zij@djgiLf;dxbEqCarLL>>6^j9INI9T^uZ-wKAA1q-RoGfvYoNpd{n_eUUtD{%9m$ z-}d7M_o?r5sU$P&pe~Vk?Gu)b?Uy3LNg%XgR5as!(+r<-#mzgWE$kBt8iUE4=f!%5 zmPo4U5II|5a{&8|%l_H;644;j?sUAn+Xgc2m&eL4-|0F~=@KKV_4460wKl~qa_zqXe>Bm$~`iyJaXqfb4JWzU9_>+WbN%gE_etLcFT+b#jb~(XQuS_?+@6r ze%dV=q&vtvzr}s%mM1O}?Z6p$kCd~jAZQtb;&qpW#IZ5D@WpDMFrkWFR*T1I)s#)r zAzEO~WFw&1k=xFX?2Lz&t&)x9>KTMjUd@NXP|b4{ot~@rS(cvYW2g;!>H!MQ@Xa&_@^5omdX(%FJF&4-d5a*)dejL;@L^0Kz7lp-_7@!t%?J|D(+YA>q5|4p*fAt6A5 zd)!GW!wxrgt$>bM+ydp3E=cVhMQB4CSioXVW*%{)J}v+ppv}3bO%a~Jj$M`MqP*)@ zFtxHpqQNzG0D;Rx-+!52cxc@dMDRUANMnr^5B}K|4yKWDtXVRA-`ocLkh}=K;Ag1d zUt}|xB%j6_Q(|Y&I!0e}1aBNVFFVIqO@c zRM^X_r{i|Ma1-Ua7{_v<@}Fs$q~4E(gafHNUp1xMkkG|`T>jk6P*{KL$ypE271a(E z5Q+QXGf$K9CS7)t)r$ey)Ts8g5XqZroh;lp{iTkO|f2eIIq==?W4m8RG!uVdUTd!6 zgi{{8m?QJDP*JEiPogdOo>y2F05K-FG37Wh>6%FzmapBCWPSP`l*0J^+Rsg`ym1F~ zk54S2L19ju&9+9*w%9<4ZJgP%(&pDS$F)L3PF?uFR8=B~&fQFMLfE zUb3*Z_)@}#jXJ+lxLIxK@ih%Yvw^S}gEiFgAdIV`GFIMP9xvwB0OCUb$Kjk$d8#fY zBMY05Z7XY2f^w^)X-}D#OV7u|Jnn@)Cku=A@D}tf7apS%gyAJ)JdQ`fZ?rK#{s-)2 zi4a*Jjpo651&d*#rl{%lZ3NABOL?a?89f+fL(_ym!3$JIEpFtNq8h14=&#qKho zy`b`mf$hYe@0)bMRgHwe497qDMNTaW**!b3g4qsJC|wu+J5IRq@rbVoz$HNd*M*&7 z>pywA8H$oz%$i%lG|7c$g|juPvg2IS%y?G756L7Q)R@=-#};&)BuPvw7Y*wlF~`R|F0G)at$Qc zV8`o-s60e5MFIN;B}v`vuRK78)Tb0R~I0L+kcG=5raR$`aTXcMk6HQTTr~LCP12rmUZr~%R;mA z&xkeCtKXQ_CR+LuSr<-vFo&kV+A`m?Aji5PiqRRM@>Tyv5Xi9Z>7b0X!ySj>f-fdYIxuyOj06GuYE^+T+JoGiN!+ z*(>e7+=rNPupU<;csJzued3M|{Sg>)!ZyqAmBt6K_hI@Q`615 z*2+C3KQ0+LI*Z5x-Fa-5$^iU`T*gZ|Ot809t$)MSx7BlRzA98jglG_9>~H^mKFU*h z>`DRneMtazr>*6b5K6dxR-E=TeCo?hFi(K~r-D_V{`TsHaoJil>qQ$LyXh^5{S!=T zBOe54AzWTcbruQs*^vktRnz@BFI{iyMBeF+syV;Z*wmEm{%CMyFz3d6ugf~0=3;q) zCbMehO$H%o{)H%Y=j#NeqdO0hTzDo zo+NI*G$effJSeP6a@Fm9(TSQoo#^rIvl(vszqh-@J|6L8Hb}_H*1snI2zDPe$S2LN z8H}m>0O0i1Wuq+EOtJK@q4iHgILVX+@Fc5-#4?4kJkng#bs{#k$~Q-N$zhg$!rUFa zEC4^pOf)JFe>0LDyb~wYNeakUbKf2Bi!4zYviO7Sm|-}PQr9#y`F++a%tUlk zlNy z#7^|0Wcg=q7Sq8!1@7$f(!k&`S{%dgJQu~2{P3X0@&u-jGJq=XHMBGHh)?70?=4Xv zlSTjxjPfMYp!<7GWS!%l6NiSMe!5vpACJ1>pn@y3wI}i_K?2t<-#%K>Q+XJhG*$vxwA!jVXYG>S=4B)86#uP~Bfh7#%K_U+N<)bl;xInVj_^X#?P-s@fO`u%?I z``_OCT^dDeExUgWoSvW?+qH~!H60#r1!VCU$Thgg4ZHHHdZ7pFeVWmJ-+P^nS9awqXfU0}`_Q7SuYr5WyF-5dd_vG(vNyijR^;)E z1;IL&nR~#2jwGtd^FP#IXBd*REhJs{bW ze{(e5*Ci`E{%h%Nrp#G60-Tbq-qT@g5Lvb|{b!GX`-)>b8@Q@1U+?HQJL%m-34%8K zS{G^He8@2Mc=Yy!)aQmPRc0KbDaYzXsS7LRQf=j93%C8L}* z7D`QLixz-sx~f#bU>!i%{pDn z@8b#Ffmk;|g9C;@rz`imy)3n+Hu9}&JJ1Y;u0U$UD|0+5-LrfeSVik z;p-JHA1@7Zm69F#C3ao?&OaqiU0AUM$Pw*8^YYZFpYI*fz&?Dnx0lHJtby$4K65?X zwkWioisM>AGfD^YVRg%g{P%JGUkf;UKiLP4ROPJ^-?B?$`melTD~b^+#kU42^QLGx zC;)_ZVTkL#oC?b&ZHR9b&(=I^HLq7Ec{&+qf1ok4xvlqCD3D?a@Pol4C16X}BXM*< zjFG7lR1?7kWu1xZ!WDURECc{VC?W;4JwJ_u22a3=Wd*eX7`q|+4n>Ib!5z!->f{GR z7yY55Qy(zwaw-ppn4bhSVL+fuJoV%-rlzp41heV)?4vFN94~Hc>`YWJYj|PPGqnAH5F@mKo;MUDKrN zJ*<9ZggGPQ!XGO3iw>&H)@M!@iL*+_uT%IF`0&EWVe_n+Z6ugQ8eW`h20gDS74k=> ze3mwf(mf7rDb-PXGj!>ZkLE1d6jj&_)y5Z z=6!ANwoHz=Mz>_m`Wl1Bz0`c%eV1s@I?#c$qk+f5@c zc{Y_ZT3S)}6KQTBe+e7xrUF8#qRat*ytQ{vq^ZV^e!`H#adTnI@8g}%a#m5;7LcVX z`+R(e3cY}dR4F~wD0nOOzYQ`?DT(;$SXF8JdqKi)-zH??LV}%9t*#!5H=GB4b z^^`dE1#`;1I#3R(v>|)cJYD*yk`+B}*W;0r@ZSI;IJ|(s3OT{Fj^bI>9IF}t^9u^9 zq6268rV`35pT_vEOIi*H?pC*6$~6`wAxcTqLMBTRd@f_>{dhtVv8I>r#vPDNXdEXl z23*t*wkPD)W_*%S3OU2*Fk$WVW!+WR*i42OqCg~OL}?hDyGlZcq5^1?4#;vp^ z&ZIe#0ejLW#Eu|&0K!NQ_zMSqR|r?FH_84JQ!2RNADfLDbP^;GJ))7dkCo{(Bt1ep z?XrxE$0k|e38e2NBQTVpQ^D{&<18eEQq}^K%PEyv68Mdzuf-~`&v!oGi2BtLJ~U|~ zgvSU$TnqvSfFv`&)7+%H&vfRCJ;G;RlX<27AN1e-{grHU-sTsVAxfy?Br-?F%OUOm z2-JTq-;9I9PD&*Ck7@5dVX_-amVru)niZ=kh}$8ewZYrd^4)~w7nVnVWcas;{uX#` zWxgyTxHLy3B}ocSrK%Rvu~&oLF@Fe&SY)UI!_$>Wz8=FXtjm~-1LsuOlH3MoN$C6C z2TB1*O_E4IX4>;LfcG*P#E}ME=lMf2&I{jL@OUuz331t<)5fY$F_o9DN$+qrMV_G? MXf8I_Airb(22RWWbN~PV literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 128441082..7466ec441 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,9 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", + "satori": "^0.10.14", "serve-handler": "^6.1.6", + "sharp": "^0.33.5", "shiki": "^1.22.2", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", @@ -286,6 +288,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", @@ -690,6 +702,367 @@ "mlly": "^1.7.1" } }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1256,6 +1629,22 @@ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==" }, + "node_modules/@shuding/opentype.js": { + "version": "1.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", + "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", + "license": "MIT", + "dependencies": { + "fflate": "^0.7.3", + "string.prototype.codepointat": "^0.2.1" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", @@ -1852,6 +2241,15 @@ "node": ">= 0.8" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -2027,6 +2425,19 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2043,6 +2454,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colorjs.io": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", @@ -2126,6 +2547,38 @@ "node": ">= 8" } }, + "node_modules/css-background-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", + "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", + "license": "MIT" + }, + "node_modules/css-box-shadow": { + "version": "1.0.0-3", + "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", + "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -2824,6 +3277,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -2967,6 +3426,12 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", + "license": "MIT" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3504,6 +3969,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hex-rgb": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", + "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -3637,6 +4114,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -4085,6 +4568,25 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", @@ -5284,6 +5786,22 @@ "integrity": "sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==", "license": "MIT" }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, + "node_modules/parse-css-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", + "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4", + "hex-rgb": "^4.1.0" + } + }, "node_modules/parse-entities": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", @@ -5467,6 +5985,12 @@ "points-on-curve": "0.2.0" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, "node_modules/preact": { "version": "10.24.3", "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", @@ -6441,6 +6965,33 @@ "node": ">=14.0.0" } }, + "node_modules/satori": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.10.14.tgz", + "integrity": "sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==", + "license": "MPL-2.0", + "dependencies": { + "@shuding/opentype.js": "1.4.0-beta.0", + "css-background-parser": "^0.1.0", + "css-box-shadow": "1.0.0-3", + "css-to-react-native": "^3.0.0", + "emoji-regex": "^10.2.1", + "escape-html": "^1.0.3", + "linebreak": "^1.1.0", + "parse-css-color": "^0.2.1", + "postcss-value-parser": "^4.2.0", + "yoga-wasm-web": "^0.3.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/satori/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "license": "MIT" + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -6464,6 +7015,18 @@ "node": ">=4" } }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/serve-handler": { "version": "6.1.6", "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", @@ -6498,6 +7061,54 @@ "node": "*" } }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6541,6 +7152,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -6671,6 +7291,12 @@ "node": ">=8" } }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "license": "MIT" + }, "node_modules/stringify-entities": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", @@ -6783,6 +7409,12 @@ "node": ">=14" } }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, "node_modules/tinyexec": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", @@ -7341,6 +7973,16 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, "node_modules/unicorn-magic": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", @@ -7942,6 +8584,12 @@ "node": ">=8" } }, + "node_modules/yoga-wasm-web": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz", + "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==", + "license": "MIT" + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index 013f5017e..e7f8abd9f 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,9 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", + "satori": "^0.10.14", "serve-handler": "^6.1.6", + "sharp": "^0.33.5", "shiki": "^1.22.2", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", diff --git a/quartz.config.ts b/quartz.config.ts index e96ee4843..dc339d987 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -19,6 +19,7 @@ const config: QuartzConfig = { baseUrl: "quartz.jzhao.xyz", ignorePatterns: ["private", "templates", ".obsidian"], defaultDateType: "created", + generateSocialImages: false, theme: { fontOrigin: "googleFonts", cdnCaching: true, diff --git a/quartz/cfg.ts b/quartz/cfg.ts index 85527a093..135f58499 100644 --- a/quartz/cfg.ts +++ b/quartz/cfg.ts @@ -2,6 +2,7 @@ import { ValidDateType } from "./components/Date" import { QuartzComponent } from "./components/types" import { ValidLocale } from "./i18n" import { PluginTypes } from "./plugins/types" +import { SocialImageOptions } from "./util/og" import { Theme } from "./util/theme" export type Analytics = @@ -60,11 +61,15 @@ export interface GlobalConfiguration { * Quartz will avoid using this as much as possible and use relative URLs most of the time */ baseUrl?: string + /** + * Whether to generate social images (Open Graph and Twitter standard) for link previews + */ + generateSocialImages: boolean | Partial theme: Theme /** * Allow to translate the date in the language of your choice. * Also used for UI translation (default: en-US) - * Need to be formated following BCP 47: https://en.wikipedia.org/wiki/IETF_language_tag + * Need to be formatted following BCP 47: https://en.wikipedia.org/wiki/IETF_language_tag * The first part is the language (en) and the second part is the script/region (US) * Language Codes: https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes * Region Codes: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 diff --git a/quartz/cli/handlers.js b/quartz/cli/handlers.js index 01adc55f4..6b23d8010 100644 --- a/quartz/cli/handlers.js +++ b/quartz/cli/handlers.js @@ -356,6 +356,15 @@ export async function handleBuild(argv) { source: "**/*.*", headers: [{ key: "Content-Disposition", value: "inline" }], }, + { + source: "**/*.webp", + headers: [{ key: "Content-Type", value: "image/webp" }], + }, + // fixes bug where avif images are displayed as text instead of images (future proof) + { + source: "**/*.avif", + headers: [{ key: "Content-Type", value: "image/avif" }], + }, ], }) const status = res.statusCode diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index cf79434fa..f4c9d490e 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -3,14 +3,118 @@ import { FullSlug, joinSegments, pathToRoot } from "../util/path" import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/resources" import { googleFontHref } from "../util/theme" import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import satori, { SatoriOptions } from "satori" +import fs from "fs" +import sharp from "sharp" +import { ImageOptions, SocialImageOptions, getSatoriFont, defaultImage } from "../util/og" +import { unescapeHTML } from "../util/escape" + +/** + * Generates social image (OG/twitter standard) and saves it as `.webp` inside the public folder + * @param opts options for generating image + */ +async function generateSocialImage( + { cfg, description, fileName, fontsPromise, title, fileData }: ImageOptions, + userOpts: SocialImageOptions, + imageDir: string, +) { + const fonts = await fontsPromise + const { width, height } = userOpts + + // JSX that will be used to generate satori svg + const imageComponent = userOpts.imageStructure(cfg, userOpts, title, description, fonts, fileData) + + const svg = await satori(imageComponent, { width, height, fonts }) + + // Convert svg directly to webp (with additional compression) + const compressed = await sharp(Buffer.from(svg)).webp({ quality: 40 }).toBuffer() + + // Write to file system + const filePath = joinSegments(imageDir, `${fileName}.${extension}`) + fs.writeFileSync(filePath, compressed) +} + +const extension = "webp" + +const defaultOptions: SocialImageOptions = { + colorScheme: "lightMode", + width: 1200, + height: 630, + imageStructure: defaultImage, + excludeRoot: false, +} export default (() => { - const Head: QuartzComponent = ({ cfg, fileData, externalResources }: QuartzComponentProps) => { + let fontsPromise: Promise + + let fullOptions: SocialImageOptions + const Head: QuartzComponent = ({ + cfg, + fileData, + externalResources, + ctx, + }: QuartzComponentProps) => { + // Initialize options if not set + if (!fullOptions) { + if (typeof cfg.generateSocialImages !== "boolean") { + fullOptions = { ...defaultOptions, ...cfg.generateSocialImages } + } else { + fullOptions = defaultOptions + } + } + + // Memoize google fonts + if (!fontsPromise && cfg.generateSocialImages) { + fontsPromise = getSatoriFont(cfg.theme.typography.header, cfg.theme.typography.body) + } + + const slug = fileData.filePath + // since "/" is not a valid character in file names, replace with "-" + const fileName = slug?.replaceAll("/", "-") + + // Get file description (priority: frontmatter > fileData > default) + const fdDescription = + fileData.description?.trim() ?? i18n(cfg.locale).propertyDefaults.description const titleSuffix = cfg.pageTitleSuffix ?? "" const title = (fileData.frontmatter?.title ?? i18n(cfg.locale).propertyDefaults.title) + titleSuffix - const description = - fileData.description?.trim() ?? i18n(cfg.locale).propertyDefaults.description + let description = "" + if (fdDescription) { + description = unescapeHTML(fdDescription) + } + + if (fileData.frontmatter?.socialDescription) { + description = fileData.frontmatter?.socialDescription as string + } else if (fileData.frontmatter?.description) { + description = fileData.frontmatter?.description + } + + const fileDir = joinSegments(ctx.argv.output, "static", "social-images") + if (cfg.generateSocialImages) { + // Generate folders for social images (if they dont exist yet) + if (!fs.existsSync(fileDir)) { + fs.mkdirSync(fileDir, { recursive: true }) + } + + if (fileName) { + // Generate social image (happens async) + generateSocialImage( + { + title, + description, + fileName, + fileDir, + fileExt: extension, + fontsPromise, + cfg, + fileData, + }, + fullOptions, + fileDir, + ) + } + } + const { css, js } = externalResources const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) @@ -18,7 +122,37 @@ export default (() => { const baseDir = fileData.slug === "404" ? path : pathToRoot(fileData.slug!) const iconPath = joinSegments(baseDir, "static/icon.png") - const ogImagePath = `https://${cfg.baseUrl}/static/og-image.png` + + const ogImageDefaultPath = `https://${cfg.baseUrl}/static/og-image.png` + // "static/social-images/slug-filename.md.webp" + const ogImageGeneratedPath = `https://${cfg.baseUrl}/${fileDir.replace( + `${ctx.argv.output}/`, + "", + )}/${fileName}.${extension}` + + // Use default og image if filePath doesnt exist (for autogenerated paths with no .md file) + const useDefaultOgImage = fileName === undefined || !cfg.generateSocialImages + + // Path to og/social image (priority: frontmatter > generated image (if enabled) > default image) + let ogImagePath = useDefaultOgImage ? ogImageDefaultPath : ogImageGeneratedPath + + // TODO: could be improved to support external images in the future + // Aliases for image and cover handled in `frontmatter.ts` + const frontmatterImgUrl = fileData.frontmatter?.socialImage + + // Override with default og image if config option is set + if (fileData.slug === "index") { + ogImagePath = ogImageDefaultPath + } + + // Override with frontmatter url if existing + if (frontmatterImgUrl) { + ogImagePath = `https://${cfg.baseUrl}/static/${frontmatterImgUrl}` + } + + // Url of current page + const socialUrl = + fileData.slug === "404" ? url.toString() : joinSegments(url.toString(), fileData.slug!) return ( @@ -32,11 +166,35 @@ export default (() => { )} + {/* OG/Twitter meta tags */} + + + + + - {cfg.baseUrl && } - - + + + {/* Dont set width and height if unknown (when using custom frontmatter image) */} + {!frontmatterImgUrl && ( + <> + + + + + + )} + + {cfg.baseUrl && ( + <> + + + + + + + )} diff --git a/quartz/plugins/transformers/frontmatter.ts b/quartz/plugins/transformers/frontmatter.ts index cf3880eff..417b21853 100644 --- a/quartz/plugins/transformers/frontmatter.ts +++ b/quartz/plugins/transformers/frontmatter.ts @@ -71,6 +71,10 @@ export const FrontMatter: QuartzTransformerPlugin> = (userOpts) const cssclasses = coerceToArray(coalesceAliases(data, ["cssclasses", "cssclass"])) if (cssclasses) data.cssclasses = cssclasses + const socialImage = coalesceAliases(data, ["socialImage", "image", "cover"]) + + if (socialImage) data.socialImage = socialImage + // fill in frontmatter file.data.frontmatter = data as QuartzPluginData["frontmatter"] } @@ -93,6 +97,7 @@ declare module "vfile" { lang: string enableToc: string cssclasses: string[] + socialImage: string comments: boolean | string }> } diff --git a/quartz/util/escape.ts b/quartz/util/escape.ts index 197558c7d..ac59cc74d 100644 --- a/quartz/util/escape.ts +++ b/quartz/util/escape.ts @@ -6,3 +6,12 @@ export const escapeHTML = (unsafe: string) => { .replaceAll('"', """) .replaceAll("'", "'") } + +export const unescapeHTML = (html: string) => { + return html + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll(""", '"') + .replaceAll("'", "'") +} diff --git a/quartz/util/og.tsx b/quartz/util/og.tsx new file mode 100644 index 000000000..0430a265d --- /dev/null +++ b/quartz/util/og.tsx @@ -0,0 +1,200 @@ +import { FontWeight, SatoriOptions } from "satori/wasm" +import { GlobalConfiguration } from "../cfg" +import { QuartzPluginData } from "../plugins/vfile" +import { JSXInternal } from "preact/src/jsx" +import { ThemeKey } from "./theme" + +/** + * Get an array of `FontOptions` (for satori) given google font names + * @param headerFontName name of google font used for header + * @param bodyFontName name of google font used for body + * @returns FontOptions for header and body + */ +export async function getSatoriFont(headerFontName: string, bodyFontName: string) { + const headerWeight = 700 as FontWeight + const bodyWeight = 400 as FontWeight + + // Fetch fonts + const headerFont = await fetchTtf(headerFontName, headerWeight) + const bodyFont = await fetchTtf(bodyFontName, bodyWeight) + + // Convert fonts to satori font format and return + const fonts: SatoriOptions["fonts"] = [ + { name: headerFontName, data: headerFont, weight: headerWeight, style: "normal" }, + { name: bodyFontName, data: bodyFont, weight: bodyWeight, style: "normal" }, + ] + return fonts +} + +/** + * Get the `.ttf` file of a google font + * @param fontName name of google font + * @param weight what font weight to fetch font + * @returns `.ttf` file of google font + */ +async function fetchTtf(fontName: string, weight: FontWeight): Promise { + try { + // Get css file from google fonts + const cssResponse = await fetch(`https://fonts.googleapis.com/css?family=${fontName}:${weight}`) + const css = await cssResponse.text() + + // Extract .ttf url from css file + const urlRegex = /url\((https:\/\/fonts.gstatic.com\/s\/.*?.ttf)\)/g + const match = urlRegex.exec(css) + + if (!match) { + throw new Error("Could not fetch font") + } + + // Retrieve font data as ArrayBuffer + const fontResponse = await fetch(match[1]) + + // fontData is an ArrayBuffer containing the .ttf file data (get match[1] due to google fonts response format, always contains link twice, but second entry is the "raw" link) + const fontData = await fontResponse.arrayBuffer() + + return fontData + } catch (error) { + throw new Error(`Error fetching font: ${error}`) + } +} + +export type SocialImageOptions = { + /** + * What color scheme to use for image generation (uses colors from config theme) + */ + colorScheme: ThemeKey + /** + * Height to generate image with in pixels (should be around 630px) + */ + height: number + /** + * Width to generate image with in pixels (should be around 1200px) + */ + width: number + /** + * Whether to use the auto generated image for the root path ("/", when set to false) or the default og image (when set to true). + */ + excludeRoot: boolean + /** + * JSX to use for generating image. See satori docs for more info (https://github.com/vercel/satori) + * @param cfg global quartz config + * @param userOpts options that can be set by user + * @param title title of current page + * @param description description of current page + * @param fonts global font that can be used for styling + * @param fileData full fileData of current page + * @returns prepared jsx to be used for generating image + */ + imageStructure: ( + cfg: GlobalConfiguration, + userOpts: UserOpts, + title: string, + description: string, + fonts: SatoriOptions["fonts"], + fileData: QuartzPluginData, + ) => JSXInternal.Element +} + +export type UserOpts = Omit + +export type ImageOptions = { + /** + * what title to use as header in image + */ + title: string + /** + * what description to use as body in image + */ + description: string + /** + * what fileName to use when writing to disk + */ + fileName: string + /** + * what directory to store image in + */ + fileDir: string + /** + * what file extension to use (should be `webp` unless you also change sharp conversion) + */ + fileExt: string + /** + * header + body font to be used when generating satori image (as promise to work around sync in component) + */ + fontsPromise: Promise + /** + * `GlobalConfiguration` of quartz (used for theme/typography) + */ + cfg: GlobalConfiguration + /** + * full file data of current page + */ + fileData: QuartzPluginData +} + +// This is the default template for generated social image. +export const defaultImage: SocialImageOptions["imageStructure"] = ( + cfg: GlobalConfiguration, + { colorScheme }: UserOpts, + title: string, + description: string, + fonts: SatoriOptions["fonts"], + _fileData: QuartzPluginData, +) => { + // How many characters are allowed before switching to smaller font + const fontBreakPoint = 22 + const useSmallerFont = title.length > fontBreakPoint + + // Setup to access image + const iconPath = `https://${cfg.baseUrl}/static/icon.png` + return ( +
    +
    + +

    + {title} +

    +
    +

    + {description} +

    +
    + ) +} From f24a1472765e0752bcf158a3db53a717b8dc2191 Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Thu, 14 Nov 2024 06:28:06 -0500 Subject: [PATCH 045/303] fix(comment): negate check (closes #1582) (#1586) --- quartz/components/Comments.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quartz/components/Comments.tsx b/quartz/components/Comments.tsx index 5f379a1bd..5f29860c2 100644 --- a/quartz/components/Comments.tsx +++ b/quartz/components/Comments.tsx @@ -27,9 +27,9 @@ function boolToStringBool(b: boolean): string { export default ((opts: Options) => { const Comments: QuartzComponent = ({ displayClass, fileData, cfg }: QuartzComponentProps) => { // check if comments should be displayed according to frontmatter - const commentsFlag: boolean = - fileData.frontmatter?.comments === true || fileData.frontmatter?.comments === "true" - if (!commentsFlag) { + const disableComment: boolean = + !fileData.frontmatter?.comments || fileData.frontmatter?.comments === "false" + if (disableComment) { return <> } From 410001b9426d6a50ea9570b8cf6313f8c5122537 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 18 Nov 2024 11:39:44 -0800 Subject: [PATCH 046/303] docs: add the pond (#1598) --- docs/showcase.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/showcase.md b/docs/showcase.md index 0cdf39dae..67bb755ff 100644 --- a/docs/showcase.md +++ b/docs/showcase.md @@ -9,6 +9,7 @@ Want to see what Quartz can do? Here are some cool community gardens: - [Socratica Toolbox](https://toolbox.socratica.info/) - [Morrowind Modding Wiki](https://morrowind-modding.github.io/) - [Aaron Pham's Garden](https://aarnphm.xyz/) +- [The Pond](https://turntrout.com/welcome) - [Pelayo Arbues' Notes](https://pelayoarbues.com/) - [Stanford CME 302 Numerical Linear Algebra](https://ericdarve.github.io/NLA/) - [A Pattern Language - Christopher Alexander (Architecture)](https://patternlanguage.cc/) From 1a4cfa606f085fab115c578d8c97023b0641676d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 00:36:08 -0500 Subject: [PATCH 047/303] chore(deps): bump the production-dependencies group with 3 updates (#1600) Bumps the production-dependencies group with 3 updates: [@clack/prompts](https://github.com/natemoo-re/clack/tree/HEAD/packages/prompts), [satori](https://github.com/vercel/satori) and [shiki](https://github.com/shikijs/shiki/tree/HEAD/packages/shiki). Updates `@clack/prompts` from 0.7.0 to 0.8.1 - [Release notes](https://github.com/natemoo-re/clack/releases) - [Changelog](https://github.com/bombshell-dev/clack/blob/main/packages/prompts/CHANGELOG.md) - [Commits](https://github.com/natemoo-re/clack/commits/@clack/prompts@0.8.1/packages/prompts) Updates `satori` from 0.10.14 to 0.11.3 - [Release notes](https://github.com/vercel/satori/releases) - [Commits](https://github.com/vercel/satori/compare/0.10.14...0.11.3) Updates `shiki` from 1.22.2 to 1.23.1 - [Release notes](https://github.com/shikijs/shiki/releases) - [Changelog](https://github.com/shikijs/shiki/blob/main/CHANGELOG.md) - [Commits](https://github.com/shikijs/shiki/commits/v1.23.1/packages/shiki) --- updated-dependencies: - dependency-name: "@clack/prompts" dependency-type: direct:production update-type: version-update:semver-minor dependency-group: production-dependencies - dependency-name: satori dependency-type: direct:production update-type: version-update:semver-minor dependency-group: production-dependencies - dependency-name: shiki dependency-type: direct:production update-type: version-update:semver-minor dependency-group: production-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 134 ++++++++++++++++++++++++++++------------------ package.json | 6 +-- 2 files changed, 84 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7466ec441..1933fa5b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "4.4.0", "license": "MIT", "dependencies": { - "@clack/prompts": "^0.7.0", + "@clack/prompts": "^0.8.1", "@floating-ui/dom": "^1.6.12", "@myriaddreamin/rehype-typst": "^0.5.0-rc7", "@napi-rs/simple-git": "0.1.19", @@ -58,10 +58,10 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", - "satori": "^0.10.14", + "satori": "^0.11.3", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.22.2", + "shiki": "^1.23.1", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -255,23 +255,23 @@ } }, "node_modules/@clack/core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.3.tgz", - "integrity": "sha512-5ZGyb75BUBjlll6eOa1m/IZBxwk91dooBWhPSL67sWcLS0zt9SnswRL0l26TVdBhb0wnWORRxUn//uH6n4z7+A==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.4.tgz", + "integrity": "sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==", "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "node_modules/@clack/prompts": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.7.0.tgz", - "integrity": "sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.8.1.tgz", + "integrity": "sha512-I263nEUNbX4lPTX93trl1fkIvGrGlz6nUYkqOddF0ZmjqcxUgUlXmpUIUqfapirRKJrFddvwF+qdZgg8cSqF7g==", "bundleDependencies": [ "is-unicode-supported" ], "dependencies": { - "@clack/core": "^0.3.3", + "@clack/core": "0.3.4", "is-unicode-supported": "*", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" @@ -1584,41 +1584,41 @@ } }, "node_modules/@shikijs/core": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.2.tgz", - "integrity": "sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.23.1.tgz", + "integrity": "sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==", "dependencies": { - "@shikijs/engine-javascript": "1.22.2", - "@shikijs/engine-oniguruma": "1.22.2", - "@shikijs/types": "1.22.2", + "@shikijs/engine-javascript": "1.23.1", + "@shikijs/engine-oniguruma": "1.23.1", + "@shikijs/types": "1.23.1", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.3" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.2.tgz", - "integrity": "sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.23.1.tgz", + "integrity": "sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==", "dependencies": { - "@shikijs/types": "1.22.2", + "@shikijs/types": "1.23.1", "@shikijs/vscode-textmate": "^9.3.0", - "oniguruma-to-js": "0.4.3" + "oniguruma-to-es": "0.4.1" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.2.tgz", - "integrity": "sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.23.1.tgz", + "integrity": "sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==", "dependencies": { - "@shikijs/types": "1.22.2", + "@shikijs/types": "1.23.1", "@shikijs/vscode-textmate": "^9.3.0" } }, "node_modules/@shikijs/types": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.2.tgz", - "integrity": "sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.23.1.tgz", + "integrity": "sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==", "dependencies": { "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" @@ -2568,6 +2568,14 @@ "node": ">=4" } }, + "node_modules/css-gradient-parser": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.16.tgz", + "integrity": "sha512-3O5QdqgFRUbXvK1x5INf1YkBz1UKSWqrd63vWsum8MNHDBYD5urm3QtxZbKU259OrEXNM26lP/MPY3d1IGkBgA==", + "engines": { + "node": ">=16" + } + }, "node_modules/css-to-react-native": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", @@ -3191,6 +3199,11 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -5764,15 +5777,14 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/oniguruma-to-js": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", - "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", + "node_modules/oniguruma-to-es": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.4.1.tgz", + "integrity": "sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==", "dependencies": { - "regex": "^4.3.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "emoji-regex-xs": "^1.0.0", + "regex": "^5.0.0", + "regex-recursion": "^4.2.1" } }, "node_modules/package-json-from-dist": { @@ -5927,9 +5939,9 @@ "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -6106,9 +6118,25 @@ "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" }, "node_modules/regex": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", - "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz", + "integrity": "sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.2.1.tgz", + "integrity": "sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" }, "node_modules/rehype-autolink-headings": { "version": "7.1.0", @@ -6966,14 +6994,14 @@ } }, "node_modules/satori": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/satori/-/satori-0.10.14.tgz", - "integrity": "sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==", - "license": "MPL-2.0", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.11.3.tgz", + "integrity": "sha512-Wg7sls0iYAEETzi9YYcY16QVIqXjZT06XjkwondC5CGhw1mhmgKBCub8cCmkxdl/naXXQD+m29CFgn8pwtYCnA==", "dependencies": { "@shuding/opentype.js": "1.4.0-beta.0", "css-background-parser": "^0.1.0", "css-box-shadow": "1.0.0-3", + "css-gradient-parser": "^0.0.16", "css-to-react-native": "^3.0.0", "emoji-regex": "^10.2.1", "escape-html": "^1.0.3", @@ -7129,14 +7157,14 @@ } }, "node_modules/shiki": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.2.tgz", - "integrity": "sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.23.1.tgz", + "integrity": "sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==", "dependencies": { - "@shikijs/core": "1.22.2", - "@shikijs/engine-javascript": "1.22.2", - "@shikijs/engine-oniguruma": "1.22.2", - "@shikijs/types": "1.22.2", + "@shikijs/core": "1.23.1", + "@shikijs/engine-javascript": "1.23.1", + "@shikijs/engine-oniguruma": "1.23.1", + "@shikijs/types": "1.23.1", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } diff --git a/package.json b/package.json index e7f8abd9f..11c1c91ea 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "quartz": "./quartz/bootstrap-cli.mjs" }, "dependencies": { - "@clack/prompts": "^0.7.0", + "@clack/prompts": "^0.8.1", "@floating-ui/dom": "^1.6.12", "@myriaddreamin/rehype-typst": "^0.5.0-rc7", "@napi-rs/simple-git": "0.1.19", @@ -84,10 +84,10 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", - "satori": "^0.10.14", + "satori": "^0.11.3", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.22.2", + "shiki": "^1.23.1", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", From a727b57e46355ae59ac6f26078c29f0d24b2b841 Mon Sep 17 00:00:00 2001 From: Jules Kreuer <25013642+not-a-feature@users.noreply.github.com> Date: Thu, 21 Nov 2024 01:29:43 +0100 Subject: [PATCH 048/303] docs(hosting): add apache config example (#1608) --- docs/hosting.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/hosting.md b/docs/hosting.md index eaeea19b2..8b945a24b 100644 --- a/docs/hosting.md +++ b/docs/hosting.md @@ -247,6 +247,28 @@ server { } ``` +### Using Apache + +Here's an example of how to do this with Apache: + +```apache title=".htaccess" +RewriteEngine On + +ErrorDocument 404 /404.html + +# Rewrite rule for .html extension removal (with directory check) +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI}.html -f +RewriteRule ^(.*)$ $1.html [L] + +# Handle directory requests explicitly +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^(.*)/$ $1/index.html [L] +``` + +Don't forget to activate brotli / gzip compression. + ### Using Caddy Here's and example of how to do this with Caddy: From e1d754ef79e8c04d6fe0f9031ce74baf48d3bb10 Mon Sep 17 00:00:00 2001 From: plyght Date: Fri, 22 Nov 2024 14:44:40 -0500 Subject: [PATCH 049/303] Update showcase.md (#1611) --- docs/showcase.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/showcase.md b/docs/showcase.md index 67bb755ff..bb95accab 100644 --- a/docs/showcase.md +++ b/docs/showcase.md @@ -30,5 +30,6 @@ Want to see what Quartz can do? Here are some cool community gardens: - [🥷🏻🌳🍃 Computer Science & Thinkering Garden](https://notes.yxy.ninja) - [Eledah's Crystalline](https://blog.eledah.ir/) - [🌓 Projects & Privacy - FOSS, tech, law](https://be-far.com) +- [Zen Browser Docs](https://docs.zen-browser.app) 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)! From 7ac94e1d840b58e1400e5dd08533eed9e7418d70 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Sun, 1 Dec 2024 03:03:20 +0100 Subject: [PATCH 050/303] fix(comments): properly check if comments is in frontmatter (#1627) --- quartz/components/Comments.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quartz/components/Comments.tsx b/quartz/components/Comments.tsx index 5f29860c2..0bfd82d2d 100644 --- a/quartz/components/Comments.tsx +++ b/quartz/components/Comments.tsx @@ -28,7 +28,8 @@ export default ((opts: Options) => { const Comments: QuartzComponent = ({ displayClass, fileData, cfg }: QuartzComponentProps) => { // check if comments should be displayed according to frontmatter const disableComment: boolean = - !fileData.frontmatter?.comments || fileData.frontmatter?.comments === "false" + typeof fileData.frontmatter?.comments !== "undefined" && + (!fileData.frontmatter?.comments || fileData.frontmatter?.comments === "false") if (disableComment) { return <> } From 0c4281eb537d1d7675bcf8f84316a5d7ed0b3bcb Mon Sep 17 00:00:00 2001 From: Bao <6306455+baodrate@users.noreply.github.com> Date: Tue, 3 Dec 2024 00:41:55 -0600 Subject: [PATCH 051/303] fix: use time HTML element for date strings (#1622) --- quartz/components/ContentMeta.tsx | 10 ++++------ quartz/components/Date.tsx | 2 +- quartz/components/PageList.tsx | 10 +++------- quartz/components/styles/contentMeta.scss | 2 +- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/quartz/components/ContentMeta.tsx b/quartz/components/ContentMeta.tsx index 5dfec1448..e378bccee 100644 --- a/quartz/components/ContentMeta.tsx +++ b/quartz/components/ContentMeta.tsx @@ -1,4 +1,4 @@ -import { formatDate, getDate } from "./Date" +import { Date, getDate } from "./Date" import { QuartzComponentConstructor, QuartzComponentProps } from "./types" import readingTime from "reading-time" import { classNames } from "../util/lang" @@ -30,7 +30,7 @@ export default ((opts?: Partial) => { const segments: (string | JSX.Element)[] = [] if (fileData.dates) { - segments.push(formatDate(getDate(cfg, fileData)!, cfg.locale)) + segments.push() } // Display reading time if enabled @@ -39,14 +39,12 @@ export default ((opts?: Partial) => { const displayedTime = i18n(cfg.locale).components.contentMeta.readingTime({ minutes: Math.ceil(minutes), }) - segments.push(displayedTime) + segments.push({displayedTime}) } - const segmentsElements = segments.map((segment) => {segment}) - return (

    - {segmentsElements} + {segments}

    ) } else { diff --git a/quartz/components/Date.tsx b/quartz/components/Date.tsx index 26b59647c..0a92cc4c3 100644 --- a/quartz/components/Date.tsx +++ b/quartz/components/Date.tsx @@ -27,5 +27,5 @@ export function formatDate(d: Date, locale: ValidLocale = "en-US"): string { } export function Date({ date, locale }: Props) { - return <>{formatDate(date, locale)} + return } diff --git a/quartz/components/PageList.tsx b/quartz/components/PageList.tsx index cc0124a8f..c0538f5fa 100644 --- a/quartz/components/PageList.tsx +++ b/quartz/components/PageList.tsx @@ -46,13 +46,9 @@ export const PageList: QuartzComponent = ({ cfg, fileData, allFiles, limit, sort return (
  1. -
    - {page.dates && ( -

    - -

    - )} -
    +

    + {page.dates && } +

    diff --git a/quartz/components/styles/contentMeta.scss b/quartz/components/styles/contentMeta.scss index 4d89f65d5..7874f9eba 100644 --- a/quartz/components/styles/contentMeta.scss +++ b/quartz/components/styles/contentMeta.scss @@ -3,7 +3,7 @@ color: var(--gray); &[show-comma="true"] { - > span:not(:last-child) { + > *:not(:last-child) { margin-right: 8px; &::after { From adb326c933426bb350bbde8580ef7ddc0fee59c3 Mon Sep 17 00:00:00 2001 From: Aaron Bull Schaefer Date: Mon, 2 Dec 2024 22:43:22 -0800 Subject: [PATCH 052/303] fix(style): ensure images have no background color when linked (#1623) --- quartz/styles/base.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 34d7e40fa..512af0dd0 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -85,7 +85,7 @@ a { line-height: 1.4rem; &:has(> img) { - background-color: none; + background-color: transparent; border-radius: 0; padding: 0; } From 285c0e9768db8db79a7262cbd5aafb186ab8ca8c Mon Sep 17 00:00:00 2001 From: catcodeme <1020082805@qq.com> Date: Tue, 3 Dec 2024 14:50:50 +0800 Subject: [PATCH 053/303] docs(showcase): 8cat.life (#1617) --- docs/showcase.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/showcase.md b/docs/showcase.md index bb95accab..95e434983 100644 --- a/docs/showcase.md +++ b/docs/showcase.md @@ -31,5 +31,6 @@ Want to see what Quartz can do? Here are some cool community gardens: - [Eledah's Crystalline](https://blog.eledah.ir/) - [🌓 Projects & Privacy - FOSS, tech, law](https://be-far.com) - [Zen Browser Docs](https://docs.zen-browser.app) +- [🪴8cat life](https://8cat.life) 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)! From 5a5ef670fee5f5f65981801a7ec9c2e563fe99ad Mon Sep 17 00:00:00 2001 From: "Francisco Gama T. R." Date: Tue, 3 Dec 2024 06:56:59 +0000 Subject: [PATCH 054/303] fix(darkmode): check for null (#1531) --- quartz/components/scripts/darkmode.inline.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/quartz/components/scripts/darkmode.inline.ts b/quartz/components/scripts/darkmode.inline.ts index 038ae0fe5..56009a39a 100644 --- a/quartz/components/scripts/darkmode.inline.ts +++ b/quartz/components/scripts/darkmode.inline.ts @@ -27,9 +27,10 @@ document.addEventListener("nav", () => { // Darkmode toggle const themeButton = document.querySelector("#darkmode") as HTMLButtonElement - themeButton.addEventListener("click", switchTheme) - window.addCleanup(() => themeButton.removeEventListener("click", switchTheme)) - + if (themeButton) { + themeButton.addEventListener("click", switchTheme) + window.addCleanup(() => themeButton.removeEventListener("click", switchTheme)) + } // Listen for changes in prefers-color-scheme const colorSchemeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)") colorSchemeMediaQuery.addEventListener("change", themeChange) From 11c98f56008969430436bc58b088a91c4cbe12a4 Mon Sep 17 00:00:00 2001 From: hill Date: Tue, 3 Dec 2024 10:52:36 +0100 Subject: [PATCH 055/303] feat(i18n): add zh-TW (#1621) --- quartz/i18n/index.ts | 2 + quartz/i18n/locales/zh-TW.ts | 82 ++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 quartz/i18n/locales/zh-TW.ts diff --git a/quartz/i18n/index.ts b/quartz/i18n/index.ts index f328ada8d..97b0323b8 100644 --- a/quartz/i18n/index.ts +++ b/quartz/i18n/index.ts @@ -14,6 +14,7 @@ import uk from "./locales/uk-UA" import ru from "./locales/ru-RU" import ko from "./locales/ko-KR" import zh from "./locales/zh-CN" +import zhTw from "./locales/zh-TW" import vi from "./locales/vi-VN" import pt from "./locales/pt-BR" import hu from "./locales/hu-HU" @@ -59,6 +60,7 @@ export const TRANSLATIONS = { "ru-RU": ru, "ko-KR": ko, "zh-CN": zh, + "zh-TW": zhTw, "vi-VN": vi, "pt-BR": pt, "hu-HU": hu, diff --git a/quartz/i18n/locales/zh-TW.ts b/quartz/i18n/locales/zh-TW.ts new file mode 100644 index 000000000..f0db0bf0c --- /dev/null +++ b/quartz/i18n/locales/zh-TW.ts @@ -0,0 +1,82 @@ +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: "Created with", + }, + 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} 條筆記。`, + }, + tagContent: { + tag: "標籤", + tagIndex: "標籤索引", + itemsUnderTag: ({ count }) => `此標籤下有 ${count} 條筆記。`, + showingFirst: ({ count }) => `顯示前 ${count} 個標籤。`, + totalTags: ({ count }) => `總共有 ${count} 個標籤。`, + }, + }, +} as const satisfies Translation From 5ccc2dcbba3bfeca2d9edc39209d43d217eb2a80 Mon Sep 17 00:00:00 2001 From: Sohum <31165513+ssmendon@users.noreply.github.com> Date: Tue, 3 Dec 2024 02:52:51 -0700 Subject: [PATCH 056/303] fix(head): update open-graph width and height protocol per ogp (#1512) Co-authored-by: Aaron Pham --- quartz/components/Head.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index f4c9d490e..a8e4974d1 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -181,8 +181,6 @@ export default (() => { <> - - )} From 8141cb1587295b05277a5d380e8006deca6e88c6 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Wed, 11 Dec 2024 00:43:27 +0100 Subject: [PATCH 057/303] fix(cssclasses): apply frontmatter classes uniformly between page types (#1645) --- quartz/components/pages/FolderContent.tsx | 6 +++--- quartz/components/pages/TagContent.tsx | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/quartz/components/pages/FolderContent.tsx b/quartz/components/pages/FolderContent.tsx index 7a49d494f..593073b96 100644 --- a/quartz/components/pages/FolderContent.tsx +++ b/quartz/components/pages/FolderContent.tsx @@ -71,7 +71,7 @@ export default ((opts?: Partial) => { }) const cssClasses: string[] = fileData.frontmatter?.cssclasses ?? [] - const classes = ["popover-hint", ...cssClasses].join(" ") + const classes = cssClasses.join(" ") const listProps = { ...props, sort: options.sort, @@ -84,8 +84,8 @@ export default ((opts?: Partial) => { : htmlToJsx(fileData.filePath!, tree) return ( -
    -
    {content}
    +
    +
    {content}
    {options.showFolderCount && (

    diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx index e41ab4644..5b9fbe282 100644 --- a/quartz/components/pages/TagContent.tsx +++ b/quartz/components/pages/TagContent.tsx @@ -38,7 +38,7 @@ export default ((opts?: Partial) => { ? fileData.description : htmlToJsx(fileData.filePath!, tree) const cssClasses: string[] = fileData.frontmatter?.cssclasses ?? [] - const classes = ["popover-hint", ...cssClasses].join(" ") + const classes = cssClasses.join(" ") if (tag === "/") { const tags = [ ...new Set( @@ -50,8 +50,8 @@ export default ((opts?: Partial) => { tagItemMap.set(tag, allPagesWithTag(tag)) } return ( -

    -
    +
    +

    {content}

    {i18n(cfg.locale).pages.tagContent.totalTags({ count: tags.length })}

    From 367bb0e6ce89219ea94980a7ff127aa474c54b1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 03:53:51 -0500 Subject: [PATCH 058/303] chore(deps): bump the production-dependencies group across 1 directory with 14 updates (#1655) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Aaron Pham --- package-lock.json | 423 +++++++++++++---------------- package.json | 28 +- quartz/build.ts | 6 +- quartz/plugins/transformers/ofm.ts | 8 +- 4 files changed, 214 insertions(+), 251 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1933fa5b8..524803acc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,14 @@ "version": "4.4.0", "license": "MIT", "dependencies": { - "@clack/prompts": "^0.8.1", + "@clack/prompts": "^0.8.2", "@floating-ui/dom": "^1.6.12", - "@myriaddreamin/rehype-typst": "^0.5.0-rc7", + "@myriaddreamin/rehype-typst": "^0.5.0-rc9", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", "chalk": "^5.3.0", - "chokidar": "^4.0.1", + "chokidar": "^4.0.2", "cli-spinner": "^0.2.10", "d3": "^7.9.0", "esbuild-sass-plugin": "^3.3.1", @@ -24,20 +24,20 @@ "github-slugger": "^2.0.0", "globby": "^14.0.2", "gray-matter": "^4.0.3", - "hast-util-to-html": "^9.0.3", + "hast-util-to-html": "^9.0.4", "hast-util-to-jsx-runtime": "^2.3.2", "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", - "lightningcss": "^1.28.1", + "lightningcss": "^1.28.2", "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", - "mermaid": "^11.4.0", + "mermaid": "^11.4.1", "micromorph": "^0.4.5", - "pixi.js": "^8.5.2", - "preact": "^10.24.3", - "preact-render-to-string": "^6.5.11", + "pixi.js": "^8.6.5", + "preact": "^10.25.2", + "preact-render-to-string": "^6.5.12", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", @@ -58,10 +58,10 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", - "satori": "^0.11.3", + "satori": "^0.12.0", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.23.1", + "shiki": "^1.24.2", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -80,15 +80,15 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.9.0", + "@types/node": "^22.10.2", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", "@types/yargs": "^17.0.33", "esbuild": "^0.24.0", - "prettier": "^3.3.3", + "prettier": "^3.4.2", "tsx": "^4.19.2", - "typescript": "^5.6.3" + "typescript": "^5.7.2" }, "engines": { "node": "20 || >=22", @@ -255,39 +255,24 @@ } }, "node_modules/@clack/core": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.4.tgz", - "integrity": "sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.5.tgz", + "integrity": "sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==", "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "node_modules/@clack/prompts": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.8.1.tgz", - "integrity": "sha512-I263nEUNbX4lPTX93trl1fkIvGrGlz6nUYkqOddF0ZmjqcxUgUlXmpUIUqfapirRKJrFddvwF+qdZgg8cSqF7g==", - "bundleDependencies": [ - "is-unicode-supported" - ], + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.8.2.tgz", + "integrity": "sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==", "dependencies": { - "@clack/core": "0.3.4", - "is-unicode-supported": "*", + "@clack/core": "0.3.5", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, - "node_modules/@clack/prompts/node_modules/is-unicode-supported": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@emnapi/runtime": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", @@ -1089,12 +1074,11 @@ } }, "node_modules/@myriaddreamin/rehype-typst": { - "version": "0.5.0-rc7", - "resolved": "https://registry.npmjs.org/@myriaddreamin/rehype-typst/-/rehype-typst-0.5.0-rc7.tgz", - "integrity": "sha512-oIUmJzV8c+PZoV4TZwSupN9e06EaC2i0DpjU6NPe6y0HE7MoPOd35s6i+RjdSNPDguqBdP2MO4VaqnGahQW/ig==", - "license": "MIT", + "version": "0.5.0-rc9", + "resolved": "https://registry.npmjs.org/@myriaddreamin/rehype-typst/-/rehype-typst-0.5.0-rc9.tgz", + "integrity": "sha512-6YZ7KkoWch/5bOBUHAbHX3lpYV0KfS7Cwa6/AdU70YoQCLxU2nut9D+vNMH0iWujFU8545nMngh2D0vZRKOofA==", "dependencies": { - "@myriaddreamin/typst-ts-node-compiler": "^0.5.0-rc7", + "@myriaddreamin/typst-ts-node-compiler": "^0.5.0-rc9", "@types/hast": "^3.0.0", "@types/katex": "^0.16.0", "hast-util-from-html-isomorphic": "^2.0.0", @@ -1105,35 +1089,33 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler/-/typst-ts-node-compiler-0.5.0-rc8.tgz", - "integrity": "sha512-RpMkKYyH7DDJwfX4hMhCkCbby5+rU7UMqRbCe6jmkvrW+FhW5YDxATYnRVEQLgRjbLwGDV5bECLr2/9no+Tn7A==", - "license": "Apache-2.0", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler/-/typst-ts-node-compiler-0.5.1.tgz", + "integrity": "sha512-VR/0U7GHPeynFYEtBFo2NOrG8wxMYd2KYeTOALBKu+Bvt8xSjcrdrAOI/c1QYWP1ZwLzrngHGj+4zMBBxVw5hw==", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-android-arm64": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-darwin-arm64": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-darwin-x64": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": "0.5.0-rc8", - "@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": "0.5.0-rc8" + "@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-android-arm64": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-darwin-arm64": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-darwin-x64": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": "0.5.1", + "@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": "0.5.1" } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi/-/typst-ts-node-compiler-android-arm-eabi-0.5.0-rc8.tgz", - "integrity": "sha512-gSd1Nw4FNGixQTRo4isntK2Utupu4yfKRMTgmB6aLn57GVf6Z6NDA4YLw0lQ8dNB4OYceX1wMXmjnoLZGiTk6Q==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi/-/typst-ts-node-compiler-android-arm-eabi-0.5.1.tgz", + "integrity": "sha512-lKGEuFshXocY5c6S/gTGtih1j3Re5Ll3yKglsGIi0NRwgkWf1Br+NAsokFwp6FB8v3IxatxGZU6nhderhGDDpA==", "cpu": [ "arm" ], - "license": "Apache-2.0", "optional": true, "os": [ "android" @@ -1143,13 +1125,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-android-arm64": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm64/-/typst-ts-node-compiler-android-arm64-0.5.0-rc8.tgz", - "integrity": "sha512-1eSqCcLASxbdcicxFtYoXrBz4Rm7uhhWu/0DQ8Qo7bvNkzHuRtc4KkyuCZ6NCb/WzWuR4He20ySJZJRZurpgOQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm64/-/typst-ts-node-compiler-android-arm64-0.5.1.tgz", + "integrity": "sha512-PuvsutqJNM/dWNd0O3jX03wGZqlLd15lxfrH2JSLApKED3HzOp4k/bG6NrMxzQsMfPT+OVLEQCmwotGxqVrFJg==", "cpu": [ "arm64" ], - "license": "Apache-2.0", "optional": true, "os": [ "android" @@ -1159,13 +1140,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-darwin-arm64": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-arm64/-/typst-ts-node-compiler-darwin-arm64-0.5.0-rc8.tgz", - "integrity": "sha512-KKty+9lpfzogptuQs78JaFLijucrIdUxnYrCqWR2wHTgc0rnQaqHyec0HQ0oApNDc6u59xURebglQ/nHAVa+WQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-arm64/-/typst-ts-node-compiler-darwin-arm64-0.5.1.tgz", + "integrity": "sha512-6zHTIEXcM73dQWzeLJ3ojGk7prf9TYvcfxyCkCX5He3BdPx0lRFLCccXzvkdnTf/bpXLKXd+OKd7re/waf3Klg==", "cpu": [ "arm64" ], - "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -1175,13 +1155,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-darwin-x64": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-x64/-/typst-ts-node-compiler-darwin-x64-0.5.0-rc8.tgz", - "integrity": "sha512-e1P7GkyBV34h9eTDceZDC3qC0stDSN30R1gbZyniHOWu+qIKp0+RgQOLbkMj1Bk+vsOYGtb3zlqRJGEOCImz8w==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-x64/-/typst-ts-node-compiler-darwin-x64-0.5.1.tgz", + "integrity": "sha512-c2LmL9Dc74Y4DdCNDq+fDckTzYSpozNrjbfPn3hwwK/CbiP+/3iVD5vGKRAvwoWSOLveCdI0PlnO3XeGA+xdqQ==", "cpu": [ "x64" ], - "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -1191,13 +1170,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf/-/typst-ts-node-compiler-linux-arm-gnueabihf-0.5.0-rc8.tgz", - "integrity": "sha512-HX19C6kWO8aeg+Ki4pQm2TTmYYLZEW653QwZEoCluAlX7O5HoGxCbsFLnE7v3+ag1dwBcoI2oH5czuKLI7GRvA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf/-/typst-ts-node-compiler-linux-arm-gnueabihf-0.5.1.tgz", + "integrity": "sha512-xBX0H66MUbpTekqa1WGDZRWQaXb9i6VqXgfjFk5ZUG8dyU2VZsmi5s7ibdburCWdOhu6LTl2B5OoaPL5YArdew==", "cpu": [ "arm" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1207,13 +1185,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu/-/typst-ts-node-compiler-linux-arm64-gnu-0.5.0-rc8.tgz", - "integrity": "sha512-ElCka7rGGnB5nmY/Ei6fhS8JWNFRJDTagW1NM2feGvEazpMxDOQDWPg/bUXnUp7RS68L67gyXJSNFlHNWJM6/w==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu/-/typst-ts-node-compiler-linux-arm64-gnu-0.5.1.tgz", + "integrity": "sha512-LYSOj99sQoBdmZKiPq+/Ap4HjNZC5W1wyO3FknmaIUASdtAMYp6VqLMl1uS+YjvdZ5roao51encu11XrfYPNew==", "cpu": [ "arm64" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1223,13 +1200,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl/-/typst-ts-node-compiler-linux-arm64-musl-0.5.0-rc8.tgz", - "integrity": "sha512-RbaI/i0rVzu2fyCcUPj89Zt/kmpHqJvxS/VRtbXR6xjXBUBisheRLvmWJrDdMMLf2mS0cwRPxQHGKCOSmB6U5A==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl/-/typst-ts-node-compiler-linux-arm64-musl-0.5.1.tgz", + "integrity": "sha512-PFeTuei5EwKTA85kqTIt066Uc7ojGxQErRbPYJhPraRaPXXfO7FXQAmpsPdXNiSeWiC87IwPDrd4RIp7XcjlsA==", "cpu": [ "arm64" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1239,13 +1215,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu/-/typst-ts-node-compiler-linux-x64-gnu-0.5.0-rc8.tgz", - "integrity": "sha512-Mi2TruUZ97ZP920fMdvebRVYfMBxQZXnt14f0CqCy4tmg9sI7/ymBaGhT0vIo7A01cWr1DeTtoE4qUrOzXcDyA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu/-/typst-ts-node-compiler-linux-x64-gnu-0.5.1.tgz", + "integrity": "sha512-zz1XeL0hPvGOpbcgTXVKguFWALoLZ1cM8rhkE9X0+ZJWpeObjq9AirRR9vG7YYW43FthTNZ6EjYcFlAODoegbA==", "cpu": [ "x64" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1255,13 +1230,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl/-/typst-ts-node-compiler-linux-x64-musl-0.5.0-rc8.tgz", - "integrity": "sha512-I/GTNDl3Pb9/TyBRPtJqXuykkZ3d07PrSxnUKo1CelpJCk6S3h1BY0vl/3OwpENWGzy0FJehzkF0F8//3XzCgg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl/-/typst-ts-node-compiler-linux-x64-musl-0.5.1.tgz", + "integrity": "sha512-5ox7W+9z0xgQNkDGwRIUqNL4jSdigKVcVv3iePs8Qlh8FeKTqDgNye48vvUJo/VYWk0rkz2HjW+zxfWZfIOptw==", "cpu": [ "x64" ], - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1271,13 +1245,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc/-/typst-ts-node-compiler-win32-arm64-msvc-0.5.0-rc8.tgz", - "integrity": "sha512-G0c+IqUDPdUDnTKyFl1ajf47oGgV1asc3aYtl23U71RK4R0ILnyycgGjE/5E8hD0CLodq5xMV+zW+17TZ4VX0A==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc/-/typst-ts-node-compiler-win32-arm64-msvc-0.5.1.tgz", + "integrity": "sha512-j/W25eaSYJtNyMIRSKFwlpTcwxnwcfABWMq542gVUNwVCrJhjfto1iQ6OToG/qBpD02CJEUydetT1C2H7GFtpA==", "cpu": [ "arm64" ], - "license": "Apache-2.0", "optional": true, "os": [ "win32" @@ -1287,13 +1260,12 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": { - "version": "0.5.0-rc8", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc/-/typst-ts-node-compiler-win32-x64-msvc-0.5.0-rc8.tgz", - "integrity": "sha512-qlZXCfLDUm1btpESBa4onU2ky7ALwdj369dAmgslNKyOl5JN8RYcyf9Hm7fp8WeVlxVjH2/2zJgPysAHf+SSRw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc/-/typst-ts-node-compiler-win32-x64-msvc-0.5.1.tgz", + "integrity": "sha512-z1DvhykbCAkJPLZw7WKFMHvnb0vT7dBaQpfa7kLvjSkX44wVP45k3T4jegP4+RAWtmzMBN5bSpjYCiMawPLBXQ==", "cpu": [ "x64" ], - "license": "Apache-2.0", "optional": true, "os": [ "win32" @@ -1584,50 +1556,50 @@ } }, "node_modules/@shikijs/core": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.23.1.tgz", - "integrity": "sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.2.tgz", + "integrity": "sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==", "dependencies": { - "@shikijs/engine-javascript": "1.23.1", - "@shikijs/engine-oniguruma": "1.23.1", - "@shikijs/types": "1.23.1", + "@shikijs/engine-javascript": "1.24.2", + "@shikijs/engine-oniguruma": "1.24.2", + "@shikijs/types": "1.24.2", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.3" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.23.1.tgz", - "integrity": "sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.2.tgz", + "integrity": "sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==", "dependencies": { - "@shikijs/types": "1.23.1", + "@shikijs/types": "1.24.2", "@shikijs/vscode-textmate": "^9.3.0", - "oniguruma-to-es": "0.4.1" + "oniguruma-to-es": "0.7.0" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.23.1.tgz", - "integrity": "sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz", + "integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==", "dependencies": { - "@shikijs/types": "1.23.1", + "@shikijs/types": "1.24.2", "@shikijs/vscode-textmate": "^9.3.0" } }, "node_modules/@shikijs/types": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.23.1.tgz", - "integrity": "sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz", + "integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==", "dependencies": { "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", - "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==" + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", + "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==" }, "node_modules/@shuding/opentype.js": { "version": "1.4.0-beta.0", @@ -1907,15 +1879,6 @@ "@types/ms": "*" } }, - "node_modules/@types/dompurify": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", - "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", - "license": "MIT", - "dependencies": { - "@types/trusted-types": "*" - } - }, "node_modules/@types/earcut": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", @@ -1986,12 +1949,12 @@ } }, "node_modules/@types/node": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", - "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "dev": true, "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/@types/pretty-time": { @@ -2013,7 +1976,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" + "optional": true }, "node_modules/@types/unist": { "version": "2.0.6", @@ -2333,9 +2296,9 @@ } }, "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.2.tgz", + "integrity": "sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==", "dependencies": { "readdirp": "^4.0.1" }, @@ -3178,10 +3141,12 @@ } }, "node_modules/dompurify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", - "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==", - "license": "(MPL-2.0 OR Apache-2.0)" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.3.tgz", + "integrity": "sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/earcut": { "version": "2.2.4", @@ -3822,9 +3787,9 @@ "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, "node_modules/hast-util-to-html": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", - "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", + "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -4365,9 +4330,9 @@ "license": "MIT" }, "node_modules/lightningcss": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.1.tgz", - "integrity": "sha512-KRDkHlLlNj3DWh79CDt93fPlRJh2W1AuHV0ZSZAMMuN7lqlsZTV5842idfS1urWG8q9tc17velp1gCXhY7sLnQ==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.2.tgz", + "integrity": "sha512-ePLRrbt3fgjXI5VFZOLbvkLD5ZRuxGKm+wJ3ujCqBtL3NanDHPo/5zicR5uEKAPiIjBYF99BM4K4okvMznjkVA==", "dependencies": { "detect-libc": "^1.0.3" }, @@ -4379,22 +4344,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.28.1", - "lightningcss-darwin-x64": "1.28.1", - "lightningcss-freebsd-x64": "1.28.1", - "lightningcss-linux-arm-gnueabihf": "1.28.1", - "lightningcss-linux-arm64-gnu": "1.28.1", - "lightningcss-linux-arm64-musl": "1.28.1", - "lightningcss-linux-x64-gnu": "1.28.1", - "lightningcss-linux-x64-musl": "1.28.1", - "lightningcss-win32-arm64-msvc": "1.28.1", - "lightningcss-win32-x64-msvc": "1.28.1" + "lightningcss-darwin-arm64": "1.28.2", + "lightningcss-darwin-x64": "1.28.2", + "lightningcss-freebsd-x64": "1.28.2", + "lightningcss-linux-arm-gnueabihf": "1.28.2", + "lightningcss-linux-arm64-gnu": "1.28.2", + "lightningcss-linux-arm64-musl": "1.28.2", + "lightningcss-linux-x64-gnu": "1.28.2", + "lightningcss-linux-x64-musl": "1.28.2", + "lightningcss-win32-arm64-msvc": "1.28.2", + "lightningcss-win32-x64-msvc": "1.28.2" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.1.tgz", - "integrity": "sha512-VG3vvzM0m/rguCdm76DdobNeNJnHK+jWcdkNLFWHLh9YCotRvbRIt45JxwcHlIF8TDqWStVLTdghq5NaigVCBQ==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.2.tgz", + "integrity": "sha512-/8cPSqZiusHSS+WQz0W4NuaqFjquys1x+NsdN/XOHb+idGHJSoJ7SoQTVl3DZuAgtPZwFZgRfb/vd1oi8uX6+g==", "cpu": [ "arm64" ], @@ -4411,9 +4376,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.1.tgz", - "integrity": "sha512-O7ORdislvKfMohFl4Iq7fxKqdJOuuxArcglVI3amuFO5DJ0wfV3Gxgi1JRo49slfr7OVzJQEHLG4muTWYM5cTQ==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.2.tgz", + "integrity": "sha512-R7sFrXlgKjvoEG8umpVt/yutjxOL0z8KWf0bfPT3cYMOW4470xu5qSHpFdIOpRWwl3FKNMUdbKtMUjYt0h2j4g==", "cpu": [ "x64" ], @@ -4430,9 +4395,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.1.tgz", - "integrity": "sha512-b7sF89B31kYYijxVcFO7l5u6UNA862YstNu+3YbLl/IQKzveL4a5cwR5cdpG+OOhErg/c2u9WCmzZoX2I5GBvw==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.2.tgz", + "integrity": "sha512-l2qrCT+x7crAY+lMIxtgvV10R8VurzHAoUZJaVFSlHrN8kRLTvEg9ObojIDIexqWJQvJcVVV3vfzsEynpiuvgA==", "cpu": [ "x64" ], @@ -4449,9 +4414,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.1.tgz", - "integrity": "sha512-p61kXwvhUDLLzkWHjzSFfUBW/F0iy3jr3CWi3k8SKULtJEsJXTI9DqRm9EixxMSe2AMBQBt4auTYiQL4B1N51A==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.2.tgz", + "integrity": "sha512-DKMzpICBEKnL53X14rF7hFDu8KKALUJtcKdFUCW5YOlGSiwRSgVoRjM97wUm/E0NMPkzrTi/rxfvt7ruNK8meg==", "cpu": [ "arm" ], @@ -4468,9 +4433,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.1.tgz", - "integrity": "sha512-iO+fN9hOMmzfwqcG2/BgUtMKD48H2JO/SXU44fyIwpY2veb65QF5xiRrQ9l1FwIxbGK3231KBYCtAqv+xf+NsQ==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.2.tgz", + "integrity": "sha512-nhfjYkfymWZSxdtTNMWyhFk2ImUm0X7NAgJWFwnsYPOfmtWQEapzG/DXZTfEfMjSzERNUNJoQjPAbdqgB+sjiw==", "cpu": [ "arm64" ], @@ -4487,9 +4452,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.1.tgz", - "integrity": "sha512-dnMHeXEmCUzHHZjaDpQBYuBKcN9nPC3nPFKl70bcj5Bkn5EmkcgEqm5p035LKOgvAwk1XwLpQCML6pXmCwz0NQ==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.2.tgz", + "integrity": "sha512-1SPG1ZTNnphWvAv8RVOymlZ8BDtAg69Hbo7n4QxARvkFVCJAt0cgjAw1Fox0WEhf4PwnyoOBaVH0Z5YNgzt4dA==", "cpu": [ "arm64" ], @@ -4506,9 +4471,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.1.tgz", - "integrity": "sha512-7vWDISaMUn+oo2TwRdf2hl/BLdPxvywv9JKEqNZB/0K7bXwV4XE9wN/C2sAp1gGuh6QBA8lpjF4JIPt3HNlCHA==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.2.tgz", + "integrity": "sha512-ZhQy0FcO//INWUdo/iEdbefntTdpPVQ0XJwwtdbBuMQe+uxqZoytm9M+iqR9O5noWFaxK+nbS2iR/I80Q2Ofpg==", "cpu": [ "x64" ], @@ -4525,9 +4490,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.1.tgz", - "integrity": "sha512-IHCu9tVGP+x5BCpA2rF3D04DBokcBza/a8AuHQU+1AiMKubuMegPwcL7RatBgK4ztFHeYnnD5NdhwhRfYMAtNA==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.2.tgz", + "integrity": "sha512-alb/j1NMrgQmSFyzTbN1/pvMPM+gdDw7YBuQ5VSgcFDypN3Ah0BzC2dTZbzwzaMdUVDszX6zH5MzjfVN1oGuww==", "cpu": [ "x64" ], @@ -4544,9 +4509,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.1.tgz", - "integrity": "sha512-Erm72kHmMg/3h350PTseskz+eEGBM17Fuu79WW2Qqt0BfWSF1jHHc12lkJCWMYl5jcBHPs5yZdgNHtJ7IJS3Uw==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.2.tgz", + "integrity": "sha512-WnwcjcBeAt0jGdjlgbT9ANf30pF0C/QMb1XnLnH272DQU8QXh+kmpi24R55wmWBwaTtNAETZ+m35ohyeMiNt+g==", "cpu": [ "arm64" ], @@ -4563,9 +4528,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.1.tgz", - "integrity": "sha512-ZPQtvx+uQBzrSdHH8p4H3M9Alue+x369TPZAA3b4K3d92FPhpZCuBG04+HQzspam9sVeID9mI6f3VRAs2ezaEA==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.2.tgz", + "integrity": "sha512-3piBifyT3avz22o6mDKywQC/OisH2yDK+caHWkiMsF82i3m5wDBadyCjlCQ5VNgzYkxrWZgiaxHDdd5uxsi0/A==", "cpu": [ "x64" ], @@ -5040,16 +5005,14 @@ } }, "node_modules/mermaid": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.0.tgz", - "integrity": "sha512-mxCfEYvADJqOiHfGpJXLs4/fAjHz448rH0pfY5fAoxiz70rQiDSzUUy4dNET2T08i46IVpjohPd6WWbzmRHiPA==", - "license": "MIT", + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.1.tgz", + "integrity": "sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==", "dependencies": { "@braintree/sanitize-url": "^7.0.1", "@iconify/utils": "^2.1.32", "@mermaid-js/parser": "^0.3.0", "@types/d3": "^7.4.3", - "@types/dompurify": "^3.0.5", "cytoscape": "^3.29.2", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", @@ -5057,7 +5020,7 @@ "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.10", - "dompurify": "^3.0.11 <3.1.7", + "dompurify": "^3.2.1", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", @@ -5778,13 +5741,13 @@ } }, "node_modules/oniguruma-to-es": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.4.1.tgz", - "integrity": "sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.7.0.tgz", + "integrity": "sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==", "dependencies": { "emoji-regex-xs": "^1.0.0", - "regex": "^5.0.0", - "regex-recursion": "^4.2.1" + "regex": "^5.0.2", + "regex-recursion": "^4.3.0" } }, "node_modules/package-json-from-dist": { @@ -5955,9 +5918,9 @@ } }, "node_modules/pixi.js": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.5.2.tgz", - "integrity": "sha512-TOt9g8ifOj4R9DN9ST1M8t2nvnuhr5oWL5YW9ywFLbnOVgFMDcEz+Xek5Mo8Xr64D+QU3qre3IFgreBlsHxTNw==", + "version": "8.6.5", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.6.5.tgz", + "integrity": "sha512-53QeyNbvbojFvCoKT7CgLE/O+6Fuf4KHRjOciwFpRKx5zhyoD7/WR1SYJ75wfo523m5QtJw+tn86n18zsroGaw==", "dependencies": { "@pixi/colord": "^2.9.6", "@types/css-font-loading-module": "^0.0.12", @@ -6004,26 +5967,26 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.24.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", - "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", + "version": "10.25.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.2.tgz", + "integrity": "sha512-GEts1EH3oMnqdOIeXhlbBSddZ9nrINd070WBOiPO2ous1orrKGUM4SMDbwyjSWD1iMS2dBvaDjAa5qUhz3TXqw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" } }, "node_modules/preact-render-to-string": { - "version": "6.5.11", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz", - "integrity": "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==", + "version": "6.5.12", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.12.tgz", + "integrity": "sha512-FpU7/cRipZo4diSWQq7gZWVp+Px76CtVduJZNvQwVzynDsAIxKteMrjCCGPbM2oEasReoDffaeMCMlaur9ohIg==", "peerDependencies": { "preact": ">=10" } }, "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -6126,9 +6089,9 @@ } }, "node_modules/regex-recursion": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.2.1.tgz", - "integrity": "sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.3.0.tgz", + "integrity": "sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==", "dependencies": { "regex-utilities": "^2.3.0" } @@ -6994,9 +6957,9 @@ } }, "node_modules/satori": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/satori/-/satori-0.11.3.tgz", - "integrity": "sha512-Wg7sls0iYAEETzi9YYcY16QVIqXjZT06XjkwondC5CGhw1mhmgKBCub8cCmkxdl/naXXQD+m29CFgn8pwtYCnA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.12.0.tgz", + "integrity": "sha512-e0e+qQyeFwEszujN7SpWpRtZgww7Nh8lSO3bUn2spHZ5JpqEl3zJ3P14/JlWruxEwdgREs35ZnavrPrWaRVFDg==", "dependencies": { "@shuding/opentype.js": "1.4.0-beta.0", "css-background-parser": "^0.1.0", @@ -7157,14 +7120,14 @@ } }, "node_modules/shiki": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.23.1.tgz", - "integrity": "sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.24.2.tgz", + "integrity": "sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==", "dependencies": { - "@shikijs/core": "1.23.1", - "@shikijs/engine-javascript": "1.23.1", - "@shikijs/engine-oniguruma": "1.23.1", - "@shikijs/types": "1.23.1", + "@shikijs/core": "1.24.2", + "@shikijs/engine-javascript": "1.24.2", + "@shikijs/engine-oniguruma": "1.24.2", + "@shikijs/types": "1.24.2", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } @@ -7977,9 +7940,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7996,9 +7959,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, "node_modules/unicode-trie": { diff --git a/package.json b/package.json index 11c1c91ea..dfda33bf1 100644 --- a/package.json +++ b/package.json @@ -35,14 +35,14 @@ "quartz": "./quartz/bootstrap-cli.mjs" }, "dependencies": { - "@clack/prompts": "^0.8.1", + "@clack/prompts": "^0.8.2", "@floating-ui/dom": "^1.6.12", - "@myriaddreamin/rehype-typst": "^0.5.0-rc7", + "@myriaddreamin/rehype-typst": "^0.5.0-rc9", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", "chalk": "^5.3.0", - "chokidar": "^4.0.1", + "chokidar": "^4.0.2", "cli-spinner": "^0.2.10", "d3": "^7.9.0", "esbuild-sass-plugin": "^3.3.1", @@ -50,20 +50,20 @@ "github-slugger": "^2.0.0", "globby": "^14.0.2", "gray-matter": "^4.0.3", - "hast-util-to-html": "^9.0.3", + "hast-util-to-html": "^9.0.4", "hast-util-to-jsx-runtime": "^2.3.2", "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", - "lightningcss": "^1.28.1", + "lightningcss": "^1.28.2", "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", - "mermaid": "^11.4.0", + "mermaid": "^11.4.1", "micromorph": "^0.4.5", - "pixi.js": "^8.5.2", - "preact": "^10.24.3", - "preact-render-to-string": "^6.5.11", + "pixi.js": "^8.6.5", + "preact": "^10.25.2", + "preact-render-to-string": "^6.5.12", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", @@ -84,10 +84,10 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", - "satori": "^0.11.3", + "satori": "^0.12.0", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.23.1", + "shiki": "^1.24.2", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -103,14 +103,14 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.9.0", + "@types/node": "^22.10.2", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", "@types/yargs": "^17.0.33", "esbuild": "^0.24.0", - "prettier": "^3.3.3", + "prettier": "^3.4.2", "tsx": "^4.19.2", - "typescript": "^5.6.3" + "typescript": "^5.7.2" } } diff --git a/quartz/build.ts b/quartz/build.ts index 67ec0da4d..64c462b14 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -139,9 +139,9 @@ async function startServing( const buildFromEntry = argv.fastRebuild ? partialRebuildFromEntrypoint : rebuildFromEntrypoint watcher - .on("add", (fp) => buildFromEntry(fp, "add", clientRefresh, buildData)) - .on("change", (fp) => buildFromEntry(fp, "change", clientRefresh, buildData)) - .on("unlink", (fp) => buildFromEntry(fp, "delete", clientRefresh, buildData)) + .on("add", (fp) => buildFromEntry(fp as string, "add", clientRefresh, buildData)) + .on("change", (fp) => buildFromEntry(fp as string, "change", clientRefresh, buildData)) + .on("unlink", (fp) => buildFromEntry(fp as string, "delete", clientRefresh, buildData)) return async () => { await watcher.close() diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 624308ca4..94cc7b6ea 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -156,7 +156,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> src = src.toString() } - src = src.replace(commentRegex, "") + src = (src as string).replace(commentRegex, "") } // pre-transform blockquotes @@ -165,7 +165,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> src = src.toString() } - src = src.replace(calloutLineRegex, (value) => { + src = (src as string).replace(calloutLineRegex, (value) => { // force newline after title of callout return value + "\n> " }) @@ -178,7 +178,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> } // replace all wikilinks inside a table first - src = src.replace(tableRegex, (value) => { + src = (src as string).replace(tableRegex, (value) => { // escape all aliases and headers in wikilinks inside a table return value.replace(tableWikilinkRegex, (_value, raw) => { // const [raw]: (string | undefined)[] = capture @@ -192,7 +192,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> }) // replace all other wikilinks - src = src.replace(wikilinkRegex, (value, ...capture) => { + src = (src as string).replace(wikilinkRegex, (value, ...capture) => { const [rawFp, rawHeader, rawAlias]: (string | undefined)[] = capture const [fp, anchor] = splitAnchor(`${rawFp ?? ""}${rawHeader ?? ""}`) From ff9e60a7fce0f642dfb8a1ee0042f0d3da848411 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Tue, 17 Dec 2024 19:07:00 +0100 Subject: [PATCH 059/303] fix(search): restore mobile search view (#1576) --- quartz/components/styles/search.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss index 080178fbe..fab2c1354 100644 --- a/quartz/components/styles/search.scss +++ b/quartz/components/styles/search.scss @@ -106,7 +106,7 @@ flex: 0 0 min(30%, 450px); } - @media all and not ($tablet) { + @media all and not ($mobile) { &[data-preview] { & .result-card > p.preview { display: none; @@ -132,7 +132,7 @@ border-radius: 5px; } - @media all and ($tablet) { + @media all and ($mobile) { & > #preview-container { display: none !important; } From 965f9e123ca8f6bd5342bf9fe8daaa3e3a58ee2e Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Mon, 23 Dec 2024 15:00:26 -0500 Subject: [PATCH 060/303] chore(frontmatter): dealias created/modified/updated time (#1664) --- quartz/plugins/transformers/frontmatter.ts | 15 +++++++++++++++ quartz/plugins/transformers/lastmod.ts | 8 +++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/quartz/plugins/transformers/frontmatter.ts b/quartz/plugins/transformers/frontmatter.ts index 417b21853..e00c700e0 100644 --- a/quartz/plugins/transformers/frontmatter.ts +++ b/quartz/plugins/transformers/frontmatter.ts @@ -73,6 +73,18 @@ export const FrontMatter: QuartzTransformerPlugin> = (userOpts) const socialImage = coalesceAliases(data, ["socialImage", "image", "cover"]) + const created = coalesceAliases(data, ["created", "date"]) + if (created) data.created = created + const modified = coalesceAliases(data, [ + "modified", + "lastmod", + "updated", + "last-modified", + ]) + if (modified) data.modified = modified + const published = coalesceAliases(data, ["published", "publishDate", "date"]) + if (published) data.published = published + if (socialImage) data.socialImage = socialImage // fill in frontmatter @@ -91,6 +103,9 @@ declare module "vfile" { } & Partial<{ tags: string[] aliases: string[] + modified: string + created: string + published: string description: string publish: boolean | string draft: boolean | string diff --git a/quartz/plugins/transformers/lastmod.ts b/quartz/plugins/transformers/lastmod.ts index fe8c01bcf..fd5769263 100644 --- a/quartz/plugins/transformers/lastmod.ts +++ b/quartz/plugins/transformers/lastmod.ts @@ -48,11 +48,9 @@ export const CreatedModifiedDate: QuartzTransformerPlugin> = (u created ||= st.birthtimeMs modified ||= st.mtimeMs } else if (source === "frontmatter" && file.data.frontmatter) { - created ||= file.data.frontmatter.date as MaybeDate - modified ||= file.data.frontmatter.lastmod as MaybeDate - modified ||= file.data.frontmatter.updated as MaybeDate - modified ||= file.data.frontmatter["last-modified"] as MaybeDate - published ||= file.data.frontmatter.publishDate as MaybeDate + created ||= file.data.frontmatter.created as MaybeDate + modified ||= file.data.frontmatter.modified as MaybeDate + published ||= file.data.frontmatter.published as MaybeDate } else if (source === "git") { if (!repo) { // Get a reference to the main git repo. From a582505dafceafb323784e966edcba5cbee636cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 16:35:08 -0500 Subject: [PATCH 061/303] chore(deps): bump the production-dependencies group with 7 updates (#1667) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 342 ++++++++++++++++++++++++---------------------- package.json | 14 +- 2 files changed, 186 insertions(+), 170 deletions(-) diff --git a/package-lock.json b/package-lock.json index 524803acc..03f757d66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,14 @@ "version": "4.4.0", "license": "MIT", "dependencies": { - "@clack/prompts": "^0.8.2", + "@clack/prompts": "^0.9.0", "@floating-ui/dom": "^1.6.12", "@myriaddreamin/rehype-typst": "^0.5.0-rc9", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", - "chalk": "^5.3.0", - "chokidar": "^4.0.2", + "chalk": "^5.4.1", + "chokidar": "^4.0.3", "cli-spinner": "^0.2.10", "d3": "^7.9.0", "esbuild-sass-plugin": "^3.3.1", @@ -35,8 +35,8 @@ "mdast-util-to-string": "^4.0.0", "mermaid": "^11.4.1", "micromorph": "^0.4.5", - "pixi.js": "^8.6.5", - "preact": "^10.25.2", + "pixi.js": "^8.6.6", + "preact": "^10.25.3", "preact-render-to-string": "^6.5.12", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", @@ -61,7 +61,7 @@ "satori": "^0.12.0", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.24.2", + "shiki": "^1.24.4", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -85,7 +85,7 @@ "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", "@types/yargs": "^17.0.33", - "esbuild": "^0.24.0", + "esbuild": "^0.24.2", "prettier": "^3.4.2", "tsx": "^4.19.2", "typescript": "^5.7.2" @@ -255,20 +255,20 @@ } }, "node_modules/@clack/core": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.5.tgz", - "integrity": "sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.4.0.tgz", + "integrity": "sha512-YJCYBsyJfNDaTbvDUVSJ3SgSuPrcujarRgkJ5NLjexDZKvaOiVVJvAQYx8lIgG0qRT8ff0fPgqyBCVivanIZ+A==", "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "node_modules/@clack/prompts": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.8.2.tgz", - "integrity": "sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.9.0.tgz", + "integrity": "sha512-nGsytiExgUr4FL0pR/LeqxA28nz3E0cW7eLTSh3Iod9TGrbBt8Y7BHbV3mmkNC4G0evdYyQ3ZsbiBkk7ektArA==", "dependencies": { - "@clack/core": "0.3.5", + "@clack/core": "0.4.0", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } @@ -284,9 +284,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -299,9 +299,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -314,9 +314,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -329,9 +329,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -344,9 +344,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -359,9 +359,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -374,9 +374,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -389,9 +389,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -404,9 +404,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -419,9 +419,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -434,9 +434,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -449,9 +449,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -464,9 +464,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -479,9 +479,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -494,9 +494,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -509,9 +509,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -524,9 +524,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -538,10 +538,25 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -570,9 +585,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -585,9 +600,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -600,9 +615,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -615,9 +630,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -630,9 +645,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -1556,43 +1571,43 @@ } }, "node_modules/@shikijs/core": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.2.tgz", - "integrity": "sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.4.tgz", + "integrity": "sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==", "dependencies": { - "@shikijs/engine-javascript": "1.24.2", - "@shikijs/engine-oniguruma": "1.24.2", - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0", + "@shikijs/engine-javascript": "1.24.4", + "@shikijs/engine-oniguruma": "1.24.4", + "@shikijs/types": "1.24.4", + "@shikijs/vscode-textmate": "^9.3.1", "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.3" + "hast-util-to-html": "^9.0.4" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.2.tgz", - "integrity": "sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.4.tgz", + "integrity": "sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==", "dependencies": { - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0", - "oniguruma-to-es": "0.7.0" + "@shikijs/types": "1.24.4", + "@shikijs/vscode-textmate": "^9.3.1", + "oniguruma-to-es": "0.8.1" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz", - "integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.4.tgz", + "integrity": "sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==", "dependencies": { - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0" + "@shikijs/types": "1.24.4", + "@shikijs/vscode-textmate": "^9.3.1" } }, "node_modules/@shikijs/types": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz", - "integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.4.tgz", + "integrity": "sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==", "dependencies": { - "@shikijs/vscode-textmate": "^9.3.0", + "@shikijs/vscode-textmate": "^9.3.1", "@types/hast": "^3.0.4" } }, @@ -2223,9 +2238,9 @@ } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -2296,9 +2311,9 @@ } }, "node_modules/chokidar": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.2.tgz", - "integrity": "sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dependencies": { "readdirp": "^4.0.1" }, @@ -3181,9 +3196,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -3192,30 +3207,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/esbuild-sass-plugin": { @@ -3233,9 +3249,9 @@ } }, "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -5741,13 +5757,13 @@ } }, "node_modules/oniguruma-to-es": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.7.0.tgz", - "integrity": "sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.8.1.tgz", + "integrity": "sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==", "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.0.2", - "regex-recursion": "^4.3.0" + "regex-recursion": "^5.0.0" } }, "node_modules/package-json-from-dist": { @@ -5918,9 +5934,9 @@ } }, "node_modules/pixi.js": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.6.5.tgz", - "integrity": "sha512-53QeyNbvbojFvCoKT7CgLE/O+6Fuf4KHRjOciwFpRKx5zhyoD7/WR1SYJ75wfo523m5QtJw+tn86n18zsroGaw==", + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.6.6.tgz", + "integrity": "sha512-o5pw7G2yuIrnBx0G4npBlmFp+XGNcapI/Ufs62rRj/4XKxc1Zo74YJr/BtEXcXTraTKd+pQvYOLvnfxRjxBMvQ==", "dependencies": { "@pixi/colord": "^2.9.6", "@types/css-font-loading-module": "^0.0.12", @@ -5967,9 +5983,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.25.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.2.tgz", - "integrity": "sha512-GEts1EH3oMnqdOIeXhlbBSddZ9nrINd070WBOiPO2ous1orrKGUM4SMDbwyjSWD1iMS2dBvaDjAa5qUhz3TXqw==", + "version": "10.25.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.3.tgz", + "integrity": "sha512-dzQmIFtM970z+fP9ziQ3yG4e3ULIbwZzJ734vaMVUTaKQ2+Ru1Ou/gjshOYVHCcd1rpAelC6ngjvjDXph98unQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -6089,9 +6105,9 @@ } }, "node_modules/regex-recursion": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.3.0.tgz", - "integrity": "sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.0.0.tgz", + "integrity": "sha512-UwyOqeobrCCqTXPcsSqH4gDhOjD5cI/b8kjngWgSZbxYh5yVjAwTjO5+hAuPRNiuR70+5RlWSs+U9PVcVcW9Lw==", "dependencies": { "regex-utilities": "^2.3.0" } @@ -7120,15 +7136,15 @@ } }, "node_modules/shiki": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.24.2.tgz", - "integrity": "sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.24.4.tgz", + "integrity": "sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==", "dependencies": { - "@shikijs/core": "1.24.2", - "@shikijs/engine-javascript": "1.24.2", - "@shikijs/engine-oniguruma": "1.24.2", - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0", + "@shikijs/core": "1.24.4", + "@shikijs/engine-javascript": "1.24.4", + "@shikijs/engine-oniguruma": "1.24.4", + "@shikijs/types": "1.24.4", + "@shikijs/vscode-textmate": "^9.3.1", "@types/hast": "^3.0.4" } }, diff --git a/package.json b/package.json index dfda33bf1..42714c1fa 100644 --- a/package.json +++ b/package.json @@ -35,14 +35,14 @@ "quartz": "./quartz/bootstrap-cli.mjs" }, "dependencies": { - "@clack/prompts": "^0.8.2", + "@clack/prompts": "^0.9.0", "@floating-ui/dom": "^1.6.12", "@myriaddreamin/rehype-typst": "^0.5.0-rc9", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", - "chalk": "^5.3.0", - "chokidar": "^4.0.2", + "chalk": "^5.4.1", + "chokidar": "^4.0.3", "cli-spinner": "^0.2.10", "d3": "^7.9.0", "esbuild-sass-plugin": "^3.3.1", @@ -61,8 +61,8 @@ "mdast-util-to-string": "^4.0.0", "mermaid": "^11.4.1", "micromorph": "^0.4.5", - "pixi.js": "^8.6.5", - "preact": "^10.25.2", + "pixi.js": "^8.6.6", + "preact": "^10.25.3", "preact-render-to-string": "^6.5.12", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", @@ -87,7 +87,7 @@ "satori": "^0.12.0", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.24.2", + "shiki": "^1.24.4", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -108,7 +108,7 @@ "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", "@types/yargs": "^17.0.33", - "esbuild": "^0.24.0", + "esbuild": "^0.24.2", "prettier": "^3.4.2", "tsx": "^4.19.2", "typescript": "^5.7.2" From 69a0ddf73396ae7018f67c287bbb0891b5dae191 Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Thu, 26 Dec 2024 15:50:54 +0200 Subject: [PATCH 062/303] fix(tags): Show tag descriptions when hovering (#1670) --- quartz/components/pages/TagContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx index 5b9fbe282..c703b6524 100644 --- a/quartz/components/pages/TagContent.tsx +++ b/quartz/components/pages/TagContent.tsx @@ -110,7 +110,7 @@ export default ((opts?: Partial) => { return (
    -
    {content}
    +
    {content}

    {i18n(cfg.locale).pages.tagContent.itemsUnderTag({ count: pages.length })}

    From 7533d504dcbaf0d0127f1c3ac516ac0f1784816f Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Fri, 27 Dec 2024 02:50:06 +0200 Subject: [PATCH 063/303] fix(tags): Set consistent titles for tags with description pages (#1671) --- quartz/plugins/emitters/tagPage.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index 066d4ec26..d82a537db 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -105,6 +105,9 @@ export const TagPage: QuartzEmitterPlugin> = (userOpts) const tag = slug.slice("tags/".length) if (tags.has(tag)) { tagDescriptions[tag] = [tree, file] + if (file.data.frontmatter?.title === tag) { + file.data.frontmatter.title = `${i18n(cfg.locale).pages.tagContent.tag}: ${tag}` + } } } } From 05e6f05a5067ca1e6f5d5f793353182d8804c860 Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Fri, 27 Dec 2024 06:05:35 +0200 Subject: [PATCH 064/303] feat(backlinks): hide by default when empty (#1674) Co-authored-by: Aaron Pham --- docs/features/backlinks.md | 1 + quartz/components/Backlinks.tsx | 72 ++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/docs/features/backlinks.md b/docs/features/backlinks.md index f558f4a5d..6862720e1 100644 --- a/docs/features/backlinks.md +++ b/docs/features/backlinks.md @@ -9,6 +9,7 @@ A backlink for a note is a link from another note to that note. Links in the bac ## Customization - Removing backlinks: delete all usages of `Component.Backlinks()` from `quartz.layout.ts`. +- Hide when empty: hide `Backlinks` if given page doesn't contain any backlinks (default to `true`). To disable this, use `Component.Backlinks({ hideWhenEmpty: false })`. - Component: `quartz/components/Backlinks.tsx` - Style: `quartz/components/styles/backlinks.scss` - Script: `quartz/components/scripts/search.inline.ts` diff --git a/quartz/components/Backlinks.tsx b/quartz/components/Backlinks.tsx index aa412a2e0..e99055e31 100644 --- a/quartz/components/Backlinks.tsx +++ b/quartz/components/Backlinks.tsx @@ -4,33 +4,49 @@ import { resolveRelative, simplifySlug } from "../util/path" import { i18n } from "../i18n" import { classNames } from "../util/lang" -const Backlinks: QuartzComponent = ({ - fileData, - allFiles, - displayClass, - cfg, -}: QuartzComponentProps) => { - const slug = simplifySlug(fileData.slug!) - const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)) - return ( -
    -

    {i18n(cfg.locale).components.backlinks.title}

    -
      - {backlinkFiles.length > 0 ? ( - backlinkFiles.map((f) => ( -
    • - - {f.frontmatter?.title} - -
    • - )) - ) : ( -
    • {i18n(cfg.locale).components.backlinks.noBacklinksFound}
    • - )} -
    -
    - ) +interface BacklinksOptions { + hideWhenEmpty: boolean } -Backlinks.css = style -export default (() => Backlinks) satisfies QuartzComponentConstructor +const defaultOptions: BacklinksOptions = { + hideWhenEmpty: true, +} + +export default ((opts?: Partial) => { + const options: BacklinksOptions = { ...defaultOptions, ...opts } + + const Backlinks: QuartzComponent = ({ + fileData, + allFiles, + displayClass, + cfg, + }: QuartzComponentProps) => { + const slug = simplifySlug(fileData.slug!) + const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)) + if (options.hideWhenEmpty && backlinkFiles.length == 0) { + return null + } + return ( +
    + ) + } + + Backlinks.css = style + + return Backlinks +}) satisfies QuartzComponentConstructor From c91cf97f99d527264d81560f1d311f7c2889a41d Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 26 Dec 2024 21:18:17 -0800 Subject: [PATCH 065/303] feat(spa): add loading bar (#1684) --- quartz/components/scripts/spa.inline.ts | 15 +++++++++++++++ quartz/styles/base.scss | 11 +++++++++++ 2 files changed, 26 insertions(+) diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts index 1790bcabc..b67dad088 100644 --- a/quartz/components/scripts/spa.inline.ts +++ b/quartz/components/scripts/spa.inline.ts @@ -42,8 +42,22 @@ function notifyNav(url: FullSlug) { const cleanupFns: Set<(...args: any[]) => void> = new Set() window.addCleanup = (fn) => cleanupFns.add(fn) +function startLoading() { + const loadingBar = document.createElement("div") + loadingBar.className = "navigation-progress" + loadingBar.style.width = "0" + if (!document.body.contains(loadingBar)) { + document.body.appendChild(loadingBar) + } + + setTimeout(() => { + loadingBar.style.width = "80%" + }, 100) +} + let p: DOMParser async function navigate(url: URL, isBack: boolean = false) { + startLoading() p = p || new DOMParser() const contents = await fetch(`${url}`) .then((res) => { @@ -104,6 +118,7 @@ async function navigate(url: URL, isBack: boolean = false) { if (!isBack) { history.pushState({}, "", url) } + notifyNav(getFullSlug(window)) delete announcer.dataset.persist } diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 512af0dd0..4b79ea053 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -587,3 +587,14 @@ iframe.pdf { width: 100%; border-radius: 5px; } + +.navigation-progress { + position: fixed; + top: 0; + left: 0; + width: 0; + height: 3px; + background: var(--secondary); + transition: width 0.2s ease; + z-index: 9999; +} From 99011cb1b0d20da9cb523729ed0e9ff4e9c27405 Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Fri, 27 Dec 2024 16:18:22 +0200 Subject: [PATCH 066/303] fix(spa): handle HTML redirects for aliases (#1680) --- quartz/components/scripts/popover.inline.ts | 3 ++- quartz/components/scripts/spa.inline.ts | 3 ++- quartz/components/scripts/util.ts | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/quartz/components/scripts/popover.inline.ts b/quartz/components/scripts/popover.inline.ts index 49f438205..b01af0e85 100644 --- a/quartz/components/scripts/popover.inline.ts +++ b/quartz/components/scripts/popover.inline.ts @@ -1,5 +1,6 @@ import { computePosition, flip, inline, shift } from "@floating-ui/dom" import { normalizeRelativeURLs } from "../../util/path" +import { fetchCanonical } from "./util" const p = new DOMParser() async function mouseEnterHandler( @@ -37,7 +38,7 @@ async function mouseEnterHandler( targetUrl.hash = "" targetUrl.search = "" - const response = await fetch(`${targetUrl}`).catch((err) => { + const response = await fetchCanonical(targetUrl).catch((err) => { console.error(err) }) diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts index b67dad088..df48f0403 100644 --- a/quartz/components/scripts/spa.inline.ts +++ b/quartz/components/scripts/spa.inline.ts @@ -1,5 +1,6 @@ import micromorph from "micromorph" import { FullSlug, RelativeURL, getFullSlug, normalizeRelativeURLs } from "../../util/path" +import { fetchCanonical } from "./util" // adapted from `micromorph` // https://github.com/natemoo-re/micromorph @@ -59,7 +60,7 @@ let p: DOMParser async function navigate(url: URL, isBack: boolean = false) { startLoading() p = p || new DOMParser() - const contents = await fetch(`${url}`) + const contents = await fetchCanonical(url) .then((res) => { const contentType = res.headers.get("content-type") if (contentType?.startsWith("text/html")) { diff --git a/quartz/components/scripts/util.ts b/quartz/components/scripts/util.ts index d0a16c651..c1db8bad5 100644 --- a/quartz/components/scripts/util.ts +++ b/quartz/components/scripts/util.ts @@ -24,3 +24,22 @@ export function removeAllChildren(node: HTMLElement) { node.removeChild(node.firstChild) } } + +// AliasRedirect emits HTML redirects which also have the link[rel="canonical"] +// containing the URL it's redirecting to. +// Extracting it here with regex is _probably_ faster than parsing the entire HTML +// with a DOMParser effectively twice (here and later in the SPA code), even if +// way less robust - we only care about our own generated redirects after all. +const canonicalRegex = // + +export async function fetchCanonical(url: URL): Promise { + const res = await fetch(`${url}`) + if (!res.headers.get("content-type")?.startsWith("text/html")) { + return res + } + // reading the body can only be done once, so we need to clone the response + // to allow the caller to read it if it's was not a redirect + const text = await res.clone().text() + const [_, redirect] = text.match(canonicalRegex) ?? [] + return redirect ? fetch(redirect) : res +} From 7d4bed64a98e0ef982b98e9b755fead7c06855c5 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 28 Dec 2024 15:17:58 -0800 Subject: [PATCH 067/303] fix(css): allow proper width on code block title (closes #1683) --- quartz/styles/base.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 4b79ea053..78f4ce74c 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -388,7 +388,6 @@ figure[data-rehype-pretty-code-figure] { font-size: 0.9rem; padding: 0.1rem 0.5rem; border: 1px solid var(--lightgray); - width: max-content; border-radius: 5px; margin-bottom: -0.5rem; color: var(--darkgray); From ef72f1bf707dca363cdab84da91e2acfaef8f276 Mon Sep 17 00:00:00 2001 From: Ammar Alakkad Date: Mon, 30 Dec 2024 19:03:57 +0300 Subject: [PATCH 068/303] Fix ObsidianFlavoredMarkdown source link (#1694) --- docs/plugins/ObsidianFlavoredMarkdown.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/ObsidianFlavoredMarkdown.md b/docs/plugins/ObsidianFlavoredMarkdown.md index 30d1f7179..414f743b8 100644 --- a/docs/plugins/ObsidianFlavoredMarkdown.md +++ b/docs/plugins/ObsidianFlavoredMarkdown.md @@ -31,4 +31,4 @@ This plugin accepts the following configuration options: - Category: Transformer - Function name: `Plugin.ObsidianFlavoredMarkdown()`. -- Source: [`quartz/plugins/transformers/toc.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/toc.ts). +- Source: [`quartz/plugins/transformers/ofm.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/ofm.ts) From d88e43010adaac5b842274ab0461a7d76c8f479d Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Mon, 30 Dec 2024 19:08:35 +0200 Subject: [PATCH 069/303] fix(tags): Fix TagContent not sorting the page list when opening a tag (#1692) --- quartz/components/pages/TagContent.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx index c703b6524..e56c6d609 100644 --- a/quartz/components/pages/TagContent.tsx +++ b/quartz/components/pages/TagContent.tsx @@ -93,7 +93,7 @@ export default ((opts?: Partial) => { )}

    - +
    ) @@ -114,7 +114,7 @@ export default ((opts?: Partial) => {

    {i18n(cfg.locale).pages.tagContent.itemsUnderTag({ count: pages.length })}

    - +
    From e1c9eabef49c4062fe2498b3ec51f7e01968d194 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 30 Dec 2024 09:27:43 -0800 Subject: [PATCH 070/303] fix(css): oops fit-content not no width specification for codeblock title --- quartz/styles/base.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 78f4ce74c..aaf966efd 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -388,6 +388,7 @@ figure[data-rehype-pretty-code-figure] { font-size: 0.9rem; padding: 0.1rem 0.5rem; border: 1px solid var(--lightgray); + width: fit-content; border-radius: 5px; margin-bottom: -0.5rem; color: var(--darkgray); From 46adb3596669f1d65186768093680d9df05fb2ca Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Mon, 30 Dec 2024 19:55:18 +0200 Subject: [PATCH 071/303] fix(spa): Normalize empty hrefs (#1695) A final breadcrumb has an empty href, linking to the current page, but the relative url normalization method missed those, making the link appear broken in search previews and popovers. Fixes #1690 --- quartz/util/path.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quartz/util/path.ts b/quartz/util/path.ts index c02bfb12d..a6a05f932 100644 --- a/quartz/util/path.ts +++ b/quartz/util/path.ts @@ -108,10 +108,10 @@ const _rebaseHtmlElement = (el: Element, attr: string, newBase: string | URL) => el.setAttribute(attr, rebased.pathname + rebased.hash) } export function normalizeRelativeURLs(el: Element | Document, destination: string | URL) { - el.querySelectorAll('[href^="./"], [href^="../"]').forEach((item) => + el.querySelectorAll('[href=""], [href^="./"], [href^="../"]').forEach((item) => _rebaseHtmlElement(item, "href", destination), ) - el.querySelectorAll('[src^="./"], [src^="../"]').forEach((item) => + el.querySelectorAll('[src=""], [src^="./"], [src^="../"]').forEach((item) => _rebaseHtmlElement(item, "src", destination), ) } From d9e36e60d1e7a985f06fdfef152811074e7c0701 Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Mon, 30 Dec 2024 19:55:53 +0200 Subject: [PATCH 072/303] fix(search): Fix super-inconsistent preview widths in search previews (#1677) Don't know if this was uncovered by my local setup or just nobody noticed, but page previews were pretty wonky for me --- quartz/components/styles/search.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss index fab2c1354..4daefee8f 100644 --- a/quartz/components/styles/search.scss +++ b/quartz/components/styles/search.scss @@ -151,6 +151,7 @@ } & > #preview-container { + flex-grow: 1; display: block; overflow: hidden; font-family: inherit; From b2752e726274f06f51a9526bbddb1847d55f2e99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 18:19:22 -0800 Subject: [PATCH 073/303] chore(deps): bump the production-dependencies group with 2 updates (#1696) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 112 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03f757d66..3e50d0920 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@clack/prompts": "^0.9.0", "@floating-ui/dom": "^1.6.12", - "@myriaddreamin/rehype-typst": "^0.5.0-rc9", + "@myriaddreamin/rehype-typst": "^0.5.4", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", @@ -36,7 +36,7 @@ "mermaid": "^11.4.1", "micromorph": "^0.4.5", "pixi.js": "^8.6.6", - "preact": "^10.25.3", + "preact": "^10.25.4", "preact-render-to-string": "^6.5.12", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", @@ -1089,11 +1089,11 @@ } }, "node_modules/@myriaddreamin/rehype-typst": { - "version": "0.5.0-rc9", - "resolved": "https://registry.npmjs.org/@myriaddreamin/rehype-typst/-/rehype-typst-0.5.0-rc9.tgz", - "integrity": "sha512-6YZ7KkoWch/5bOBUHAbHX3lpYV0KfS7Cwa6/AdU70YoQCLxU2nut9D+vNMH0iWujFU8545nMngh2D0vZRKOofA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/rehype-typst/-/rehype-typst-0.5.4.tgz", + "integrity": "sha512-6NJ0Ddom+X1jTTO1qlwB7ArLuZBg18m+fTqd3HWpkxAUhHAoemd2oF3ATwBIM0uF9gzG9d523D4o7b+jXCaBUQ==", "dependencies": { - "@myriaddreamin/typst-ts-node-compiler": "^0.5.0-rc9", + "@myriaddreamin/typst-ts-node-compiler": "^0.5.4", "@types/hast": "^3.0.0", "@types/katex": "^0.16.0", "hast-util-from-html-isomorphic": "^2.0.0", @@ -1104,30 +1104,30 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler/-/typst-ts-node-compiler-0.5.1.tgz", - "integrity": "sha512-VR/0U7GHPeynFYEtBFo2NOrG8wxMYd2KYeTOALBKu+Bvt8xSjcrdrAOI/c1QYWP1ZwLzrngHGj+4zMBBxVw5hw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler/-/typst-ts-node-compiler-0.5.4.tgz", + "integrity": "sha512-WAOUjOD+S2S3X/2X33PxDYn0XJ4ydqboxluIdFWU8yOlzn3K8CwoRN/GAbMA13vJTbZQMzjX3VmhMavFWeRtVA==", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-android-arm64": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-darwin-arm64": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-darwin-x64": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": "0.5.1", - "@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": "0.5.1" + "@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-android-arm64": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-darwin-arm64": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-darwin-x64": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": "0.5.4", + "@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": "0.5.4" } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi/-/typst-ts-node-compiler-android-arm-eabi-0.5.1.tgz", - "integrity": "sha512-lKGEuFshXocY5c6S/gTGtih1j3Re5Ll3yKglsGIi0NRwgkWf1Br+NAsokFwp6FB8v3IxatxGZU6nhderhGDDpA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi/-/typst-ts-node-compiler-android-arm-eabi-0.5.4.tgz", + "integrity": "sha512-jptHQK/GN7RCDI4FkGKrec3x3YKFogIw1kpMFYYscoOEntEF4MGJs2FM3vR3bLXGSAR54WlPI6dXPKCYuzVSOg==", "cpu": [ "arm" ], @@ -1140,9 +1140,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-android-arm64": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm64/-/typst-ts-node-compiler-android-arm64-0.5.1.tgz", - "integrity": "sha512-PuvsutqJNM/dWNd0O3jX03wGZqlLd15lxfrH2JSLApKED3HzOp4k/bG6NrMxzQsMfPT+OVLEQCmwotGxqVrFJg==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm64/-/typst-ts-node-compiler-android-arm64-0.5.4.tgz", + "integrity": "sha512-xOt+07nYDu3KiOWPnl62es+rThKYRdbOWQPY4hcFqqC5VRTfZZXUBRKdsG+W8qu0gJ513VLmW9HVlkv2PHTW0Q==", "cpu": [ "arm64" ], @@ -1155,9 +1155,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-darwin-arm64": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-arm64/-/typst-ts-node-compiler-darwin-arm64-0.5.1.tgz", - "integrity": "sha512-6zHTIEXcM73dQWzeLJ3ojGk7prf9TYvcfxyCkCX5He3BdPx0lRFLCccXzvkdnTf/bpXLKXd+OKd7re/waf3Klg==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-arm64/-/typst-ts-node-compiler-darwin-arm64-0.5.4.tgz", + "integrity": "sha512-mtuIjL4KptMhy+rJY0pUv8s8kzFFYKFDyhDQIndsi7P9jYtIUkjJqhg3rXmMUcbVJEEFlaUJ+I+wFQbDuddSlg==", "cpu": [ "arm64" ], @@ -1170,9 +1170,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-darwin-x64": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-x64/-/typst-ts-node-compiler-darwin-x64-0.5.1.tgz", - "integrity": "sha512-c2LmL9Dc74Y4DdCNDq+fDckTzYSpozNrjbfPn3hwwK/CbiP+/3iVD5vGKRAvwoWSOLveCdI0PlnO3XeGA+xdqQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-x64/-/typst-ts-node-compiler-darwin-x64-0.5.4.tgz", + "integrity": "sha512-rP8ghx3+vCE0vVat6POYNEkXsjXQn1iyy3pPfLTFtSgQRoJoPJJnDB+tkToCiTZQwvo9aFyrY0LOyH8mpm+BYQ==", "cpu": [ "x64" ], @@ -1185,9 +1185,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf/-/typst-ts-node-compiler-linux-arm-gnueabihf-0.5.1.tgz", - "integrity": "sha512-xBX0H66MUbpTekqa1WGDZRWQaXb9i6VqXgfjFk5ZUG8dyU2VZsmi5s7ibdburCWdOhu6LTl2B5OoaPL5YArdew==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf/-/typst-ts-node-compiler-linux-arm-gnueabihf-0.5.4.tgz", + "integrity": "sha512-boM8bVPRL/Ekff51urc3HiY2oKVdL2x36MnHgurAown3iK4OMa0JPDGkxpnuRKbDQEZDXQB1xljVGLaAqqecCg==", "cpu": [ "arm" ], @@ -1200,9 +1200,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu/-/typst-ts-node-compiler-linux-arm64-gnu-0.5.1.tgz", - "integrity": "sha512-LYSOj99sQoBdmZKiPq+/Ap4HjNZC5W1wyO3FknmaIUASdtAMYp6VqLMl1uS+YjvdZ5roao51encu11XrfYPNew==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu/-/typst-ts-node-compiler-linux-arm64-gnu-0.5.4.tgz", + "integrity": "sha512-DIYH2WXyzeh+0sicGXICm8E/0P5ZAmbCIcGt9sgqXNe2YI/JjXoRDLLm1xN0Y5HD3fiCb/pRTRoeXFpp0u/Fjg==", "cpu": [ "arm64" ], @@ -1215,9 +1215,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl/-/typst-ts-node-compiler-linux-arm64-musl-0.5.1.tgz", - "integrity": "sha512-PFeTuei5EwKTA85kqTIt066Uc7ojGxQErRbPYJhPraRaPXXfO7FXQAmpsPdXNiSeWiC87IwPDrd4RIp7XcjlsA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl/-/typst-ts-node-compiler-linux-arm64-musl-0.5.4.tgz", + "integrity": "sha512-KNjhfEgPaVaN+0hJ97UKY72jtpMFTA4dnP4iEoB6VX2dunVrbTJbCpjG8Sfml4HJYt0H4gYKsa4LqQzgqFJ6eQ==", "cpu": [ "arm64" ], @@ -1230,9 +1230,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu/-/typst-ts-node-compiler-linux-x64-gnu-0.5.1.tgz", - "integrity": "sha512-zz1XeL0hPvGOpbcgTXVKguFWALoLZ1cM8rhkE9X0+ZJWpeObjq9AirRR9vG7YYW43FthTNZ6EjYcFlAODoegbA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu/-/typst-ts-node-compiler-linux-x64-gnu-0.5.4.tgz", + "integrity": "sha512-iqYx3UFrrN0E8bg+NuvTptP2FndJNtt7tlU6Dsh6vjaay5IaBLIAtn9Yf9dPzsqWzHE3nwTq0yjoLfLEtY4a3w==", "cpu": [ "x64" ], @@ -1245,9 +1245,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl/-/typst-ts-node-compiler-linux-x64-musl-0.5.1.tgz", - "integrity": "sha512-5ox7W+9z0xgQNkDGwRIUqNL4jSdigKVcVv3iePs8Qlh8FeKTqDgNye48vvUJo/VYWk0rkz2HjW+zxfWZfIOptw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl/-/typst-ts-node-compiler-linux-x64-musl-0.5.4.tgz", + "integrity": "sha512-ROleNG0SD50+FoYJQA/9sai0FzNMh94ZAUVbSJFz474olJHSYQ8xqdIiGlpFA6XXPG6TKBedzbDUVYVXWFI+NQ==", "cpu": [ "x64" ], @@ -1260,9 +1260,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc/-/typst-ts-node-compiler-win32-arm64-msvc-0.5.1.tgz", - "integrity": "sha512-j/W25eaSYJtNyMIRSKFwlpTcwxnwcfABWMq542gVUNwVCrJhjfto1iQ6OToG/qBpD02CJEUydetT1C2H7GFtpA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc/-/typst-ts-node-compiler-win32-arm64-msvc-0.5.4.tgz", + "integrity": "sha512-Ihh40WW2cB0TUUMfJEOoH5MzQXmPSZc0OcAWMHj8A5Rr4pNNAr1gcJTeB6UHazoRQ8uQG5hg3CqCFydAIbXKfQ==", "cpu": [ "arm64" ], @@ -1275,9 +1275,9 @@ } }, "node_modules/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc/-/typst-ts-node-compiler-win32-x64-msvc-0.5.1.tgz", - "integrity": "sha512-z1DvhykbCAkJPLZw7WKFMHvnb0vT7dBaQpfa7kLvjSkX44wVP45k3T4jegP4+RAWtmzMBN5bSpjYCiMawPLBXQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc/-/typst-ts-node-compiler-win32-x64-msvc-0.5.4.tgz", + "integrity": "sha512-umEuUW6mn68JTueWr4LHsIUN8Bxs1aGyJdHVMy4br1g7MPqkoR0e8rVreTNulKaDx1+4lFdceWa1Uu7Yu0g9Ag==", "cpu": [ "x64" ], @@ -5983,9 +5983,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.25.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.3.tgz", - "integrity": "sha512-dzQmIFtM970z+fP9ziQ3yG4e3ULIbwZzJ734vaMVUTaKQ2+Ru1Ou/gjshOYVHCcd1rpAelC6ngjvjDXph98unQ==", + "version": "10.25.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", + "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" diff --git a/package.json b/package.json index 42714c1fa..3ca07145a 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "dependencies": { "@clack/prompts": "^0.9.0", "@floating-ui/dom": "^1.6.12", - "@myriaddreamin/rehype-typst": "^0.5.0-rc9", + "@myriaddreamin/rehype-typst": "^0.5.4", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", "async-mutex": "^0.5.0", @@ -62,7 +62,7 @@ "mermaid": "^11.4.1", "micromorph": "^0.4.5", "pixi.js": "^8.6.6", - "preact": "^10.25.3", + "preact": "^10.25.4", "preact-render-to-string": "^6.5.12", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", From a934397961f15ee0e07a43125e20bd26f7125be6 Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Tue, 31 Dec 2024 04:21:07 +0200 Subject: [PATCH 074/303] fix(spa): Fix relative alias redirects (#1688) --- quartz/components/scripts/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quartz/components/scripts/util.ts b/quartz/components/scripts/util.ts index c1db8bad5..ff486cf41 100644 --- a/quartz/components/scripts/util.ts +++ b/quartz/components/scripts/util.ts @@ -41,5 +41,5 @@ export async function fetchCanonical(url: URL): Promise { // to allow the caller to read it if it's was not a redirect const text = await res.clone().text() const [_, redirect] = text.match(canonicalRegex) ?? [] - return redirect ? fetch(redirect) : res + return redirect ? fetch(`${new URL(redirect, url)}`) : res } From 9466c145b1b84299be5f865596b3ebdac248b9fa Mon Sep 17 00:00:00 2001 From: moexiami <1927254+Xiami2012@users.noreply.github.com> Date: Thu, 2 Jan 2025 02:07:59 +0800 Subject: [PATCH 075/303] fix(path): correct handle URI schemes in joinSegments (#1693) --- quartz/util/path.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/quartz/util/path.ts b/quartz/util/path.ts index a6a05f932..d2409e1cd 100644 --- a/quartz/util/path.ts +++ b/quartz/util/path.ts @@ -185,8 +185,13 @@ export function slugTag(tag: string) { export function joinSegments(...args: string[]): string { return args .filter((segment) => segment !== "") + .map((segment, index) => + index === 0 + ? // Deduplicate but not remove leading slashes for first segment + segment.replace(/\/+$/g, "").replace(/^\/\/+/g, "/") + : segment.replace(/^\/+|\/+$/g, ""), + ) .join("/") - .replace(/\/\/+/g, "/") } export function getAllSegmentPrefixes(tags: string): string[] { From e3162f7a7e810b74ba417590657a53e00c3b2f76 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 1 Jan 2025 12:11:16 -0800 Subject: [PATCH 076/303] chore: joinSegments fix + tests --- quartz/util/path.test.ts | 19 +++++++++++++++++++ quartz/util/path.ts | 25 ++++++++++++++++++------- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/quartz/util/path.test.ts b/quartz/util/path.test.ts index 7e9c4c84a..687e69359 100644 --- a/quartz/util/path.test.ts +++ b/quartz/util/path.test.ts @@ -158,6 +158,25 @@ describe("transforms", () => { path.isRelativeURL, ) }) + + test("joinSegments", () => { + assert.strictEqual(path.joinSegments("a", "b"), "a/b") + assert.strictEqual(path.joinSegments("a/", "b"), "a/b") + assert.strictEqual(path.joinSegments("a", "b/"), "a/b/") + assert.strictEqual(path.joinSegments("a/", "b/"), "a/b/") + + // preserve leading and trailing slashes + assert.strictEqual(path.joinSegments("/a", "b"), "/a/b") + assert.strictEqual(path.joinSegments("/a/", "b"), "/a/b") + assert.strictEqual(path.joinSegments("/a", "b/"), "/a/b/") + assert.strictEqual(path.joinSegments("/a/", "b/"), "/a/b/") + + // works with protocol specifiers + assert.strictEqual(path.joinSegments("https://example.com", "a"), "https://example.com/a") + assert.strictEqual(path.joinSegments("https://example.com/", "a"), "https://example.com/a") + assert.strictEqual(path.joinSegments("https://example.com", "a/"), "https://example.com/a/") + assert.strictEqual(path.joinSegments("https://example.com/", "a/"), "https://example.com/a/") + }) }) describe("link strategies", () => { diff --git a/quartz/util/path.ts b/quartz/util/path.ts index d2409e1cd..580707f2c 100644 --- a/quartz/util/path.ts +++ b/quartz/util/path.ts @@ -183,15 +183,26 @@ export function slugTag(tag: string) { } export function joinSegments(...args: string[]): string { - return args + if (args.length === 0) { + return "" + } + + let joined = args .filter((segment) => segment !== "") - .map((segment, index) => - index === 0 - ? // Deduplicate but not remove leading slashes for first segment - segment.replace(/\/+$/g, "").replace(/^\/\/+/g, "/") - : segment.replace(/^\/+|\/+$/g, ""), - ) + .map((segment) => stripSlashes(segment)) .join("/") + + // if the first segment starts with a slash, add it back + if (args[0].startsWith("/")) { + joined = "/" + joined + } + + // if the last segment is a folder, add a trailing slash + if (args[args.length - 1].endsWith("/")) { + joined = joined + "/" + } + + return joined } export function getAllSegmentPrefixes(tags: string): string[] { From 2e6a675edddd25a71ecfddc73e0e292cb21d5981 Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Wed, 1 Jan 2025 12:24:32 -0800 Subject: [PATCH 077/303] perf: reduce bundle size (closes #1607) (#1689) --- docs/advanced/making plugins.md | 2 +- package-lock.json | 599 ++------------------ package.json | 1 - quartz/components/Head.tsx | 1 + quartz/components/renderPage.tsx | 33 +- quartz/components/scripts/mermaid.inline.ts | 8 +- quartz/plugins/emitters/404.tsx | 2 +- quartz/plugins/emitters/contentPage.tsx | 2 +- quartz/plugins/emitters/folderPage.tsx | 2 +- quartz/plugins/emitters/tagPage.tsx | 2 +- quartz/plugins/transformers/ofm.ts | 20 +- 11 files changed, 94 insertions(+), 578 deletions(-) diff --git a/docs/advanced/making plugins.md b/docs/advanced/making plugins.md index 9925d16c9..015e1953a 100644 --- a/docs/advanced/making plugins.md +++ b/docs/advanced/making plugins.md @@ -274,7 +274,7 @@ export const ContentPage: QuartzEmitterPlugin = () => { const allFiles = content.map((c) => c[1].data) for (const [tree, file] of content) { const slug = canonicalizeServer(file.data.slug!) - const externalResources = pageResources(slug, resources) + const externalResources = pageResources(slug, file.data, resources) const componentData: QuartzComponentProps = { fileData: file.data, externalResources, diff --git a/package-lock.json b/package-lock.json index 3e50d0920..7ccfef626 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,6 @@ "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", - "mermaid": "^11.4.1", "micromorph": "^0.4.5", "pixi.js": "^8.6.6", "preact": "^10.25.4", @@ -95,28 +94,6 @@ "npm": ">=9.3.1" } }, - "node_modules/@antfu/install-pkg": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", - "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^0.2.0", - "tinyexec": "^0.3.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", - "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@asamuzakjp/dom-selector": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-2.0.2.tgz", @@ -127,57 +104,12 @@ "is-potential-custom-element-name": "^1.0.1" } }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz", - "integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==", - "license": "MIT" - }, "node_modules/@bufbuild/protobuf": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz", "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==", "peer": true }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", - "license": "Apache-2.0" - }, "node_modules/@citation-js/core": { "version": "0.7.14", "resolved": "https://registry.npmjs.org/@citation-js/core/-/core-0.7.14.tgz", @@ -681,27 +613,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.33.tgz", - "integrity": "sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^0.4.0", - "@antfu/utils": "^0.7.10", - "@iconify/types": "^2.0.0", - "debug": "^4.3.6", - "kolorist": "^1.8.0", - "local-pkg": "^0.5.0", - "mlly": "^1.7.1" - } - }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", @@ -1079,15 +990,6 @@ "node": ">=12" } }, - "node_modules/@mermaid-js/parser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.3.0.tgz", - "integrity": "sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==", - "license": "MIT", - "dependencies": { - "langium": "3.0.0" - } - }, "node_modules/@myriaddreamin/rehype-typst": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@myriaddreamin/rehype-typst/-/rehype-typst-0.5.4.tgz", @@ -1668,6 +1570,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -1704,12 +1607,14 @@ "node_modules/@types/d3-array": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", - "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==" + "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==", + "dev": true }, "node_modules/@types/d3-axis": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "dev": true, "dependencies": { "@types/d3-selection": "*" } @@ -1718,6 +1623,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dev": true, "dependencies": { "@types/d3-selection": "*" } @@ -1725,17 +1631,20 @@ "node_modules/@types/d3-chord": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", - "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==" + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", + "dev": true }, "node_modules/@types/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "dev": true }, "node_modules/@types/d3-contour": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dev": true, "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" @@ -1744,17 +1653,20 @@ "node_modules/@types/d3-delaunay": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "dev": true }, "node_modules/@types/d3-dispatch": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", - "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==" + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", + "dev": true }, "node_modules/@types/d3-drag": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dev": true, "dependencies": { "@types/d3-selection": "*" } @@ -1762,17 +1674,20 @@ "node_modules/@types/d3-dsv": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==" + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", + "dev": true }, "node_modules/@types/d3-ease": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true }, "node_modules/@types/d3-fetch": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dev": true, "dependencies": { "@types/d3-dsv": "*" } @@ -1780,17 +1695,20 @@ "node_modules/@types/d3-force": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", - "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==" + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", + "dev": true }, "node_modules/@types/d3-format": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "dev": true }, "node_modules/@types/d3-geo": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dev": true, "dependencies": { "@types/geojson": "*" } @@ -1798,12 +1716,14 @@ "node_modules/@types/d3-hierarchy": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==" + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", + "dev": true }, "node_modules/@types/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, "dependencies": { "@types/d3-color": "*" } @@ -1811,27 +1731,32 @@ "node_modules/@types/d3-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true }, "node_modules/@types/d3-polygon": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==" + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true }, "node_modules/@types/d3-quadtree": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==" + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "dev": true }, "node_modules/@types/d3-random": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==" + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true }, "node_modules/@types/d3-scale": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dev": true, "dependencies": { "@types/d3-time": "*" } @@ -1839,17 +1764,20 @@ "node_modules/@types/d3-scale-chromatic": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true }, "node_modules/@types/d3-selection": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", - "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==" + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", + "dev": true }, "node_modules/@types/d3-shape": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dev": true, "dependencies": { "@types/d3-path": "*" } @@ -1857,22 +1785,26 @@ "node_modules/@types/d3-time": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true }, "node_modules/@types/d3-time-format": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==" + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true }, "node_modules/@types/d3-timer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true }, "node_modules/@types/d3-transition": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dev": true, "dependencies": { "@types/d3-selection": "*" } @@ -1881,6 +1813,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", + "dev": true, "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" @@ -1916,7 +1849,8 @@ "node_modules/@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", + "dev": true }, "node_modules/@types/hast": { "version": "3.0.4", @@ -1987,12 +1921,6 @@ "source-map": "^0.6.0" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "optional": true - }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", @@ -2042,18 +1970,6 @@ "node": ">=10.0.0" } }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", @@ -2284,32 +2200,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -2481,12 +2371,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -2495,15 +2379,6 @@ "node": ">= 0.6" } }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -2588,54 +2463,6 @@ "node": ">=18" } }, - "node_modules/cytoscape": { - "version": "3.30.3", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.3.tgz", - "integrity": "sha512-HncJ9gGJbVtw7YXtIs3+6YAFSSiKsom0amWc33Z7QbylbY2JGMrA0yz4EwrdTScZxnwclXeEZHzO5pxoy0ZE4g==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", @@ -2897,46 +2724,6 @@ "node": ">=12" } }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", @@ -3046,16 +2833,6 @@ "node": ">=12" } }, - "node_modules/dagre-d3-es": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", - "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", @@ -3068,12 +2845,6 @@ "node": ">=18" } }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "license": "MIT" - }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -3155,14 +2926,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dompurify": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.3.tgz", - "integrity": "sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, "node_modules/earcut": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", @@ -3611,12 +3374,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "license": "MIT" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4304,11 +4061,6 @@ "node": ">= 12" } }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -4317,34 +4069,6 @@ "node": ">=0.10.0" } }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "license": "MIT" - }, - "node_modules/langium": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.0.0.tgz", - "integrity": "sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==", - "license": "MIT", - "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, "node_modules/lightningcss": { "version": "1.28.2", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.2.tgz", @@ -4581,28 +4305,6 @@ "node": ">= 0.4" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "license": "MIT", - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -4629,18 +4331,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marked": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", - "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/mathjax-full": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", @@ -5020,33 +4710,6 @@ "node": ">= 8" } }, - "node_modules/mermaid": { - "version": "11.4.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.1.tgz", - "integrity": "sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==", - "dependencies": { - "@braintree/sanitize-url": "^7.0.1", - "@iconify/utils": "^2.1.32", - "@mermaid-js/parser": "^0.3.0", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.2", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.11", - "dayjs": "^1.11.10", - "dompurify": "^3.2.1", - "katex": "^0.16.9", - "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^13.0.2", - "roughjs": "^4.6.6", - "stylis": "^4.3.1", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.1" - } - }, "node_modules/mhchemparser": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", @@ -5683,18 +5346,6 @@ "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==" }, - "node_modules/mlly": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz", - "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==", - "license": "MIT", - "dependencies": { - "acorn": "^8.12.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "ufo": "^1.5.4" - } - }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", @@ -5771,12 +5422,6 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, - "node_modules/package-manager-detector": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.2.tgz", - "integrity": "sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==", - "license": "MIT" - }, "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -5856,12 +5501,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" - }, "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", @@ -5911,12 +5550,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5949,33 +5582,6 @@ "parse-svg-path": "^0.1.2" } }, - "node_modules/pkg-types": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", - "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.2", - "pathe": "^1.1.2" - } - }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -6530,18 +6136,6 @@ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", @@ -7367,12 +6961,6 @@ "inline-style-parser": "0.2.2" } }, - "node_modules/stylis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", - "license": "MIT" - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -7422,12 +7010,6 @@ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, - "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", - "license": "MIT" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7515,15 +7097,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -7968,12 +7541,6 @@ "node": ">=14.17" } }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "license": "MIT" - }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", @@ -8187,19 +7754,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/varint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", @@ -8267,55 +7821,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "license": "MIT" - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", diff --git a/package.json b/package.json index 3ca07145a..e99b82835 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,6 @@ "mdast-util-find-and-replace": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", - "mermaid": "^11.4.1", "micromorph": "^0.4.5", "pixi.js": "^8.6.6", "preact": "^10.25.4", diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index a8e4974d1..3a4db10de 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -165,6 +165,7 @@ export default (() => { )} + {/* OG/Twitter meta tags */} diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index 9c530967b..3914411ac 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -8,6 +8,10 @@ import { visit } from "unist-util-visit" import { Root, Element, ElementContent } from "hast" import { GlobalConfiguration } from "../cfg" import { i18n } from "../i18n" +// @ts-ignore +import mermaidScript from "./scripts/mermaid.inline" +import mermaidStyle from "./styles/mermaid.inline.scss" +import { QuartzPluginData } from "../plugins/vfile" interface RenderComponents { head: QuartzComponent @@ -23,12 +27,13 @@ interface RenderComponents { const headerRegex = new RegExp(/h[1-6]/) export function pageResources( baseDir: FullSlug | RelativeURL, + fileData: QuartzPluginData, staticResources: StaticResources, ): StaticResources { const contentIndexPath = joinSegments(baseDir, "static/contentIndex.json") const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())` - return { + const resources: StaticResources = { css: [ { content: joinSegments(baseDir, "index.css"), @@ -48,14 +53,28 @@ export function pageResources( script: contentIndexScript, }, ...staticResources.js, - { - src: joinSegments(baseDir, "postscript.js"), - loadTime: "afterDOMReady", - moduleType: "module", - contentType: "external", - }, ], } + + if (fileData.hasMermaidDiagram) { + resources.js.push({ + script: mermaidScript, + loadTime: "afterDOMReady", + moduleType: "module", + contentType: "inline", + }) + resources.css.push({ content: mermaidStyle, inline: true }) + } + + // NOTE: we have to put this last to make sure spa.inline.ts is the last item. + resources.js.push({ + src: joinSegments(baseDir, "postscript.js"), + loadTime: "afterDOMReady", + moduleType: "module", + contentType: "external", + }) + + return resources } export function renderPage( diff --git a/quartz/components/scripts/mermaid.inline.ts b/quartz/components/scripts/mermaid.inline.ts index 77a3ebe75..6dd254d87 100644 --- a/quartz/components/scripts/mermaid.inline.ts +++ b/quartz/components/scripts/mermaid.inline.ts @@ -1,5 +1,4 @@ import { removeAllChildren } from "./util" -import mermaid from "mermaid" interface Position { x: number @@ -144,6 +143,7 @@ const cssVars = [ "--codeFont", ] as const +let mermaidImport = undefined document.addEventListener("nav", async () => { const center = document.querySelector(".center") as HTMLElement const nodes = center.querySelectorAll("code.mermaid") as NodeListOf @@ -157,6 +157,12 @@ document.addEventListener("nav", async () => { {} as Record<(typeof cssVars)[number], string>, ) + mermaidImport ||= await import( + //@ts-ignore + "https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.4.0/mermaid.esm.min.mjs" + ) + const mermaid = mermaidImport.default + const darkMode = document.documentElement.getAttribute("saved-theme") === "dark" mermaid.initialize({ startOnLoad: false, diff --git a/quartz/plugins/emitters/404.tsx b/quartz/plugins/emitters/404.tsx index e4605cfcd..2d518b675 100644 --- a/quartz/plugins/emitters/404.tsx +++ b/quartz/plugins/emitters/404.tsx @@ -37,7 +37,6 @@ export const NotFoundPage: QuartzEmitterPlugin = () => { const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) const path = url.pathname as FullSlug - const externalResources = pageResources(path, resources) const notFound = i18n(cfg.locale).pages.error.title const [tree, vfile] = defaultProcessedContent({ slug, @@ -45,6 +44,7 @@ export const NotFoundPage: QuartzEmitterPlugin = () => { description: notFound, frontmatter: { title: notFound, tags: [] }, }) + const externalResources = pageResources(path, vfile.data, resources) const componentData: QuartzComponentProps = { ctx, fileData: vfile.data, diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx index 2ac132147..8788f331d 100644 --- a/quartz/plugins/emitters/contentPage.tsx +++ b/quartz/plugins/emitters/contentPage.tsx @@ -106,7 +106,7 @@ export const ContentPage: QuartzEmitterPlugin> = (userOp containsIndex = true } - const externalResources = pageResources(pathToRoot(slug), resources) + const externalResources = pageResources(pathToRoot(slug), file.data, resources) const componentData: QuartzComponentProps = { ctx, fileData: file.data, diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx index b6d860272..bafaec916 100644 --- a/quartz/plugins/emitters/folderPage.tsx +++ b/quartz/plugins/emitters/folderPage.tsx @@ -106,8 +106,8 @@ export const FolderPage: QuartzEmitterPlugin> = (user for (const folder of folders) { const slug = joinSegments(folder, "index") as FullSlug - const externalResources = pageResources(pathToRoot(slug), resources) const [tree, file] = folderDescriptions[folder] + const externalResources = pageResources(pathToRoot(slug), file.data, resources) const componentData: QuartzComponentProps = { ctx, fileData: file.data, diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index d82a537db..9913e7d82 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -114,8 +114,8 @@ export const TagPage: QuartzEmitterPlugin> = (userOpts) for (const tag of tags) { const slug = joinSegments("tags", tag) as FullSlug - const externalResources = pageResources(pathToRoot(slug), resources) const [tree, file] = tagDescriptions[tag] + const externalResources = pageResources(pathToRoot(slug), file.data, resources) const componentData: QuartzComponentProps = { ctx, fileData: file.data, diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 94cc7b6ea..d49b8e670 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -11,9 +11,6 @@ import { JSResource, CSSResource } from "../../util/resources" import calloutScript from "../../components/scripts/callout.inline.ts" // @ts-ignore import checkboxScript from "../../components/scripts/checkbox.inline.ts" -// @ts-ignore -import mermaidExtensionScript from "../../components/scripts/mermaid.inline.ts" -import mermaidStyle from "../../components/styles/mermaid.inline.scss" import { FilePath, pathToRoot, slugTag, slugifyFilePath } from "../../util/path" import { toHast } from "mdast-util-to-hast" import { toHtml } from "hast-util-to-html" @@ -513,9 +510,10 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> if (opts.mermaid) { plugins.push(() => { - return (tree: Root, _file) => { + return (tree: Root, file) => { visit(tree, "code", (node: Code) => { if (node.lang === "mermaid") { + file.data.hasMermaidDiagram = true node.data = { hProperties: { className: ["mermaid"], @@ -813,19 +811,6 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> }) } - if (opts.mermaid) { - js.push({ - script: mermaidExtensionScript, - loadTime: "afterDOMReady", - moduleType: "module", - contentType: "inline", - }) - css.push({ - content: mermaidStyle, - inline: true, - }) - } - return { js, css } }, } @@ -835,5 +820,6 @@ declare module "vfile" { interface DataMap { blocks: Record htmlAst: HtmlRoot + hasMermaidDiagram: boolean | undefined } } From c98ef7e89f2c63d417d2c9ae364c56308f8501fc Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Fri, 3 Jan 2025 11:27:43 -0800 Subject: [PATCH 078/303] perf(img): lazy load chunks (#1700) --- quartz/styles/base.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index aaf966efd..29ddc5aa5 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -512,6 +512,7 @@ img { max-width: 100%; border-radius: 5px; margin: 1rem 0; + content-visibility: auto; } p > img + em { From dc3323b5741845ac6109781da32d34f16e925815 Mon Sep 17 00:00:00 2001 From: Akihiro Saiki Date: Sun, 5 Jan 2025 02:45:53 +0900 Subject: [PATCH 079/303] chore: use Google Fonts API v2 to get fonts for ogp (#1705) --- quartz/util/og.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/quartz/util/og.tsx b/quartz/util/og.tsx index 0430a265d..42b9b27be 100644 --- a/quartz/util/og.tsx +++ b/quartz/util/og.tsx @@ -35,7 +35,9 @@ export async function getSatoriFont(headerFontName: string, bodyFontName: string async function fetchTtf(fontName: string, weight: FontWeight): Promise { try { // Get css file from google fonts - const cssResponse = await fetch(`https://fonts.googleapis.com/css?family=${fontName}:${weight}`) + const cssResponse = await fetch( + `https://fonts.googleapis.com/css2?family=${fontName}:wght@${weight}`, + ) const css = await cssResponse.text() // Extract .ttf url from css file From b7a945e034cd34798eed8806a9e0957716e5c598 Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Sun, 5 Jan 2025 08:11:15 +0200 Subject: [PATCH 080/303] fix(tags): Dont consume a space before content tags (#1706) --- quartz/plugins/transformers/ofm.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index d49b8e670..87c22e69a 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -121,12 +121,12 @@ const commentRegex = new RegExp(/%%[\s\S]*?%%/g) // from https://github.com/escwxyz/remark-obsidian-callout/blob/main/src/index.ts const calloutRegex = new RegExp(/^\[\!([\w-]+)\|?(.+?)?\]([+-]?)/) const calloutLineRegex = new RegExp(/^> *\[\!\w+\|?.*?\][+-]?.*$/gm) -// (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line +// (?<=^| ) -> a lookbehind assertion, tag should start be separated by a space or be the start of the line // #(...) -> capturing group, tag itself must start with # // (?:[-_\p{L}\d\p{Z}])+ -> non-capturing group, non-empty string of (Unicode-aware) alpha-numeric characters and symbols, hyphens and/or underscores // (?:\/[-_\p{L}\d\p{Z}]+)*) -> non-capturing group, matches an arbitrary number of tag strings separated by "/" const tagRegex = new RegExp( - /(?:^| )#((?:[-_\p{L}\p{Emoji}\p{M}\d])+(?:\/[-_\p{L}\p{Emoji}\p{M}\d]+)*)/gu, + /(?<=^| )#((?:[-_\p{L}\p{Emoji}\p{M}\d])+(?:\/[-_\p{L}\p{Emoji}\p{M}\d]+)*)/gu, ) const blockReferenceRegex = new RegExp(/\^([-_A-Za-z0-9]+)$/g) const ytLinkRegex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/ From c90dbacab05d2ceab84b53c66c7be77b4dda47ef Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Tue, 7 Jan 2025 22:33:34 +0200 Subject: [PATCH 081/303] chore(build): separate markdown and html handling into two separate stages (#1675) --- quartz/bootstrap-worker.mjs | 5 ++- quartz/plugins/vfile.ts | 8 ++-- quartz/processors/parse.ts | 90 ++++++++++++++++++++++++++----------- quartz/worker.ts | 37 ++++++++++++--- 4 files changed, 103 insertions(+), 37 deletions(-) diff --git a/quartz/bootstrap-worker.mjs b/quartz/bootstrap-worker.mjs index b08689c3c..c4c4949b9 100644 --- a/quartz/bootstrap-worker.mjs +++ b/quartz/bootstrap-worker.mjs @@ -1,7 +1,8 @@ #!/usr/bin/env node import workerpool from "workerpool" const cacheFile = "./.quartz-cache/transpiled-worker.mjs" -const { parseFiles } = await import(cacheFile) +const { parseMarkdown, processHtml } = await import(cacheFile) workerpool.worker({ - parseFiles, + parseMarkdown, + processHtml, }) diff --git a/quartz/plugins/vfile.ts b/quartz/plugins/vfile.ts index 5be210584..8c5cf6aa6 100644 --- a/quartz/plugins/vfile.ts +++ b/quartz/plugins/vfile.ts @@ -1,11 +1,13 @@ -import { Node, Parent } from "hast" +import { Root as HtmlRoot } from "hast" +import { Root as MdRoot } from "mdast" import { Data, VFile } from "vfile" export type QuartzPluginData = Data -export type ProcessedContent = [Node, VFile] +export type MarkdownContent = [MdRoot, VFile] +export type ProcessedContent = [HtmlRoot, VFile] export function defaultProcessedContent(vfileData: Partial): ProcessedContent { - const root: Parent = { type: "root", children: [] } + const root: HtmlRoot = { type: "root", children: [] } const vfile = new VFile("") vfile.data = vfileData return [root, vfile] diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index 2bd530c64..479313f49 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -4,18 +4,20 @@ import remarkRehype from "remark-rehype" import { Processor, unified } from "unified" import { Root as MDRoot } from "remark-parse/lib" import { Root as HTMLRoot } from "hast" -import { ProcessedContent } from "../plugins/vfile" +import { MarkdownContent, ProcessedContent } from "../plugins/vfile" import { PerfTimer } from "../util/perf" import { read } from "to-vfile" -import { FilePath, QUARTZ, slugifyFilePath } from "../util/path" +import { FilePath, FullSlug, QUARTZ, slugifyFilePath } from "../util/path" import path from "path" import workerpool, { Promise as WorkerPromise } from "workerpool" import { QuartzLogger } from "../util/log" import { trace } from "../util/trace" import { BuildCtx } from "../util/ctx" -export type QuartzProcessor = Processor -export function createProcessor(ctx: BuildCtx): QuartzProcessor { +export type QuartzMdProcessor = Processor +export type QuartzHtmlProcessor = Processor + +export function createMdProcessor(ctx: BuildCtx): QuartzMdProcessor { const transformers = ctx.cfg.plugins.transformers return ( @@ -24,14 +26,20 @@ export function createProcessor(ctx: BuildCtx): QuartzProcessor { .use(remarkParse) // MD AST -> MD AST transforms .use( - transformers - .filter((p) => p.markdownPlugins) - .flatMap((plugin) => plugin.markdownPlugins!(ctx)), - ) + transformers.flatMap((plugin) => plugin.markdownPlugins?.(ctx) ?? []), + ) as unknown as QuartzMdProcessor + // ^ sadly the typing of `use` is not smart enough to infer the correct type from our plugin list + ) +} + +export function createHtmlProcessor(ctx: BuildCtx): QuartzHtmlProcessor { + const transformers = ctx.cfg.plugins.transformers + return ( + unified() // MD AST -> HTML AST .use(remarkRehype, { allowDangerousHtml: true }) // HTML AST -> HTML AST transforms - .use(transformers.filter((p) => p.htmlPlugins).flatMap((plugin) => plugin.htmlPlugins!(ctx))) + .use(transformers.flatMap((plugin) => plugin.htmlPlugins?.(ctx) ?? [])) ) } @@ -75,8 +83,8 @@ async function transpileWorkerScript() { export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { const { argv, cfg } = ctx - return async (processor: QuartzProcessor) => { - const res: ProcessedContent[] = [] + return async (processor: QuartzMdProcessor) => { + const res: MarkdownContent[] = [] for (const fp of fps) { try { const perf = new PerfTimer() @@ -100,10 +108,32 @@ export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { res.push([newAst, file]) if (argv.verbose) { - console.log(`[process] ${fp} -> ${file.data.slug} (${perf.timeSince()})`) + console.log(`[markdown] ${fp} -> ${file.data.slug} (${perf.timeSince()})`) } } catch (err) { - trace(`\nFailed to process \`${fp}\``, err as Error) + trace(`\nFailed to process markdown \`${fp}\``, err as Error) + } + } + + return res + } +} + +export function createMarkdownParser(ctx: BuildCtx, mdContent: MarkdownContent[]) { + return async (processor: QuartzHtmlProcessor) => { + const res: ProcessedContent[] = [] + for (const [ast, file] of mdContent) { + try { + const perf = new PerfTimer() + + const newAst = await processor.run(ast as MDRoot, file) + res.push([newAst, file]) + + if (ctx.argv.verbose) { + console.log(`[html] ${file.data.slug} (${perf.timeSince()})`) + } + } catch (err) { + trace(`\nFailed to process html \`${file.data.filePath}\``, err as Error) } } @@ -113,6 +143,7 @@ export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { const clamp = (num: number, min: number, max: number) => Math.min(Math.max(Math.round(num), min), max) + export async function parseMarkdown(ctx: BuildCtx, fps: FilePath[]): Promise { const { argv } = ctx const perf = new PerfTimer() @@ -126,9 +157,8 @@ export async function parseMarkdown(ctx: BuildCtx, fps: FilePath[]): Promise[] = [] - for (const chunk of chunks(fps, CHUNK_SIZE)) { - childPromises.push(pool.exec("parseFiles", [ctx.buildId, argv, chunk, ctx.allSlugs])) + const errorHandler = (err: any) => { + console.error(`${err}`.replace(/^error:\s*/i, "")) + process.exit(1) } - const results: ProcessedContent[][] = await WorkerPromise.all(childPromises).catch((err) => { - const errString = err.toString().slice("Error:".length) - console.error(errString) - process.exit(1) - }) + const mdPromises: WorkerPromise<[MarkdownContent[], FullSlug[]]>[] = [] + for (const chunk of chunks(fps, CHUNK_SIZE)) { + mdPromises.push(pool.exec("parseMarkdown", [ctx.buildId, argv, chunk])) + } + const mdResults: [MarkdownContent[], FullSlug[]][] = + await WorkerPromise.all(mdPromises).catch(errorHandler) + + const childPromises: WorkerPromise[] = [] + for (const [_, extraSlugs] of mdResults) { + ctx.allSlugs.push(...extraSlugs) + } + for (const [mdChunk, _] of mdResults) { + childPromises.push(pool.exec("processHtml", [ctx.buildId, argv, mdChunk, ctx.allSlugs])) + } + const results: ProcessedContent[][] = await WorkerPromise.all(childPromises).catch(errorHandler) + res = results.flat() await pool.terminate() } diff --git a/quartz/worker.ts b/quartz/worker.ts index a209df9a0..c9cd98055 100644 --- a/quartz/worker.ts +++ b/quartz/worker.ts @@ -3,23 +3,46 @@ sourceMapSupport.install(options) import cfg from "../quartz.config" import { Argv, BuildCtx } from "./util/ctx" import { FilePath, FullSlug } from "./util/path" -import { createFileParser, createProcessor } from "./processors/parse" +import { + createFileParser, + createHtmlProcessor, + createMarkdownParser, + createMdProcessor, +} from "./processors/parse" import { options } from "./util/sourcemap" +import { MarkdownContent, ProcessedContent } from "./plugins/vfile" // only called from worker thread -export async function parseFiles( +export async function parseMarkdown( buildId: string, argv: Argv, fps: FilePath[], - allSlugs: FullSlug[], -) { +): Promise<[MarkdownContent[], FullSlug[]]> { + // this is a hack + // we assume markdown parsers can add to `allSlugs`, + // but don't actually use them + const allSlugs: FullSlug[] = [] const ctx: BuildCtx = { buildId, cfg, argv, allSlugs, } - const processor = createProcessor(ctx) - const parse = createFileParser(ctx, fps) - return parse(processor) + return [await createFileParser(ctx, fps)(createMdProcessor(ctx)), allSlugs] +} + +// only called from worker thread +export function processHtml( + buildId: string, + argv: Argv, + mds: MarkdownContent[], + allSlugs: FullSlug[], +): Promise { + const ctx: BuildCtx = { + buildId, + cfg, + argv, + allSlugs, + } + return createMarkdownParser(ctx, mds)(createHtmlProcessor(ctx)) } From 7e828252bbf37d967db3feed820409625f38b5ab Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Tue, 7 Jan 2025 16:00:09 -0500 Subject: [PATCH 082/303] fix(path): handle lone slash (#1713) --- quartz/util/path.test.ts | 4 ++++ quartz/util/path.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/quartz/util/path.test.ts b/quartz/util/path.test.ts index 687e69359..29d845d95 100644 --- a/quartz/util/path.test.ts +++ b/quartz/util/path.test.ts @@ -171,6 +171,10 @@ describe("transforms", () => { assert.strictEqual(path.joinSegments("/a", "b/"), "/a/b/") assert.strictEqual(path.joinSegments("/a/", "b/"), "/a/b/") + // lone slash + assert.strictEqual(path.joinSegments("/a/", "b", "/"), "/a/b/") + assert.strictEqual(path.joinSegments("a/", "b" + "/"), "a/b/") + // works with protocol specifiers assert.strictEqual(path.joinSegments("https://example.com", "a"), "https://example.com/a") assert.strictEqual(path.joinSegments("https://example.com/", "a"), "https://example.com/a") diff --git a/quartz/util/path.ts b/quartz/util/path.ts index 580707f2c..5835f15cc 100644 --- a/quartz/util/path.ts +++ b/quartz/util/path.ts @@ -188,7 +188,7 @@ export function joinSegments(...args: string[]): string { } let joined = args - .filter((segment) => segment !== "") + .filter((segment) => segment !== "" && segment !== "/") .map((segment) => stripSlashes(segment)) .join("/") From 09f8670db7424e6b366ec8779df941969fbd58e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 20:32:02 -0500 Subject: [PATCH 083/303] chore(deps): bump the production-dependencies group with 4 updates (#1711) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Aaron Pham --- package-lock.json | 133 ++++++++++++++++------------- package.json | 8 +- quartz/plugins/transformers/ofm.ts | 11 ++- 3 files changed, 89 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ccfef626..247f1e0a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", "lightningcss": "^1.28.2", - "mdast-util-find-and-replace": "^3.0.1", + "mdast-util-find-and-replace": "^3.0.2", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", @@ -57,10 +57,10 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", - "satori": "^0.12.0", + "satori": "^0.12.1", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.24.4", + "shiki": "^1.26.1", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -79,7 +79,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.10.2", + "@types/node": "^22.10.5", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", @@ -1473,50 +1473,66 @@ } }, "node_modules/@shikijs/core": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.4.tgz", - "integrity": "sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==", + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.26.1.tgz", + "integrity": "sha512-yeo7sG+WZQblKPclUOKRPwkv1PyoHYkJ4gP9DzhFJbTdueKR7wYTI1vfF/bFi1NTgc545yG/DzvVhZgueVOXMA==", "dependencies": { - "@shikijs/engine-javascript": "1.24.4", - "@shikijs/engine-oniguruma": "1.24.4", - "@shikijs/types": "1.24.4", - "@shikijs/vscode-textmate": "^9.3.1", + "@shikijs/engine-javascript": "1.26.1", + "@shikijs/engine-oniguruma": "1.26.1", + "@shikijs/types": "1.26.1", + "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.4.tgz", - "integrity": "sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==", + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.26.1.tgz", + "integrity": "sha512-CRhA0b8CaSLxS0E9A4Bzcb3LKBNpykfo9F85ozlNyArxjo2NkijtiwrJZ6eHa+NT5I9Kox2IXVdjUsP4dilsmw==", "dependencies": { - "@shikijs/types": "1.24.4", - "@shikijs/vscode-textmate": "^9.3.1", - "oniguruma-to-es": "0.8.1" + "@shikijs/types": "1.26.1", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "0.10.0" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.4.tgz", - "integrity": "sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==", + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.26.1.tgz", + "integrity": "sha512-F5XuxN1HljLuvfXv7d+mlTkV7XukC1cawdtOo+7pKgPD83CAB1Sf8uHqP3PK0u7njFH0ZhoXE1r+0JzEgAQ+kg==", "dependencies": { - "@shikijs/types": "1.24.4", - "@shikijs/vscode-textmate": "^9.3.1" + "@shikijs/types": "1.26.1", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.26.1.tgz", + "integrity": "sha512-oz/TQiIqZejEIZbGtn68hbJijAOTtYH4TMMSWkWYozwqdpKR3EXgILneQy26WItmJjp3xVspHdiUxUCws4gtuw==", + "dependencies": { + "@shikijs/types": "1.26.1" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.26.1.tgz", + "integrity": "sha512-JDxVn+z+wgLCiUhBGx2OQrLCkKZQGzNH3nAxFir4PjUcYiyD8Jdms9izyxIogYmSwmoPTatFTdzyrRKbKlSfPA==", + "dependencies": { + "@shikijs/types": "1.26.1" } }, "node_modules/@shikijs/types": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.4.tgz", - "integrity": "sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==", + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.26.1.tgz", + "integrity": "sha512-d4B00TKKAMaHuFYgRf3L0gwtvqpW4hVdVwKcZYbBfAAQXspgkbWqnFfuFl3MDH6gLbsubOcr+prcnsqah3ny7Q==", "dependencies": { - "@shikijs/vscode-textmate": "^9.3.1", + "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", - "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==" }, "node_modules/@shuding/opentype.js": { "version": "1.4.0-beta.0", @@ -1898,9 +1914,9 @@ } }, "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", "dev": true, "dependencies": { "undici-types": "~6.20.0" @@ -4343,9 +4359,9 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -5408,13 +5424,13 @@ } }, "node_modules/oniguruma-to-es": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.8.1.tgz", - "integrity": "sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.10.0.tgz", + "integrity": "sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg==", "dependencies": { "emoji-regex-xs": "^1.0.0", - "regex": "^5.0.2", - "regex-recursion": "^5.0.0" + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" } }, "node_modules/package-json-from-dist": { @@ -5703,18 +5719,19 @@ "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" }, "node_modules/regex": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz", - "integrity": "sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", "dependencies": { "regex-utilities": "^2.3.0" } }, "node_modules/regex-recursion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.0.0.tgz", - "integrity": "sha512-UwyOqeobrCCqTXPcsSqH4gDhOjD5cI/b8kjngWgSZbxYh5yVjAwTjO5+hAuPRNiuR70+5RlWSs+U9PVcVcW9Lw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", "dependencies": { + "regex": "^5.1.1", "regex-utilities": "^2.3.0" } }, @@ -6567,9 +6584,9 @@ } }, "node_modules/satori": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/satori/-/satori-0.12.0.tgz", - "integrity": "sha512-e0e+qQyeFwEszujN7SpWpRtZgww7Nh8lSO3bUn2spHZ5JpqEl3zJ3P14/JlWruxEwdgREs35ZnavrPrWaRVFDg==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.12.1.tgz", + "integrity": "sha512-0SbjchvDrDbeXeQgxWVtSWxww7qcFgk3DtSE2/blHOSlLsSHwIqO2fCrtVa/EudJ7Eqno8A33QNx56rUyGbLuw==", "dependencies": { "@shuding/opentype.js": "1.4.0-beta.0", "css-background-parser": "^0.1.0", @@ -6730,15 +6747,17 @@ } }, "node_modules/shiki": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.24.4.tgz", - "integrity": "sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==", + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.26.1.tgz", + "integrity": "sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw==", "dependencies": { - "@shikijs/core": "1.24.4", - "@shikijs/engine-javascript": "1.24.4", - "@shikijs/engine-oniguruma": "1.24.4", - "@shikijs/types": "1.24.4", - "@shikijs/vscode-textmate": "^9.3.1", + "@shikijs/core": "1.26.1", + "@shikijs/engine-javascript": "1.26.1", + "@shikijs/engine-oniguruma": "1.26.1", + "@shikijs/langs": "1.26.1", + "@shikijs/themes": "1.26.1", + "@shikijs/types": "1.26.1", + "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, diff --git a/package.json b/package.json index e99b82835..5e2b21f2c 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", "lightningcss": "^1.28.2", - "mdast-util-find-and-replace": "^3.0.1", + "mdast-util-find-and-replace": "^3.0.2", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", @@ -83,10 +83,10 @@ "remark-smartypants": "^3.0.2", "rfdc": "^1.4.1", "rimraf": "^6.0.1", - "satori": "^0.12.0", + "satori": "^0.12.1", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.24.4", + "shiki": "^1.26.1", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -102,7 +102,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.10.2", + "@types/node": "^22.10.5", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 87c22e69a..b0b0a42ef 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -1,5 +1,13 @@ import { QuartzTransformerPlugin } from "../types" -import { Root, Html, BlockContent, DefinitionContent, Paragraph, Code } from "mdast" +import { + Root, + Html, + BlockContent, + PhrasingContent, + DefinitionContent, + Paragraph, + Code, +} from "mdast" import { Element, Literal, Root as HtmlRoot } from "hast" import { ReplaceFunction, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace" import rehypeRaw from "rehype-raw" @@ -14,7 +22,6 @@ import checkboxScript from "../../components/scripts/checkbox.inline.ts" import { FilePath, pathToRoot, slugTag, slugifyFilePath } from "../../util/path" import { toHast } from "mdast-util-to-hast" import { toHtml } from "hast-util-to-html" -import { PhrasingContent } from "mdast-util-find-and-replace/lib" import { capitalize } from "../../util/lang" import { PluggableList } from "unified" From 992ac00f7c59232a468d8f5435554fcc23008013 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 00:02:49 -0500 Subject: [PATCH 084/303] chore(deps): bump the production-dependencies group with 7 updates (#1719) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 222 +++++++++++++++++++++++----------------------- package.json | 14 +-- 2 files changed, 118 insertions(+), 118 deletions(-) diff --git a/package-lock.json b/package-lock.json index 247f1e0a0..30d740c21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "4.4.0", "license": "MIT", "dependencies": { - "@clack/prompts": "^0.9.0", - "@floating-ui/dom": "^1.6.12", + "@clack/prompts": "^0.9.1", + "@floating-ui/dom": "^1.6.13", "@myriaddreamin/rehype-typst": "^0.5.4", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", @@ -29,14 +29,14 @@ "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", - "lightningcss": "^1.28.2", + "lightningcss": "^1.29.1", "mdast-util-find-and-replace": "^3.0.2", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", "pixi.js": "^8.6.6", "preact": "^10.25.4", - "preact-render-to-string": "^6.5.12", + "preact-render-to-string": "^6.5.13", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", @@ -60,7 +60,7 @@ "satori": "^0.12.1", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.26.1", + "shiki": "^1.26.2", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -79,7 +79,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.10.5", + "@types/node": "^22.10.6", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", @@ -87,7 +87,7 @@ "esbuild": "^0.24.2", "prettier": "^3.4.2", "tsx": "^4.19.2", - "typescript": "^5.7.2" + "typescript": "^5.7.3" }, "engines": { "node": "20 || >=22", @@ -187,20 +187,20 @@ } }, "node_modules/@clack/core": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.4.0.tgz", - "integrity": "sha512-YJCYBsyJfNDaTbvDUVSJ3SgSuPrcujarRgkJ5NLjexDZKvaOiVVJvAQYx8lIgG0qRT8ff0fPgqyBCVivanIZ+A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.4.1.tgz", + "integrity": "sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==", "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "node_modules/@clack/prompts": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.9.0.tgz", - "integrity": "sha512-nGsytiExgUr4FL0pR/LeqxA28nz3E0cW7eLTSh3Iod9TGrbBt8Y7BHbV3mmkNC4G0evdYyQ3ZsbiBkk7ektArA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.9.1.tgz", + "integrity": "sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==", "dependencies": { - "@clack/core": "0.4.0", + "@clack/core": "0.4.1", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } @@ -600,18 +600,18 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", - "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" + "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.5", @@ -1473,57 +1473,57 @@ } }, "node_modules/@shikijs/core": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.26.1.tgz", - "integrity": "sha512-yeo7sG+WZQblKPclUOKRPwkv1PyoHYkJ4gP9DzhFJbTdueKR7wYTI1vfF/bFi1NTgc545yG/DzvVhZgueVOXMA==", + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.26.2.tgz", + "integrity": "sha512-ORyu3MrY7dCC7FDLDsFSkBM9b/AT9/Y8rH+UQ07Rtek48pp0ZhQOMPTKolqszP4bBCas6FqTZQYt18BBamVl/g==", "dependencies": { - "@shikijs/engine-javascript": "1.26.1", - "@shikijs/engine-oniguruma": "1.26.1", - "@shikijs/types": "1.26.1", + "@shikijs/engine-javascript": "1.26.2", + "@shikijs/engine-oniguruma": "1.26.2", + "@shikijs/types": "1.26.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.26.1.tgz", - "integrity": "sha512-CRhA0b8CaSLxS0E9A4Bzcb3LKBNpykfo9F85ozlNyArxjo2NkijtiwrJZ6eHa+NT5I9Kox2IXVdjUsP4dilsmw==", + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.26.2.tgz", + "integrity": "sha512-ngkIu9swLVo9Zt5QBtz5Sk08vmPcwuj01r7pPK/Zjmo2U2WyKMK4WMUMmkdQiUacdcLth0zt8u1onp4zhkFXKQ==", "dependencies": { - "@shikijs/types": "1.26.1", + "@shikijs/types": "1.26.2", "@shikijs/vscode-textmate": "^10.0.1", - "oniguruma-to-es": "0.10.0" + "oniguruma-to-es": "^1.0.0" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.26.1.tgz", - "integrity": "sha512-F5XuxN1HljLuvfXv7d+mlTkV7XukC1cawdtOo+7pKgPD83CAB1Sf8uHqP3PK0u7njFH0ZhoXE1r+0JzEgAQ+kg==", + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.26.2.tgz", + "integrity": "sha512-mlN7Qrs+w60nKrd7at7XkXSwz6728Pe34taDmHrG6LRHjzCqQ+ysg+/AT6/D2LMk0s2lsr71DjpI73430QP4/w==", "dependencies": { - "@shikijs/types": "1.26.1", + "@shikijs/types": "1.26.2", "@shikijs/vscode-textmate": "^10.0.1" } }, "node_modules/@shikijs/langs": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.26.1.tgz", - "integrity": "sha512-oz/TQiIqZejEIZbGtn68hbJijAOTtYH4TMMSWkWYozwqdpKR3EXgILneQy26WItmJjp3xVspHdiUxUCws4gtuw==", + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.26.2.tgz", + "integrity": "sha512-o5cdPycB2Kw3IgncHxWopWPiTkjAj7dG01fLkkUyj3glb5ftxL/Opecq9F54opMlrgXy7ZIqDERvFLlUzsCOuA==", "dependencies": { - "@shikijs/types": "1.26.1" + "@shikijs/types": "1.26.2" } }, "node_modules/@shikijs/themes": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.26.1.tgz", - "integrity": "sha512-JDxVn+z+wgLCiUhBGx2OQrLCkKZQGzNH3nAxFir4PjUcYiyD8Jdms9izyxIogYmSwmoPTatFTdzyrRKbKlSfPA==", + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.26.2.tgz", + "integrity": "sha512-y4Pn6PM5mODz/e3yF6jAUG7WLKJzqL2tJ5qMJCUkMUB1VRgtQVvoa1cHh7NScryGXyrYGJ8nPnRDhdv2rw0xpA==", "dependencies": { - "@shikijs/types": "1.26.1" + "@shikijs/types": "1.26.2" } }, "node_modules/@shikijs/types": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.26.1.tgz", - "integrity": "sha512-d4B00TKKAMaHuFYgRf3L0gwtvqpW4hVdVwKcZYbBfAAQXspgkbWqnFfuFl3MDH6gLbsubOcr+prcnsqah3ny7Q==", + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.26.2.tgz", + "integrity": "sha512-PO2jucx2FIdlLBPYbIUlMtWSLs5ulcRcuV93cR3T65lkK5SJP4MGBRt9kmWGXiQc0f7+FHj/0BEawditZcI/fQ==", "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" @@ -1914,9 +1914,9 @@ } }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "dependencies": { "undici-types": "~6.20.0" @@ -4086,9 +4086,9 @@ } }, "node_modules/lightningcss": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.2.tgz", - "integrity": "sha512-ePLRrbt3fgjXI5VFZOLbvkLD5ZRuxGKm+wJ3ujCqBtL3NanDHPo/5zicR5uEKAPiIjBYF99BM4K4okvMznjkVA==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", + "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", "dependencies": { "detect-libc": "^1.0.3" }, @@ -4100,22 +4100,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.28.2", - "lightningcss-darwin-x64": "1.28.2", - "lightningcss-freebsd-x64": "1.28.2", - "lightningcss-linux-arm-gnueabihf": "1.28.2", - "lightningcss-linux-arm64-gnu": "1.28.2", - "lightningcss-linux-arm64-musl": "1.28.2", - "lightningcss-linux-x64-gnu": "1.28.2", - "lightningcss-linux-x64-musl": "1.28.2", - "lightningcss-win32-arm64-msvc": "1.28.2", - "lightningcss-win32-x64-msvc": "1.28.2" + "lightningcss-darwin-arm64": "1.29.1", + "lightningcss-darwin-x64": "1.29.1", + "lightningcss-freebsd-x64": "1.29.1", + "lightningcss-linux-arm-gnueabihf": "1.29.1", + "lightningcss-linux-arm64-gnu": "1.29.1", + "lightningcss-linux-arm64-musl": "1.29.1", + "lightningcss-linux-x64-gnu": "1.29.1", + "lightningcss-linux-x64-musl": "1.29.1", + "lightningcss-win32-arm64-msvc": "1.29.1", + "lightningcss-win32-x64-msvc": "1.29.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.2.tgz", - "integrity": "sha512-/8cPSqZiusHSS+WQz0W4NuaqFjquys1x+NsdN/XOHb+idGHJSoJ7SoQTVl3DZuAgtPZwFZgRfb/vd1oi8uX6+g==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", + "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", "cpu": [ "arm64" ], @@ -4132,9 +4132,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.2.tgz", - "integrity": "sha512-R7sFrXlgKjvoEG8umpVt/yutjxOL0z8KWf0bfPT3cYMOW4470xu5qSHpFdIOpRWwl3FKNMUdbKtMUjYt0h2j4g==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", + "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", "cpu": [ "x64" ], @@ -4151,9 +4151,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.2.tgz", - "integrity": "sha512-l2qrCT+x7crAY+lMIxtgvV10R8VurzHAoUZJaVFSlHrN8kRLTvEg9ObojIDIexqWJQvJcVVV3vfzsEynpiuvgA==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", + "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", "cpu": [ "x64" ], @@ -4170,9 +4170,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.2.tgz", - "integrity": "sha512-DKMzpICBEKnL53X14rF7hFDu8KKALUJtcKdFUCW5YOlGSiwRSgVoRjM97wUm/E0NMPkzrTi/rxfvt7ruNK8meg==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", + "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", "cpu": [ "arm" ], @@ -4189,9 +4189,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.2.tgz", - "integrity": "sha512-nhfjYkfymWZSxdtTNMWyhFk2ImUm0X7NAgJWFwnsYPOfmtWQEapzG/DXZTfEfMjSzERNUNJoQjPAbdqgB+sjiw==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", + "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", "cpu": [ "arm64" ], @@ -4208,9 +4208,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.2.tgz", - "integrity": "sha512-1SPG1ZTNnphWvAv8RVOymlZ8BDtAg69Hbo7n4QxARvkFVCJAt0cgjAw1Fox0WEhf4PwnyoOBaVH0Z5YNgzt4dA==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", + "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", "cpu": [ "arm64" ], @@ -4227,9 +4227,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.2.tgz", - "integrity": "sha512-ZhQy0FcO//INWUdo/iEdbefntTdpPVQ0XJwwtdbBuMQe+uxqZoytm9M+iqR9O5noWFaxK+nbS2iR/I80Q2Ofpg==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", + "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", "cpu": [ "x64" ], @@ -4246,9 +4246,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.2.tgz", - "integrity": "sha512-alb/j1NMrgQmSFyzTbN1/pvMPM+gdDw7YBuQ5VSgcFDypN3Ah0BzC2dTZbzwzaMdUVDszX6zH5MzjfVN1oGuww==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", + "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", "cpu": [ "x64" ], @@ -4265,9 +4265,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.2.tgz", - "integrity": "sha512-WnwcjcBeAt0jGdjlgbT9ANf30pF0C/QMb1XnLnH272DQU8QXh+kmpi24R55wmWBwaTtNAETZ+m35ohyeMiNt+g==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", + "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", "cpu": [ "arm64" ], @@ -4284,9 +4284,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.2.tgz", - "integrity": "sha512-3piBifyT3avz22o6mDKywQC/OisH2yDK+caHWkiMsF82i3m5wDBadyCjlCQ5VNgzYkxrWZgiaxHDdd5uxsi0/A==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", + "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", "cpu": [ "x64" ], @@ -5424,9 +5424,9 @@ } }, "node_modules/oniguruma-to-es": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.10.0.tgz", - "integrity": "sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-1.0.0.tgz", + "integrity": "sha512-kihvp0O4lFwf5tZMkfanwQLIZ9ORe9OeOFgZonH0BQeThgwfJiaZFeOfvvJVnJIM9TiVmx0RDD35hUJDR0++rQ==", "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", @@ -5614,9 +5614,9 @@ } }, "node_modules/preact-render-to-string": { - "version": "6.5.12", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.12.tgz", - "integrity": "sha512-FpU7/cRipZo4diSWQq7gZWVp+Px76CtVduJZNvQwVzynDsAIxKteMrjCCGPbM2oEasReoDffaeMCMlaur9ohIg==", + "version": "6.5.13", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.13.tgz", + "integrity": "sha512-iGPd+hKPMFKsfpR2vL4kJ6ZPcFIoWZEcBf0Dpm3zOpdVvj77aY8RlLiQji5OMrngEyaxGogeakTb54uS2FvA6w==", "peerDependencies": { "preact": ">=10" } @@ -6747,16 +6747,16 @@ } }, "node_modules/shiki": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.26.1.tgz", - "integrity": "sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw==", + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.26.2.tgz", + "integrity": "sha512-iP7u2NA9A6JwRRCkIUREEX2cMhlYV5EBmbbSlfSRvPThwca8HBRbVkWuNWW+kw9+i6BSUZqqG6YeUs5dC2SjZw==", "dependencies": { - "@shikijs/core": "1.26.1", - "@shikijs/engine-javascript": "1.26.1", - "@shikijs/engine-oniguruma": "1.26.1", - "@shikijs/langs": "1.26.1", - "@shikijs/themes": "1.26.1", - "@shikijs/types": "1.26.1", + "@shikijs/core": "1.26.2", + "@shikijs/engine-javascript": "1.26.2", + "@shikijs/engine-oniguruma": "1.26.2", + "@shikijs/langs": "1.26.2", + "@shikijs/themes": "1.26.2", + "@shikijs/types": "1.26.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } @@ -7548,9 +7548,9 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index 5e2b21f2c..726350b3b 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "quartz": "./quartz/bootstrap-cli.mjs" }, "dependencies": { - "@clack/prompts": "^0.9.0", - "@floating-ui/dom": "^1.6.12", + "@clack/prompts": "^0.9.1", + "@floating-ui/dom": "^1.6.13", "@myriaddreamin/rehype-typst": "^0.5.4", "@napi-rs/simple-git": "0.1.19", "@tweenjs/tween.js": "^25.0.0", @@ -55,14 +55,14 @@ "hast-util-to-string": "^3.0.1", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", - "lightningcss": "^1.28.2", + "lightningcss": "^1.29.1", "mdast-util-find-and-replace": "^3.0.2", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", "pixi.js": "^8.6.6", "preact": "^10.25.4", - "preact-render-to-string": "^6.5.12", + "preact-render-to-string": "^6.5.13", "pretty-bytes": "^6.1.1", "pretty-time": "^1.1.0", "reading-time": "^1.5.0", @@ -86,7 +86,7 @@ "satori": "^0.12.1", "serve-handler": "^6.1.6", "sharp": "^0.33.5", - "shiki": "^1.26.1", + "shiki": "^1.26.2", "source-map-support": "^0.5.21", "to-vfile": "^8.0.0", "toml": "^3.0.0", @@ -102,7 +102,7 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.10.5", + "@types/node": "^22.10.6", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", "@types/ws": "^8.5.13", @@ -110,6 +110,6 @@ "esbuild": "^0.24.2", "prettier": "^3.4.2", "tsx": "^4.19.2", - "typescript": "^5.7.2" + "typescript": "^5.7.3" } } From 8cf3e3001f2cbd18da73fcc92ae5f4b76d3ecf21 Mon Sep 17 00:00:00 2001 From: "Patsagorn Y." <49602385+ptsgrn@users.noreply.github.com> Date: Fri, 17 Jan 2025 03:44:33 +0700 Subject: [PATCH 085/303] feat(i18n): Thai translations (#1722) --- quartz/i18n/index.ts | 2 + quartz/i18n/locales/th-TH.ts | 82 ++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 quartz/i18n/locales/th-TH.ts diff --git a/quartz/i18n/index.ts b/quartz/i18n/index.ts index 97b0323b8..66200ae07 100644 --- a/quartz/i18n/index.ts +++ b/quartz/i18n/index.ts @@ -22,6 +22,7 @@ import fa from "./locales/fa-IR" import pl from "./locales/pl-PL" import cs from "./locales/cs-CZ" import tr from "./locales/tr-TR" +import th from "./locales/th-TH" export const TRANSLATIONS = { "en-US": enUs, @@ -68,6 +69,7 @@ export const TRANSLATIONS = { "pl-PL": pl, "cs-CZ": cs, "tr-TR": tr, + "th-TH": th, } as const export const defaultTranslation = "en-US" diff --git a/quartz/i18n/locales/th-TH.ts b/quartz/i18n/locales/th-TH.ts new file mode 100644 index 000000000..4ea84868c --- /dev/null +++ b/quartz/i18n/locales/th-TH.ts @@ -0,0 +1,82 @@ +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} รายการในโฟลเดอร์นี้`, + }, + tagContent: { + tag: "แท็ก", + tagIndex: "แท็กทั้งหมด", + itemsUnderTag: ({ count }) => `มี ${count} รายการในแท็กนี้`, + showingFirst: ({ count }) => `แสดง ${count} แท็กแรก`, + totalTags: ({ count }) => `มีทั้งหมด ${count} แท็ก`, + }, + }, +} as const satisfies Translation From 01943ff5a0f546003ed4b3677d8a3a3ba6c7814c Mon Sep 17 00:00:00 2001 From: Mantvydas Deltuva Date: Tue, 21 Jan 2025 07:20:02 +0200 Subject: [PATCH 086/303] feat(i18n): Lithuanian (#1733) --- quartz/i18n/index.ts | 2 + quartz/i18n/locales/lt-LT.ts | 104 +++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 quartz/i18n/locales/lt-LT.ts diff --git a/quartz/i18n/index.ts b/quartz/i18n/index.ts index 66200ae07..7c8996b50 100644 --- a/quartz/i18n/index.ts +++ b/quartz/i18n/index.ts @@ -23,6 +23,7 @@ import pl from "./locales/pl-PL" import cs from "./locales/cs-CZ" import tr from "./locales/tr-TR" import th from "./locales/th-TH" +import lt from "./locales/lt-LT" export const TRANSLATIONS = { "en-US": enUs, @@ -70,6 +71,7 @@ export const TRANSLATIONS = { "cs-CZ": cs, "tr-TR": tr, "th-TH": th, + "lt-LT": lt, } as const export const defaultTranslation = "en-US" diff --git a/quartz/i18n/locales/lt-LT.ts b/quartz/i18n/locales/lt-LT.ts new file mode 100644 index 000000000..d48e593c9 --- /dev/null +++ b/quartz/i18n/locales/lt-LT.ts @@ -0,0 +1,104 @@ +import { Translation } from "./definition" + +export default { + propertyDefaults: { + title: "Be Pavadinimo", + description: "Aprašymas Nepateiktas", + }, + components: { + callout: { + note: "Pastaba", + abstract: "Santrauka", + info: "Informacija", + todo: "Darbų sąrašas", + tip: "Patarimas", + success: "Sėkmingas", + question: "Klausimas", + warning: "Įspėjimas", + failure: "Nesėkmingas", + danger: "Pavojus", + bug: "Klaida", + example: "Pavyzdys", + quote: "Citata", + }, + backlinks: { + title: "Atgalinės Nuorodos", + noBacklinksFound: "Atgalinių Nuorodų Nerasta", + }, + themeToggle: { + lightMode: "Šviesus Režimas", + darkMode: "Tamsus Režimas", + }, + explorer: { + title: "Naršyklė", + }, + footer: { + createdWith: "Sukurta Su", + }, + graph: { + title: "Grafiko Vaizdas", + }, + recentNotes: { + title: "Naujausi Užrašai", + seeRemainingMore: ({ remaining }) => `Peržiūrėti dar ${remaining} →`, + }, + transcludes: { + transcludeOf: ({ targetSlug }) => `Įterpimas iš ${targetSlug}`, + linkToOriginal: "Nuoroda į originalą", + }, + search: { + title: "Paieška", + searchBarPlaceholder: "Ieškoti", + }, + tableOfContents: { + title: "Turinys", + }, + contentMeta: { + readingTime: ({ minutes }) => `${minutes} min skaitymo`, + }, + }, + pages: { + rss: { + recentNotes: "Naujausi užrašai", + lastFewNotes: ({ count }) => + count === 1 + ? "Paskutinis 1 užrašas" + : count < 10 + ? `Paskutiniai ${count} užrašai` + : `Paskutiniai ${count} užrašų`, + }, + error: { + title: "Nerasta", + notFound: + "Arba šis puslapis yra pasiekiamas tik tam tikriems vartotojams, arba tokio puslapio nėra.", + home: "Grįžti į pagrindinį puslapį", + }, + folderContent: { + folder: "Aplankas", + itemsUnderFolder: ({ count }) => + count === 1 + ? "1 elementas šiame aplanke." + : count < 10 + ? `${count} elementai šiame aplanke.` + : `${count} elementų šiame aplanke.`, + }, + tagContent: { + tag: "Žyma", + tagIndex: "Žymų indeksas", + itemsUnderTag: ({ count }) => + count === 1 + ? "1 elementas su šia žyma." + : count < 10 + ? `${count} elementai su šia žyma.` + : `${count} elementų su šia žyma.`, + showingFirst: ({ count }) => + count < 10 ? `Rodomos pirmosios ${count} žymos.` : `Rodomos pirmosios ${count} žymų.`, + totalTags: ({ count }) => + count === 1 + ? "Rasta iš viso 1 žyma." + : count < 10 + ? `Rasta iš viso ${count} žymos.` + : `Rasta iš viso ${count} žymų.`, + }, + }, +} as const satisfies Translation From 4e4930ef9c2e2ddb9bcb1436660d3a3002c19844 Mon Sep 17 00:00:00 2001 From: Anton Bulakh Date: Fri, 24 Jan 2025 05:19:46 +0200 Subject: [PATCH 087/303] chore(styles): omit sass deprecation warnings (#1737) update to newer API --- quartz/styles/base.scss | 35 +++++++++++++++++++---------------- quartz/styles/variables.scss | 10 ++++++---- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 29ddc5aa5..438949108 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -1,3 +1,5 @@ +@use "sass:map"; + @use "./variables.scss" as *; @use "./syntax.scss"; @use "./callouts.scss"; @@ -121,7 +123,7 @@ a { } .page { - max-width: calc(#{map-get($breakpoints, desktop)} + 300px); + max-width: calc(#{map.get($breakpoints, desktop)} + 300px); margin: 0 auto; & article { & > h1 { @@ -151,24 +153,25 @@ a { & > #quartz-body { display: grid; - grid-template-columns: #{map-get($desktopGrid, templateColumns)}; - grid-template-rows: #{map-get($desktopGrid, templateRows)}; - column-gap: #{map-get($desktopGrid, columnGap)}; - row-gap: #{map-get($desktopGrid, rowGap)}; - grid-template-areas: #{map-get($desktopGrid, templateAreas)}; + grid-template-columns: #{map.get($desktopGrid, templateColumns)}; + grid-template-rows: #{map.get($desktopGrid, templateRows)}; + column-gap: #{map.get($desktopGrid, columnGap)}; + row-gap: #{map.get($desktopGrid, rowGap)}; + grid-template-areas: #{map.get($desktopGrid, templateAreas)}; + @media all and ($tablet) { - grid-template-columns: #{map-get($tabletGrid, templateColumns)}; - grid-template-rows: #{map-get($tabletGrid, templateRows)}; - column-gap: #{map-get($tabletGrid, columnGap)}; - row-gap: #{map-get($tabletGrid, rowGap)}; - grid-template-areas: #{map-get($tabletGrid, templateAreas)}; + grid-template-columns: #{map.get($tabletGrid, templateColumns)}; + grid-template-rows: #{map.get($tabletGrid, templateRows)}; + column-gap: #{map.get($tabletGrid, columnGap)}; + row-gap: #{map.get($tabletGrid, rowGap)}; + grid-template-areas: #{map.get($tabletGrid, templateAreas)}; } @media all and ($mobile) { - grid-template-columns: #{map-get($mobileGrid, templateColumns)}; - grid-template-rows: #{map-get($mobileGrid, templateRows)}; - column-gap: #{map-get($mobileGrid, columnGap)}; - row-gap: #{map-get($mobileGrid, rowGap)}; - grid-template-areas: #{map-get($mobileGrid, templateAreas)}; + grid-template-columns: #{map.get($mobileGrid, templateColumns)}; + grid-template-rows: #{map.get($mobileGrid, templateRows)}; + column-gap: #{map.get($mobileGrid, columnGap)}; + row-gap: #{map.get($mobileGrid, rowGap)}; + grid-template-areas: #{map.get($mobileGrid, templateAreas)}; } @media all and not ($desktop) { diff --git a/quartz/styles/variables.scss b/quartz/styles/variables.scss index 4a5cea583..f61adfcdd 100644 --- a/quartz/styles/variables.scss +++ b/quartz/styles/variables.scss @@ -1,3 +1,5 @@ +@use "sass:map"; + /** * Layout breakpoints * $mobile: screen width below this value will use mobile styles @@ -10,11 +12,11 @@ $breakpoints: ( desktop: 1200px, ); -$mobile: "(max-width: #{map-get($breakpoints, mobile)})"; -$tablet: "(min-width: #{map-get($breakpoints, mobile)}) and (max-width: #{map-get($breakpoints, desktop)})"; -$desktop: "(min-width: #{map-get($breakpoints, desktop)})"; +$mobile: "(max-width: #{map.get($breakpoints, mobile)})"; +$tablet: "(min-width: #{map.get($breakpoints, mobile)}) and (max-width: #{map.get($breakpoints, desktop)})"; +$desktop: "(min-width: #{map.get($breakpoints, desktop)})"; -$pageWidth: #{map-get($breakpoints, mobile)}; +$pageWidth: #{map.get($breakpoints, mobile)}; $sidePanelWidth: 320px; //380px; $topSpacing: 6rem; $boldWeight: 700; From 7be47742a6dc86f22d148ca9d304f7a9eea318cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 06:46:45 -0500 Subject: [PATCH 088/303] chore(deps): bump the production-dependencies group across 1 directory with 3 updates (#1744) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 27 +++++++++++++++------------ package.json | 6 +++--- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30d740c21..d84ab5bc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", - "pixi.js": "^8.6.6", + "pixi.js": "^8.7.3", "preact": "^10.25.4", "preact-render-to-string": "^6.5.13", "pretty-bytes": "^6.1.1", @@ -79,10 +79,10 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.10.6", + "@types/node": "^22.12.0", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", - "@types/ws": "^8.5.13", + "@types/ws": "^8.5.14", "@types/yargs": "^17.0.33", "esbuild": "^0.24.2", "prettier": "^3.4.2", @@ -1914,10 +1914,11 @@ } }, "node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", + "version": "22.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.20.0" } @@ -1943,10 +1944,11 @@ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -5583,9 +5585,10 @@ } }, "node_modules/pixi.js": { - "version": "8.6.6", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.6.6.tgz", - "integrity": "sha512-o5pw7G2yuIrnBx0G4npBlmFp+XGNcapI/Ufs62rRj/4XKxc1Zo74YJr/BtEXcXTraTKd+pQvYOLvnfxRjxBMvQ==", + "version": "8.7.3", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.7.3.tgz", + "integrity": "sha512-wfWlhJYnGx1s4f2yoouevQjaeacbJ12LTkJGa+n9AIYNIjOnmJylBtZ2mARX7iFk3mr2xv0wuo//XPe2hk5OBw==", + "license": "MIT", "dependencies": { "@pixi/colord": "^2.9.6", "@types/css-font-loading-module": "^0.0.12", diff --git a/package.json b/package.json index 726350b3b..192a8abcc 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", - "pixi.js": "^8.6.6", + "pixi.js": "^8.7.3", "preact": "^10.25.4", "preact-render-to-string": "^6.5.13", "pretty-bytes": "^6.1.1", @@ -102,10 +102,10 @@ "@types/d3": "^7.4.3", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", - "@types/node": "^22.10.6", + "@types/node": "^22.12.0", "@types/pretty-time": "^1.1.5", "@types/source-map-support": "^0.5.10", - "@types/ws": "^8.5.13", + "@types/ws": "^8.5.14", "@types/yargs": "^17.0.33", "esbuild": "^0.24.2", "prettier": "^3.4.2", From fbc45548f7ee80715ec74d8c249c662a26f7feae Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Sat, 1 Feb 2025 16:22:29 -0500 Subject: [PATCH 089/303] feat(graph): enable radial mode (#1738) --- docs/features/graph view.md | 2 ++ quartz/components/Graph.tsx | 5 ++++- quartz/components/scripts/graph.inline.ts | 11 +++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/features/graph view.md b/docs/features/graph view.md index 4f905c78d..19f086286 100644 --- a/docs/features/graph view.md +++ b/docs/features/graph view.md @@ -36,6 +36,7 @@ Component.Graph({ opacityScale: 1, // how quickly do we fade out the labels when zooming out? removeTags: [], // what tags to remove from the graph showTags: true, // whether to show tags in the graph + enableRadial: false, // whether to constrain the graph, similar to Obsidian }, globalGraph: { drag: true, @@ -49,6 +50,7 @@ Component.Graph({ opacityScale: 1, removeTags: [], // what tags to remove from the graph showTags: true, // whether to show tags in the graph + enableRadial: true, // whether to constrain the graph, similar to Obsidian }, }) ``` diff --git a/quartz/components/Graph.tsx b/quartz/components/Graph.tsx index ec3475d1e..e8b462da0 100644 --- a/quartz/components/Graph.tsx +++ b/quartz/components/Graph.tsx @@ -18,6 +18,7 @@ export interface D3Config { removeTags: string[] showTags: boolean focusOnHover?: boolean + enableRadial?: boolean } interface GraphOptions { @@ -39,6 +40,7 @@ const defaultOptions: GraphOptions = { showTags: true, removeTags: [], focusOnHover: false, + enableRadial: false, }, globalGraph: { drag: true, @@ -53,10 +55,11 @@ const defaultOptions: GraphOptions = { showTags: true, removeTags: [], focusOnHover: true, + enableRadial: true, }, } -export default ((opts?: GraphOptions) => { +export default ((opts?: Partial) => { const Graph: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => { const localGraph = { ...defaultOptions.localGraph, ...opts?.localGraph } const globalGraph = { ...defaultOptions.globalGraph, ...opts?.globalGraph } diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts index dbddae91f..16ee33f64 100644 --- a/quartz/components/scripts/graph.inline.ts +++ b/quartz/components/scripts/graph.inline.ts @@ -8,6 +8,7 @@ import { forceCenter, forceLink, forceCollide, + forceRadial, zoomIdentity, select, drag, @@ -87,6 +88,7 @@ async function renderGraph(container: string, fullSlug: FullSlug) { removeTags, showTags, focusOnHover, + enableRadial, } = JSON.parse(graph.dataset["cfg"]!) as D3Config const data: Map = new Map( @@ -161,15 +163,20 @@ async function renderGraph(container: string, fullSlug: FullSlug) { })), } + const width = graph.offsetWidth + const height = Math.max(graph.offsetHeight, 250) + // we virtualize the simulation and use pixi to actually render it + // Calculate the radius of the container circle + const radius = Math.min(width, height) / 2 - 40 // 40px padding const simulation: Simulation = forceSimulation(graphData.nodes) .force("charge", forceManyBody().strength(-100 * repelForce)) .force("center", forceCenter().strength(centerForce)) .force("link", forceLink(graphData.links).distance(linkDistance)) .force("collide", forceCollide((n) => nodeRadius(n)).iterations(3)) - const width = graph.offsetWidth - const height = Math.max(graph.offsetHeight, 250) + if (enableRadial) + simulation.force("radial", forceRadial(radius * 0.8, width / 2, height / 2).strength(0.3)) // precompute style prop strings as pixi doesn't support css variables const cssVars = [ From 91189dfd2f4cb32e205117b327e0ae7a0c2dd716 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Mon, 3 Feb 2025 15:25:42 +0100 Subject: [PATCH 090/303] feat(explorer): collapsible mobile explorer (#1471) Co-authored-by: Aaron Pham --- quartz.layout.ts | 4 +- quartz/components/Explorer.tsx | 38 ++++- quartz/components/scripts/explorer.inline.ts | 155 ++++++++++++++----- quartz/components/styles/explorer.scss | 150 +++++++++++++++++- 4 files changed, 296 insertions(+), 51 deletions(-) diff --git a/quartz.layout.ts b/quartz.layout.ts index 4a78256aa..f45da0c92 100644 --- a/quartz.layout.ts +++ b/quartz.layout.ts @@ -27,7 +27,7 @@ export const defaultContentPageLayout: PageLayout = { Component.MobileOnly(Component.Spacer()), Component.Search(), Component.Darkmode(), - Component.DesktopOnly(Component.Explorer()), + Component.Explorer(), ], right: [ Component.Graph(), @@ -44,7 +44,7 @@ export const defaultListPageLayout: PageLayout = { Component.MobileOnly(Component.Spacer()), Component.Search(), Component.Darkmode(), - Component.DesktopOnly(Component.Explorer()), + Component.Explorer(), ], right: [], } diff --git a/quartz/components/Explorer.tsx b/quartz/components/Explorer.tsx index ec7c48ef7..ac276a8bc 100644 --- a/quartz/components/Explorer.tsx +++ b/quartz/components/Explorer.tsx @@ -1,5 +1,5 @@ import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" -import explorerStyle from "./styles/explorer.scss" +import style from "./styles/explorer.scss" // @ts-ignore import script from "./scripts/explorer.inline" @@ -83,18 +83,46 @@ export default ((userOpts?: Partial) => { lastBuildId = ctx.buildId constructFileTree(allFiles) } - return (
    +
    ) } From c97fd7089ad372537114ab469f1f9d6e95e5237a Mon Sep 17 00:00:00 2001 From: Stephen Tse Date: Thu, 6 Mar 2025 09:14:06 +0800 Subject: [PATCH 111/303] Added emoji support to Satori when generating OG images (#1593) --- quartz/components/Head.tsx | 17 +++++++++- quartz/util/emoji.ts | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 quartz/util/emoji.ts diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index 983dc50a5..1aa8cbe00 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -4,6 +4,7 @@ import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/re import { googleFontHref } from "../util/theme" import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" import satori, { SatoriOptions } from "satori" +import { loadEmoji, getIconCode } from "../util/emoji" import fs from "fs" import sharp from "sharp" import { ImageOptions, SocialImageOptions, getSatoriFont, defaultImage } from "../util/og" @@ -24,7 +25,21 @@ async function generateSocialImage( // JSX that will be used to generate satori svg const imageComponent = userOpts.imageStructure(cfg, userOpts, title, description, fonts, fileData) - const svg = await satori(imageComponent, { width, height, fonts }) + const svg = await satori(imageComponent, { + width, + height, + fonts, + // `code` will be the detected language code, `emoji` if it's an Emoji, or `unknown` if not able to tell. + // `segment` will be the content to render. + loadAdditionalAsset: async (code: string, segment: string) => { + if (code === "emoji") { + // if segment is an emoji, load the image. + return `data:image/svg+xml;base64,${btoa(await loadEmoji("twemoji", getIconCode(segment)))}` + } + // if segment is normal text + return code + }, + }) // Convert svg directly to webp (with additional compression) const compressed = await sharp(Buffer.from(svg)).webp({ quality: 40 }).toBuffer() diff --git a/quartz/util/emoji.ts b/quartz/util/emoji.ts new file mode 100644 index 000000000..231294348 --- /dev/null +++ b/quartz/util/emoji.ts @@ -0,0 +1,66 @@ +/** + * Modified version of https://unpkg.com/twemoji@13.1.0/dist/twemoji.esm.js. + * Ported from https://github.com/vercel/satori/blob/48aea6f812365959c2888a25261c72ce17992c6d/playground/utils/twemoji.ts. + */ + +/*! Copyright Twitter Inc. and other contributors. Licensed under MIT */ + +const U200D = String.fromCharCode(8205) +const UFE0Fg = /\uFE0F/g + +export function getIconCode(char: string) { + return toCodePoint(char.indexOf(U200D) < 0 ? char.replace(UFE0Fg, "") : char) +} + +function toCodePoint(unicodeSurrogates: string) { + const r = [] + let c = 0, + p = 0, + i = 0 + + while (i < unicodeSurrogates.length) { + c = unicodeSurrogates.charCodeAt(i++) + if (p) { + r.push((65536 + ((p - 55296) << 10) + (c - 56320)).toString(16)) + p = 0 + } else if (55296 <= c && c <= 56319) { + p = c + } else { + r.push(c.toString(16)) + } + } + return r.join("-") +} + +export const apis = { + twemoji: (code: string) => + "https://cdnjs.cloudflare.com/ajax/libs/twemoji/15.1.0/svg/" + code.toLowerCase() + ".svg", + openmoji: "https://cdn.jsdelivr.net/npm/@svgmoji/openmoji@3.2.0/svg/", + blobmoji: "https://cdn.jsdelivr.net/npm/@svgmoji/blob@3.2.0/svg/", + noto: "https://cdn.jsdelivr.net/gh/svgmoji/svgmoji/packages/svgmoji__noto/svg/", + fluent: (code: string) => + "https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/" + + code.toLowerCase() + + "_color.svg", + fluentFlat: (code: string) => + "https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/" + + code.toLowerCase() + + "_flat.svg", +} + +const emojiCache: Record> = {} + +export function loadEmoji(type: keyof typeof apis, code: string) { + const key = type + ":" + code + if (key in emojiCache) return emojiCache[key] + + if (!type || !apis[type]) { + type = "twemoji" + } + + const api = apis[type] + if (typeof api === "function") { + return (emojiCache[key] = fetch(api(code)).then((r) => r.text())) + } + return (emojiCache[key] = fetch(`${api}${code.toUpperCase()}.svg`).then((r) => r.text())) +} From 3c8ccde62431321c4ad35093a780a1585fd424dc Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 5 Mar 2025 17:21:19 -0800 Subject: [PATCH 112/303] chore(og-image): force twemoji for emoji util --- quartz/components/Head.tsx | 13 +++++-------- quartz/util/emoji.ts | 38 +++++--------------------------------- 2 files changed, 10 insertions(+), 41 deletions(-) diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index 1aa8cbe00..a1fb0f63c 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -29,15 +29,12 @@ async function generateSocialImage( width, height, fonts, - // `code` will be the detected language code, `emoji` if it's an Emoji, or `unknown` if not able to tell. - // `segment` will be the content to render. - loadAdditionalAsset: async (code: string, segment: string) => { - if (code === "emoji") { - // if segment is an emoji, load the image. - return `data:image/svg+xml;base64,${btoa(await loadEmoji("twemoji", getIconCode(segment)))}` + loadAdditionalAsset: async (languageCode: string, segment: string) => { + if (languageCode === "emoji") { + return `data:image/svg+xml;base64,${btoa(await loadEmoji(getIconCode(segment)))}` } - // if segment is normal text - return code + + return languageCode }, }) diff --git a/quartz/util/emoji.ts b/quartz/util/emoji.ts index 231294348..e38618d1d 100644 --- a/quartz/util/emoji.ts +++ b/quartz/util/emoji.ts @@ -1,10 +1,3 @@ -/** - * Modified version of https://unpkg.com/twemoji@13.1.0/dist/twemoji.esm.js. - * Ported from https://github.com/vercel/satori/blob/48aea6f812365959c2888a25261c72ce17992c6d/playground/utils/twemoji.ts. - */ - -/*! Copyright Twitter Inc. and other contributors. Licensed under MIT */ - const U200D = String.fromCharCode(8205) const UFE0Fg = /\uFE0F/g @@ -32,35 +25,14 @@ function toCodePoint(unicodeSurrogates: string) { return r.join("-") } -export const apis = { - twemoji: (code: string) => - "https://cdnjs.cloudflare.com/ajax/libs/twemoji/15.1.0/svg/" + code.toLowerCase() + ".svg", - openmoji: "https://cdn.jsdelivr.net/npm/@svgmoji/openmoji@3.2.0/svg/", - blobmoji: "https://cdn.jsdelivr.net/npm/@svgmoji/blob@3.2.0/svg/", - noto: "https://cdn.jsdelivr.net/gh/svgmoji/svgmoji/packages/svgmoji__noto/svg/", - fluent: (code: string) => - "https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/" + - code.toLowerCase() + - "_color.svg", - fluentFlat: (code: string) => - "https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/" + - code.toLowerCase() + - "_flat.svg", -} - +const twemoji = (code: string) => + `https://cdnjs.cloudflare.com/ajax/libs/twemoji/15.1.0/svg/${code.toLowerCase()}.svg` const emojiCache: Record> = {} -export function loadEmoji(type: keyof typeof apis, code: string) { +export function loadEmoji(code: string) { + const type = "twemoji" const key = type + ":" + code if (key in emojiCache) return emojiCache[key] - if (!type || !apis[type]) { - type = "twemoji" - } - - const api = apis[type] - if (typeof api === "function") { - return (emojiCache[key] = fetch(api(code)).then((r) => r.text())) - } - return (emojiCache[key] = fetch(`${api}${code.toUpperCase()}.svg`).then((r) => r.text())) + return (emojiCache[key] = fetch(twemoji(code)).then((r) => r.text())) } From 5a39719898fe486994750ec24fa430f332fa67eb Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Wed, 5 Mar 2025 20:33:16 -0500 Subject: [PATCH 113/303] fix(graph): set container as renderGroup to avoid redrawing multiple times (#1736) Signed-off-by: Aaron Pham --- quartz/components/scripts/graph.inline.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts index 16ee33f64..83424607b 100644 --- a/quartz/components/scripts/graph.inline.ts +++ b/quartz/components/scripts/graph.inline.ts @@ -370,9 +370,9 @@ async function renderGraph(container: string, fullSlug: FullSlug) { const stage = app.stage stage.interactive = false - const labelsContainer = new Container({ zIndex: 3 }) - const nodesContainer = new Container({ zIndex: 2 }) - const linkContainer = new Container({ zIndex: 1 }) + const labelsContainer = new Container({ zIndex: 3, isRenderGroup: true }) + const nodesContainer = new Container({ zIndex: 2, isRenderGroup: true }) + const linkContainer = new Container({ zIndex: 1, isRenderGroup: true }) stage.addChild(nodesContainer, labelsContainer, linkContainer) for (const n of graphData.nodes) { From 5b13ff21992a61eb8b03670ae1742a72703c2afe Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 5 Mar 2025 18:16:17 -0800 Subject: [PATCH 114/303] feat: support emitters defining external resources, emit link from contentindex directly --- docs/advanced/making plugins.md | 2 -- quartz/components/Head.tsx | 11 +++++++++-- quartz/components/renderPage.tsx | 1 + .../emitters/{contentIndex.ts => contentIndex.tsx} | 14 ++++++++++++++ quartz/plugins/index.ts | 6 +++++- quartz/plugins/transformers/latex.ts | 2 -- quartz/plugins/types.ts | 4 +++- quartz/util/resources.tsx | 2 ++ 8 files changed, 34 insertions(+), 8 deletions(-) rename quartz/plugins/emitters/{contentIndex.ts => contentIndex.tsx} (94%) diff --git a/docs/advanced/making plugins.md b/docs/advanced/making plugins.md index 3042737a2..8ed533f88 100644 --- a/docs/advanced/making plugins.md +++ b/docs/advanced/making plugins.md @@ -99,8 +99,6 @@ export const Latex: QuartzTransformerPlugin = (opts?: Options) => { }, ], } - } else { - return {} } }, } diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index a1fb0f63c..09156c9ee 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -127,7 +127,7 @@ export default (() => { } } - const { css, js } = externalResources + const { css, js, additionalHead } = externalResources const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) const path = url.pathname as FullSlug @@ -177,7 +177,7 @@ export default (() => { )} - + {/* OG/Twitter meta tags */} @@ -213,6 +213,13 @@ export default (() => { {js .filter((resource) => resource.loadTime === "beforeDOMReady") .map((res) => JSResourceToScriptElement(res, true))} + {additionalHead.map((resource) => { + if (typeof resource === "function") { + return resource(fileData) + } else { + return resource + } + })} ) } diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index 3914411ac..9cebaa849 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -54,6 +54,7 @@ export function pageResources( }, ...staticResources.js, ], + additionalHead: staticResources.additionalHead, } if (fileData.hasMermaidDiagram) { diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.tsx similarity index 94% rename from quartz/plugins/emitters/contentIndex.ts rename to quartz/plugins/emitters/contentIndex.tsx index 5d76e087b..bd609b411 100644 --- a/quartz/plugins/emitters/contentIndex.ts +++ b/quartz/plugins/emitters/contentIndex.tsx @@ -182,6 +182,20 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => { return emitted }, + externalResources: (ctx) => { + if (opts?.enableRSS) { + return { + additionalHead: [ + , + ], + } + } + }, getQuartzComponents: () => [], } } diff --git a/quartz/plugins/index.ts b/quartz/plugins/index.ts index df9fd1d24..c41157c2b 100644 --- a/quartz/plugins/index.ts +++ b/quartz/plugins/index.ts @@ -6,9 +6,10 @@ export function getStaticResourcesFromPlugins(ctx: BuildCtx) { const staticResources: StaticResources = { css: [], js: [], + additionalHead: [], } - for (const transformer of ctx.cfg.plugins.transformers) { + for (const transformer of [...ctx.cfg.plugins.transformers, ...ctx.cfg.plugins.emitters]) { const res = transformer.externalResources ? transformer.externalResources(ctx) : {} if (res?.js) { staticResources.js.push(...res.js) @@ -16,6 +17,9 @@ export function getStaticResourcesFromPlugins(ctx: BuildCtx) { if (res?.css) { staticResources.css.push(...res.css) } + if (res?.additionalHead) { + staticResources.additionalHead.push(...res.additionalHead) + } } // if serving locally, listen for rebuilds and reload the page diff --git a/quartz/plugins/transformers/latex.ts b/quartz/plugins/transformers/latex.ts index 26913bac3..40939d5e9 100644 --- a/quartz/plugins/transformers/latex.ts +++ b/quartz/plugins/transformers/latex.ts @@ -59,8 +59,6 @@ export const Latex: QuartzTransformerPlugin> = (opts) => { }, ], } - default: - return { css: [], js: [] } } }, } diff --git a/quartz/plugins/types.ts b/quartz/plugins/types.ts index 667799f4b..283a9999c 100644 --- a/quartz/plugins/types.ts +++ b/quartz/plugins/types.ts @@ -13,6 +13,7 @@ export interface PluginTypes { } type OptionType = object | undefined +type ExternalResourcesFn = (ctx: BuildCtx) => Partial | undefined export type QuartzTransformerPlugin = ( opts?: Options, ) => QuartzTransformerPluginInstance @@ -21,7 +22,7 @@ export type QuartzTransformerPluginInstance = { textTransform?: (ctx: BuildCtx, src: string) => string markdownPlugins?: (ctx: BuildCtx) => PluggableList htmlPlugins?: (ctx: BuildCtx) => PluggableList - externalResources?: (ctx: BuildCtx) => Partial + externalResources?: ExternalResourcesFn } export type QuartzFilterPlugin = ( @@ -44,4 +45,5 @@ export type QuartzEmitterPluginInstance = { content: ProcessedContent[], resources: StaticResources, ): Promise> + externalResources?: ExternalResourcesFn } diff --git a/quartz/util/resources.tsx b/quartz/util/resources.tsx index 72ae9e63e..2ec856191 100644 --- a/quartz/util/resources.tsx +++ b/quartz/util/resources.tsx @@ -1,5 +1,6 @@ import { randomUUID } from "crypto" import { JSX } from "preact/jsx-runtime" +import { QuartzPluginData } from "../plugins/vfile" export type JSResource = { loadTime: "beforeDOMReady" | "afterDOMReady" @@ -62,4 +63,5 @@ export function CSSResourceToStyleElement(resource: CSSResource, preserve?: bool export interface StaticResources { css: CSSResource[] js: JSResource[] + additionalHead: (JSX.Element | ((pageData: QuartzPluginData) => JSX.Element))[] } From 2213424195b6ba761a6bf3343afca43b102d06b3 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 5 Mar 2025 18:34:02 -0800 Subject: [PATCH 115/303] docs: make role of getQuartzComponents more clear and also make it optional --- quartz/plugins/emitters/aliases.ts | 4 ---- quartz/plugins/emitters/assets.ts | 3 --- quartz/plugins/emitters/cname.ts | 3 --- quartz/plugins/emitters/componentResources.ts | 5 +---- quartz/plugins/emitters/contentIndex.tsx | 1 - quartz/plugins/emitters/static.ts | 3 --- quartz/plugins/types.ts | 7 ++++++- 7 files changed, 7 insertions(+), 19 deletions(-) diff --git a/quartz/plugins/emitters/aliases.ts b/quartz/plugins/emitters/aliases.ts index b5bfff061..9d12a990c 100644 --- a/quartz/plugins/emitters/aliases.ts +++ b/quartz/plugins/emitters/aliases.ts @@ -6,9 +6,6 @@ import { getAliasSlugs } from "../transformers/frontmatter" export const AliasRedirects: QuartzEmitterPlugin = () => ({ name: "AliasRedirects", - getQuartzComponents() { - return [] - }, async getDependencyGraph(ctx, content, _resources) { const graph = new DepGraph() @@ -22,7 +19,6 @@ export const AliasRedirects: QuartzEmitterPlugin = () => ({ return graph }, async emit(ctx, content, _resources): Promise { - const { argv } = ctx const fps: FilePath[] = [] for (const [_tree, file] of content) { diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts index 036b27da4..bb85080c4 100644 --- a/quartz/plugins/emitters/assets.ts +++ b/quartz/plugins/emitters/assets.ts @@ -15,9 +15,6 @@ const filesToCopy = async (argv: Argv, cfg: QuartzConfig) => { export const Assets: QuartzEmitterPlugin = () => { return { name: "Assets", - getQuartzComponents() { - return [] - }, async getDependencyGraph(ctx, _content, _resources) { const { argv, cfg } = ctx const graph = new DepGraph() diff --git a/quartz/plugins/emitters/cname.ts b/quartz/plugins/emitters/cname.ts index cbed2a8b4..380212dd4 100644 --- a/quartz/plugins/emitters/cname.ts +++ b/quartz/plugins/emitters/cname.ts @@ -11,9 +11,6 @@ export function extractDomainFromBaseUrl(baseUrl: string) { export const CNAME: QuartzEmitterPlugin = () => ({ name: "CNAME", - getQuartzComponents() { - return [] - }, async getDependencyGraph(_ctx, _content, _resources) { return new DepGraph() }, diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index b307aad41..6c1e3d0b6 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -24,7 +24,7 @@ type ComponentResources = { function getComponentResources(ctx: BuildCtx): ComponentResources { const allComponents: Set = new Set() for (const emitter of ctx.cfg.plugins.emitters) { - const components = emitter.getQuartzComponents(ctx) + const components = emitter.getQuartzComponents?.(ctx) ?? [] for (const component of components) { allComponents.add(component) } @@ -200,9 +200,6 @@ function addGlobalPageResources(ctx: BuildCtx, componentResources: ComponentReso export const ComponentResources: QuartzEmitterPlugin = () => { return { name: "ComponentResources", - getQuartzComponents() { - return [] - }, async getDependencyGraph(_ctx, _content, _resources) { return new DepGraph() }, diff --git a/quartz/plugins/emitters/contentIndex.tsx b/quartz/plugins/emitters/contentIndex.tsx index bd609b411..2810039fa 100644 --- a/quartz/plugins/emitters/contentIndex.tsx +++ b/quartz/plugins/emitters/contentIndex.tsx @@ -196,6 +196,5 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => { } } }, - getQuartzComponents: () => [], } } diff --git a/quartz/plugins/emitters/static.ts b/quartz/plugins/emitters/static.ts index c52c62879..5545d2ccb 100644 --- a/quartz/plugins/emitters/static.ts +++ b/quartz/plugins/emitters/static.ts @@ -6,9 +6,6 @@ import DepGraph from "../../depgraph" export const Static: QuartzEmitterPlugin = () => ({ name: "Static", - getQuartzComponents() { - return [] - }, async getDependencyGraph({ argv, cfg }, _content, _resources) { const graph = new DepGraph() diff --git a/quartz/plugins/types.ts b/quartz/plugins/types.ts index 283a9999c..e7cfb479f 100644 --- a/quartz/plugins/types.ts +++ b/quartz/plugins/types.ts @@ -39,7 +39,12 @@ export type QuartzEmitterPlugin = ( export type QuartzEmitterPluginInstance = { name: string emit(ctx: BuildCtx, content: ProcessedContent[], resources: StaticResources): Promise - getQuartzComponents(ctx: BuildCtx): QuartzComponent[] + /** + * Returns the components (if any) that are used in rendering the page. + * This helps Quartz optimize the page by only including necessary resources + * for components that are actually used. + */ + getQuartzComponents?: (ctx: BuildCtx) => QuartzComponent[] getDependencyGraph?( ctx: BuildCtx, content: ProcessedContent[], From 6d195fd40a48fe275dc910f7a115e5b2f3c1c056 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 6 Mar 2025 09:21:50 -0800 Subject: [PATCH 116/303] feat: font specification flexibility --- quartz/components/Head.tsx | 6 ++-- quartz/util/theme.ts | 61 +++++++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index 09156c9ee..b6a7e8d07 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -1,7 +1,7 @@ import { i18n } from "../i18n" import { FullSlug, joinSegments, pathToRoot } from "../util/path" import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/resources" -import { googleFontHref } from "../util/theme" +import { getFontSpecificationName, googleFontHref } from "../util/theme" import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" import satori, { SatoriOptions } from "satori" import { loadEmoji, getIconCode } from "../util/emoji" @@ -77,7 +77,9 @@ export default (() => { // Memoize google fonts if (!fontsPromise && cfg.generateSocialImages) { - fontsPromise = getSatoriFont(cfg.theme.typography.header, cfg.theme.typography.body) + const headerFont = getFontSpecificationName(cfg.theme.typography.header) + const bodyFont = getFontSpecificationName(cfg.theme.typography.body) + fontsPromise = getSatoriFont(headerFont, bodyFont) } const slug = fileData.filePath diff --git a/quartz/util/theme.ts b/quartz/util/theme.ts index 0c903066f..06ddd8c43 100644 --- a/quartz/util/theme.ts +++ b/quartz/util/theme.ts @@ -15,11 +15,19 @@ interface Colors { darkMode: ColorScheme } +type FontSpecification = + | string + | { + name: string + weights?: number[] + includeItalic?: boolean + } + export interface Theme { typography: { - header: string - body: string - code: string + header: FontSpecification + body: FontSpecification + code: FontSpecification } cdnCaching: boolean colors: Colors @@ -32,9 +40,54 @@ const DEFAULT_SANS_SERIF = 'system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"' const DEFAULT_MONO = "ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace" +export function getFontSpecificationName(spec: FontSpecification): string { + if (typeof spec === "string") { + return spec + } + + return spec.name +} + +function formatFontSpecification(type: "header" | "body" | "code", spec: FontSpecification) { + if (typeof spec === "string") { + spec = { name: spec } + } + + const defaultIncludeWeights = type === "header" ? [400, 700] : [400, 600] + const defaultIncludeItalic = type === "body" + const weights = spec.weights ?? defaultIncludeWeights + const italic = spec.includeItalic ?? defaultIncludeItalic + + const features: string[] = [] + if (italic) { + features.push("ital") + } + + if (weights.length > 1) { + const weightSpec = italic + ? weights + .flatMap((w) => [`0,${w}`, `1,${w}`]) + .sort() + .join(";") + : weights.join(";") + + features.push(`wght@${weightSpec}`) + } + + if (features.length > 0) { + return `${spec.name}:${features.join(",")}` + } + + return spec.name +} + export function googleFontHref(theme: Theme) { const { code, header, body } = theme.typography - return `https://fonts.googleapis.com/css2?family=${code}&family=${header}:wght@400;700&family=${body}:ital,wght@0,400;0,600;1,400;1,600&display=swap` + const headerFont = formatFontSpecification("header", header) + const bodyFont = formatFontSpecification("body", body) + const codeFont = formatFontSpecification("code", code) + + return `https://fonts.googleapis.com/css2?family=${bodyFont}&family=${headerFont}&family=${codeFont}&display=swap` } export function joinStyles(theme: Theme, ...stylesheet: string[]) { From cc9704becc78d9ab15abda165799b3c773f2ca2b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 6 Mar 2025 09:41:26 -0800 Subject: [PATCH 117/303] chore(deps): bump deps, silence internal punycode deprecation --- package-lock.json | 15 ++++++++------- quartz/bootstrap-cli.mjs | 2 +- quartz/plugins/emitters/contentPage.tsx | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ca894a08..66d4898a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,7 +90,7 @@ "typescript": "^5.8.2" }, "engines": { - "node": "20 || >=22", + "node": ">=20", "npm": ">=9.3.1" } }, @@ -2385,9 +2385,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3955,9 +3956,9 @@ } }, "node_modules/katex": { - "version": "0.16.11", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", - "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", + "version": "0.16.21", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", + "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 35d06af77..69b5aa157 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -1,4 +1,4 @@ -#!/usr/bin/env node +#!/usr/bin/env node --no-deprecation import yargs from "yargs" import { hideBin } from "yargs/helpers" import { diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx index 8788f331d..f59ff6bf5 100644 --- a/quartz/plugins/emitters/contentPage.tsx +++ b/quartz/plugins/emitters/contentPage.tsx @@ -131,7 +131,7 @@ export const ContentPage: QuartzEmitterPlugin> = (userOp if (!containsIndex && !ctx.argv.fastRebuild) { console.log( chalk.yellow( - `\nWarning: you seem to be missing an \`index.md\` home page file at the root of your \`${ctx.argv.directory}\` folder. This may cause errors when deploying.`, + `\nWarning: you seem to be missing an \`index.md\` home page file at the root of your \`${ctx.argv.directory}\` folder (\`${path.join(ctx.argv.directory, "index.md")} does not exist\`). This may cause errors when deploying.`, ), ) } From a201105442c3603a34cb609b70cef71072e71392 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 6 Mar 2025 10:01:25 -0800 Subject: [PATCH 118/303] fix(docker): instructions + bump deps + bind mount (#1809) * fix docker * test with docs folder --- .github/workflows/ci.yaml | 2 +- Dockerfile | 4 ++-- docs/features/Docker Support.md | 2 +- quartz/bootstrap-cli.mjs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f0fc1fd18..2387e7a5e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -45,7 +45,7 @@ jobs: run: npm test - name: Ensure Quartz builds, check bundle info - run: npx quartz build --bundleInfo + run: npx quartz build --bundleInfo -d docs publish-tag: if: ${{ github.repository == 'jackyzha0/quartz' && github.ref == 'refs/heads/v4' }} diff --git a/Dockerfile b/Dockerfile index 4493853e2..f8a6f2684 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ -FROM node:20-slim AS builder +FROM node:22-slim AS builder WORKDIR /usr/src/app COPY package.json . COPY package-lock.json* . RUN npm ci -FROM node:20-slim +FROM node:22-slim WORKDIR /usr/src/app COPY --from=builder /usr/src/app/ /usr/src/app/ COPY . . diff --git a/docs/features/Docker Support.md b/docs/features/Docker Support.md index cf73b7fcc..a31fb5b45 100644 --- a/docs/features/Docker Support.md +++ b/docs/features/Docker Support.md @@ -3,5 +3,5 @@ Quartz comes shipped with a Docker image that will allow you to preview your Qua You can run the below one-liner to run Quartz in Docker. ```sh -docker run --rm -itp 8080:8080 $(docker build -q .) +docker run --rm -itp 8080:8080 -p 3001:3001 -v ./content:/usr/src/app/content $(docker build -q .) ``` diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 69b5aa157..8b0b9268f 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -1,4 +1,4 @@ -#!/usr/bin/env node --no-deprecation +#!/usr/bin/env -S node --no-deprecation import yargs from "yargs" import { hideBin } from "yargs/helpers" import { From 5480269d38ffaff7ffd6576d9a9407430429fb2d Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 9 Mar 2025 14:58:26 -0700 Subject: [PATCH 119/303] perf(explorer): client side explorer (#1810) * start work on client side explorer * fix tests * fmt * generic test flag * add prenav hook * add highlight class * make flex more consistent, remove transition * open folders that are prefixes of current path * make mobile look nice * more style fixes --- docs/advanced/creating components.md | 12 + index.d.ts | 1 + package.json | 2 +- quartz.config.ts | 2 +- quartz/components/Backlinks.tsx | 6 +- quartz/components/Explorer.tsx | 152 +++---- quartz/components/ExplorerNode.tsx | 242 ----------- quartz/components/OverflowList.tsx | 39 ++ quartz/components/TableOfContents.tsx | 7 +- quartz/components/renderPage.tsx | 3 +- quartz/components/scripts/explorer.inline.ts | 407 +++++++++++-------- quartz/components/scripts/spa.inline.ts | 6 +- quartz/components/scripts/toc.inline.ts | 2 - quartz/components/scripts/util.ts | 1 + quartz/components/styles/backlinks.scss | 22 - quartz/components/styles/darkmode.scss | 1 + quartz/components/styles/explorer.scss | 186 ++++----- quartz/components/styles/toc.scss | 29 +- quartz/plugins/emitters/contentIndex.tsx | 2 + quartz/styles/base.scss | 23 +- quartz/util/clone.ts | 3 + quartz/util/fileTrie.test.ts | 190 +++++++++ quartz/util/fileTrie.ts | 128 ++++++ quartz/util/path.ts | 5 +- 24 files changed, 797 insertions(+), 674 deletions(-) delete mode 100644 quartz/components/ExplorerNode.tsx create mode 100644 quartz/components/OverflowList.tsx create mode 100644 quartz/util/clone.ts create mode 100644 quartz/util/fileTrie.test.ts create mode 100644 quartz/util/fileTrie.ts diff --git a/docs/advanced/creating components.md b/docs/advanced/creating components.md index 628d5aa29..369405b07 100644 --- a/docs/advanced/creating components.md +++ b/docs/advanced/creating components.md @@ -161,6 +161,18 @@ document.addEventListener("nav", () => { }) ``` +You can also add the equivalent of a `beforeunload` event for [[SPA Routing]] via the `prenav` event. + +```ts +document.addEventListener("prenav", () => { + // executed after an SPA navigation is triggered but + // before the page is replaced + // one usage pattern is to store things in sessionStorage + // in the prenav and then conditionally load then in the consequent + // nav +}) +``` + It is best practice to track any event handlers via `window.addCleanup` to prevent memory leaks. This will get called on page navigation. diff --git a/index.d.ts b/index.d.ts index a6c594fff..8e524af03 100644 --- a/index.d.ts +++ b/index.d.ts @@ -5,6 +5,7 @@ declare module "*.scss" { // dom custom event interface CustomEventMap { + prenav: CustomEvent<{}> nav: CustomEvent<{ url: FullSlug }> themechange: CustomEvent<{ theme: "light" | "dark" }> } diff --git a/package.json b/package.json index 92872d792..81e5dbf10 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "docs": "npx quartz build --serve -d docs", "check": "tsc --noEmit && npx prettier . --check", "format": "npx prettier . --write", - "test": "tsx ./quartz/util/path.test.ts && tsx ./quartz/depgraph.test.ts", + "test": "tsx --test", "profile": "0x -D prof ./quartz/bootstrap-cli.mjs build --concurrency=1" }, "engines": { diff --git a/quartz.config.ts b/quartz.config.ts index 0cd7e946c..51a75515d 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -8,7 +8,7 @@ import * as Plugin from "./quartz/plugins" */ const config: QuartzConfig = { configuration: { - pageTitle: "🪴 Quartz 4", + pageTitle: "Quartz 4", pageTitleSuffix: "", enableSPA: true, enablePopovers: true, diff --git a/quartz/components/Backlinks.tsx b/quartz/components/Backlinks.tsx index e99055e31..735afe727 100644 --- a/quartz/components/Backlinks.tsx +++ b/quartz/components/Backlinks.tsx @@ -3,6 +3,7 @@ import style from "./styles/backlinks.scss" import { resolveRelative, simplifySlug } from "../util/path" import { i18n } from "../i18n" import { classNames } from "../util/lang" +import OverflowList from "./OverflowList" interface BacklinksOptions { hideWhenEmpty: boolean @@ -29,7 +30,7 @@ export default ((opts?: Partial) => { return (

    {i18n(cfg.locale).components.backlinks.title}

    -
      + {backlinkFiles.length > 0 ? ( backlinkFiles.map((f) => (
    • @@ -41,12 +42,13 @@ export default ((opts?: Partial) => { ) : (
    • {i18n(cfg.locale).components.backlinks.noBacklinksFound}
    • )} -
    +
    ) } Backlinks.css = style + Backlinks.afterDOMLoaded = OverflowList.afterDOMLoaded("backlinks-ul") return Backlinks }) satisfies QuartzComponentConstructor diff --git a/quartz/components/Explorer.tsx b/quartz/components/Explorer.tsx index ac276a8bc..9c1fbdcfe 100644 --- a/quartz/components/Explorer.tsx +++ b/quartz/components/Explorer.tsx @@ -3,22 +3,34 @@ import style from "./styles/explorer.scss" // @ts-ignore import script from "./scripts/explorer.inline" -import { ExplorerNode, FileNode, Options } from "./ExplorerNode" -import { QuartzPluginData } from "../plugins/vfile" import { classNames } from "../util/lang" import { i18n } from "../i18n" +import { FileTrieNode } from "../util/fileTrie" +import OverflowList from "./OverflowList" -// Options interface defined in `ExplorerNode` to avoid circular dependency -const defaultOptions = { - folderClickBehavior: "collapse", +type OrderEntries = "sort" | "filter" | "map" + +export interface Options { + title?: string + folderDefaultState: "collapsed" | "open" + folderClickBehavior: "collapse" | "link" + useSavedState: boolean + sortFn: (a: FileTrieNode, b: FileTrieNode) => number + filterFn: (node: FileTrieNode) => boolean + mapFn: (node: FileTrieNode) => void + order: OrderEntries[] +} + +const defaultOptions: Options = { folderDefaultState: "collapsed", + folderClickBehavior: "collapse", useSavedState: true, mapFn: (node) => { return node }, sortFn: (a, b) => { - // Sort order: folders first, then files. Sort folders and files alphabetically - if ((!a.file && !b.file) || (a.file && b.file)) { + // Sort order: folders first, then files. Sort folders and files alphabeticall + if ((!a.isFolder && !b.isFolder) || (a.isFolder && b.isFolder)) { // numeric: true: Whether numeric collation should be used, such that "1" < "2" < "10" // sensitivity: "base": Only strings that differ in base letters compare as unequal. Examples: a ≠ b, a = á, a = A return a.displayName.localeCompare(b.displayName, undefined, { @@ -27,75 +39,44 @@ const defaultOptions = { }) } - if (a.file && !b.file) { + if (!a.isFolder && b.isFolder) { return 1 } else { return -1 } }, - filterFn: (node) => node.name !== "tags", + filterFn: (node) => node.slugSegment !== "tags", order: ["filter", "map", "sort"], -} satisfies Options +} + +export type FolderState = { + path: string + collapsed: boolean +} export default ((userOpts?: Partial) => { - // Parse config const opts: Options = { ...defaultOptions, ...userOpts } - // memoized - let fileTree: FileNode - let jsonTree: string - let lastBuildId: string = "" - - function constructFileTree(allFiles: QuartzPluginData[]) { - // Construct tree from allFiles - fileTree = new FileNode("") - allFiles.forEach((file) => fileTree.add(file)) - - // Execute all functions (sort, filter, map) that were provided (if none were provided, only default "sort" is applied) - if (opts.order) { - // Order is important, use loop with index instead of order.map() - for (let i = 0; i < opts.order.length; i++) { - const functionName = opts.order[i] - if (functionName === "map") { - fileTree.map(opts.mapFn) - } else if (functionName === "sort") { - fileTree.sort(opts.sortFn) - } else if (functionName === "filter") { - fileTree.filter(opts.filterFn) - } - } - } - - // Get all folders of tree. Initialize with collapsed state - // Stringify to pass json tree as data attribute ([data-tree]) - const folders = fileTree.getFolderPaths(opts.folderDefaultState === "collapsed") - jsonTree = JSON.stringify(folders) - } - - const Explorer: QuartzComponent = ({ - ctx, - cfg, - allFiles, - displayClass, - fileData, - }: QuartzComponentProps) => { - if (ctx.buildId !== lastBuildId) { - lastBuildId = ctx.buildId - constructFileTree(allFiles) - } + const Explorer: QuartzComponent = ({ cfg, displayClass }: QuartzComponentProps) => { return ( -
    +
    -
    -
      - -
    • -
    +
    +
    + +
    ) } Explorer.css = style - Explorer.afterDOMLoaded = script + Explorer.afterDOMLoaded = script + OverflowList.afterDOMLoaded("explorer-ul") return Explorer }) satisfies QuartzComponentConstructor diff --git a/quartz/components/ExplorerNode.tsx b/quartz/components/ExplorerNode.tsx deleted file mode 100644 index e57d67715..000000000 --- a/quartz/components/ExplorerNode.tsx +++ /dev/null @@ -1,242 +0,0 @@ -// @ts-ignore -import { QuartzPluginData } from "../plugins/vfile" -import { - joinSegments, - resolveRelative, - clone, - simplifySlug, - SimpleSlug, - FilePath, -} from "../util/path" - -type OrderEntries = "sort" | "filter" | "map" - -export interface Options { - title?: string - folderDefaultState: "collapsed" | "open" - folderClickBehavior: "collapse" | "link" - useSavedState: boolean - sortFn: (a: FileNode, b: FileNode) => number - filterFn: (node: FileNode) => boolean - mapFn: (node: FileNode) => void - order: OrderEntries[] -} - -type DataWrapper = { - file: QuartzPluginData - path: string[] -} - -export type FolderState = { - path: string - collapsed: boolean -} - -function getPathSegment(fp: FilePath | undefined, idx: number): string | undefined { - if (!fp) { - return undefined - } - - return fp.split("/").at(idx) -} - -// Structure to add all files into a tree -export class FileNode { - children: Array - name: string // this is the slug segment - displayName: string - file: QuartzPluginData | null - depth: number - - constructor(slugSegment: string, displayName?: string, file?: QuartzPluginData, depth?: number) { - this.children = [] - this.name = slugSegment - this.displayName = displayName ?? file?.frontmatter?.title ?? slugSegment - this.file = file ? clone(file) : null - this.depth = depth ?? 0 - } - - private insert(fileData: DataWrapper) { - if (fileData.path.length === 0) { - return - } - - const nextSegment = fileData.path[0] - - // base case, insert here - if (fileData.path.length === 1) { - if (nextSegment === "") { - // index case (we are the root and we just found index.md), set our data appropriately - const title = fileData.file.frontmatter?.title - if (title && title !== "index") { - this.displayName = title - } - } else { - // direct child - this.children.push(new FileNode(nextSegment, undefined, fileData.file, this.depth + 1)) - } - - return - } - - // find the right child to insert into - fileData.path = fileData.path.splice(1) - const child = this.children.find((c) => c.name === nextSegment) - if (child) { - child.insert(fileData) - return - } - - const newChild = new FileNode( - nextSegment, - getPathSegment(fileData.file.relativePath, this.depth), - undefined, - this.depth + 1, - ) - newChild.insert(fileData) - this.children.push(newChild) - } - - // Add new file to tree - add(file: QuartzPluginData) { - this.insert({ file: file, path: simplifySlug(file.slug!).split("/") }) - } - - /** - * Filter FileNode tree. Behaves similar to `Array.prototype.filter()`, but modifies tree in place - * @param filterFn function to filter tree with - */ - filter(filterFn: (node: FileNode) => boolean) { - this.children = this.children.filter(filterFn) - this.children.forEach((child) => child.filter(filterFn)) - } - - /** - * Filter FileNode tree. Behaves similar to `Array.prototype.map()`, but modifies tree in place - * @param mapFn function to use for mapping over tree - */ - map(mapFn: (node: FileNode) => void) { - mapFn(this) - this.children.forEach((child) => child.map(mapFn)) - } - - /** - * Get folder representation with state of tree. - * Intended to only be called on root node before changes to the tree are made - * @param collapsed default state of folders (collapsed by default or not) - * @returns array containing folder state for tree - */ - getFolderPaths(collapsed: boolean): FolderState[] { - const folderPaths: FolderState[] = [] - - const traverse = (node: FileNode, currentPath: string) => { - if (!node.file) { - const folderPath = joinSegments(currentPath, node.name) - if (folderPath !== "") { - folderPaths.push({ path: folderPath, collapsed }) - } - - node.children.forEach((child) => traverse(child, folderPath)) - } - } - - traverse(this, "") - return folderPaths - } - - // Sort order: folders first, then files. Sort folders and files alphabetically - /** - * Sorts tree according to sort/compare function - * @param sortFn compare function used for `.sort()`, also used recursively for children - */ - sort(sortFn: (a: FileNode, b: FileNode) => number) { - this.children = this.children.sort(sortFn) - this.children.forEach((e) => e.sort(sortFn)) - } -} - -type ExplorerNodeProps = { - node: FileNode - opts: Options - fileData: QuartzPluginData - fullPath?: string -} - -export function ExplorerNode({ node, opts, fullPath, fileData }: ExplorerNodeProps) { - // Get options - const folderBehavior = opts.folderClickBehavior - const isDefaultOpen = opts.folderDefaultState === "open" - - // Calculate current folderPath - const folderPath = node.name !== "" ? joinSegments(fullPath ?? "", node.name) : "" - const href = resolveRelative(fileData.slug!, folderPath as SimpleSlug) + "/" - - return ( - <> - {node.file ? ( - // Single file node -
  2. - - {node.displayName} - -
  3. - ) : ( -
  4. - {node.name !== "" && ( - // Node with entire folder - // Render svg button + folder name, then children - -
  5. - )} - {/* Recursively render children of folder */} -
    -
      - {node.children.map((childNode, i) => ( - - ))} -
    -
    -

  6. - )} - - ) -} diff --git a/quartz/components/OverflowList.tsx b/quartz/components/OverflowList.tsx new file mode 100644 index 000000000..d74c5c255 --- /dev/null +++ b/quartz/components/OverflowList.tsx @@ -0,0 +1,39 @@ +import { JSX } from "preact" + +const OverflowList = ({ + children, + ...props +}: JSX.HTMLAttributes & { id: string }) => { + return ( +
      + {children} +
    • +
    + ) +} + +OverflowList.afterDOMLoaded = (id: string) => ` +document.addEventListener("nav", (e) => { + const observer = new IntersectionObserver((entries) => { + for (const entry of entries) { + const parentUl = entry.target.parentElement + if (entry.isIntersecting) { + parentUl.classList.remove("gradient-active") + } else { + parentUl.classList.add("gradient-active") + } + } + }) + + const ul = document.getElementById("${id}") + if (!ul) return + + const end = ul.querySelector(".overflow-end") + if (!end) return + + observer.observe(end) + window.addCleanup(() => observer.disconnect()) +}) +` + +export default OverflowList diff --git a/quartz/components/TableOfContents.tsx b/quartz/components/TableOfContents.tsx index ec457cfe5..485f434a8 100644 --- a/quartz/components/TableOfContents.tsx +++ b/quartz/components/TableOfContents.tsx @@ -6,6 +6,7 @@ import { classNames } from "../util/lang" // @ts-ignore import script from "./scripts/toc.inline" import { i18n } from "../i18n" +import OverflowList from "./OverflowList" interface Options { layout: "modern" | "legacy" @@ -50,7 +51,7 @@ const TableOfContents: QuartzComponent = ({
    - +
) } TableOfContents.css = modernStyle -TableOfContents.afterDOMLoaded = script +TableOfContents.afterDOMLoaded = script + OverflowList.afterDOMLoaded("toc-ul") const LegacyTableOfContents: QuartzComponent = ({ fileData, cfg }: QuartzComponentProps) => { if (!fileData.toc) { diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index 9cebaa849..75ef82b24 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -3,7 +3,8 @@ import { QuartzComponent, QuartzComponentProps } from "./types" import HeaderConstructor from "./Header" import BodyConstructor from "./Body" import { JSResourceToScriptElement, StaticResources } from "../util/resources" -import { clone, FullSlug, RelativeURL, joinSegments, normalizeHastElement } from "../util/path" +import { FullSlug, RelativeURL, joinSegments, normalizeHastElement } from "../util/path" +import { clone } from "../util/clone" import { visit } from "unist-util-visit" import { Root, Element, ElementContent } from "hast" import { GlobalConfiguration } from "../cfg" diff --git a/quartz/components/scripts/explorer.inline.ts b/quartz/components/scripts/explorer.inline.ts index 9c6c0508f..15f3a84dd 100644 --- a/quartz/components/scripts/explorer.inline.ts +++ b/quartz/components/scripts/explorer.inline.ts @@ -1,53 +1,38 @@ -import { FolderState } from "../ExplorerNode" +import { FileTrieNode } from "../../util/fileTrie" +import { FullSlug, resolveRelative, simplifySlug } from "../../util/path" +import { ContentDetails } from "../../plugins/emitters/contentIndex" -// Current state of folders type MaybeHTMLElement = HTMLElement | undefined -let currentExplorerState: FolderState[] -const observer = new IntersectionObserver((entries) => { - // If last element is observed, remove gradient of "overflow" class so element is visible - const explorerUl = document.getElementById("explorer-ul") - if (!explorerUl) return - for (const entry of entries) { - if (entry.isIntersecting) { - explorerUl.classList.add("no-background") - } else { - explorerUl.classList.remove("no-background") - } - } -}) +interface ParsedOptions { + folderClickBehavior: "collapse" | "link" + folderDefaultState: "collapsed" | "open" + useSavedState: boolean + sortFn: (a: FileTrieNode, b: FileTrieNode) => number + filterFn: (node: FileTrieNode) => boolean + mapFn: (node: FileTrieNode) => void + order: "sort" | "filter" | "map"[] +} +type FolderState = { + path: string + collapsed: boolean +} + +let currentExplorerState: Array function toggleExplorer(this: HTMLElement) { - // Toggle collapsed state of entire explorer - this.classList.toggle("collapsed") - - // Toggle collapsed aria state of entire explorer - this.setAttribute( - "aria-expanded", - this.getAttribute("aria-expanded") === "true" ? "false" : "true", - ) - - const content = ( - this.nextElementSibling?.nextElementSibling - ? this.nextElementSibling.nextElementSibling - : this.nextElementSibling - ) as MaybeHTMLElement - if (!content) return - content.classList.toggle("collapsed") - content.classList.toggle("explorer-viewmode") - - // Prevent scroll under - if (document.querySelector("#mobile-explorer")) { - // Disable scrolling on the page when the explorer is opened on mobile - const bodySelector = document.querySelector("#quartz-body") - if (bodySelector) bodySelector.classList.toggle("lock-scroll") + const explorers = document.querySelectorAll(".explorer") + for (const explorer of explorers) { + explorer.classList.toggle("collapsed") + explorer.setAttribute( + "aria-expanded", + explorer.getAttribute("aria-expanded") === "true" ? "false" : "true", + ) } } function toggleFolder(evt: MouseEvent) { evt.stopPropagation() - - // Element that was clicked const target = evt.target as MaybeHTMLElement if (!target) return @@ -55,162 +40,240 @@ function toggleFolder(evt: MouseEvent) { const isSvg = target.nodeName === "svg" // corresponding