From e06a0c7fed269cc9d484a5e1c82cf3dfe537eb2d Mon Sep 17 00:00:00 2001 From: Mehrdad Shirvani Date: Thu, 23 Oct 2025 18:57:47 +0330 Subject: [PATCH] init: add basic strcuture based on quartz --- src/.gitattributes | 1 + src/.node-version | 1 + src/.npmrc | 1 + src/.prettierignore | 3 + src/.prettierrc | 7 + src/LICENSE | 21 + src/content/00-course-info/course-guide.md | 0 .../generative-ai-usage-guidelines.md | 0 src/content/00-course-info/references.md | 0 src/content/00-course-info/syllabus.md | 0 .../01-problem-solving/00-Overview.md | 48 + .../01-problem-solving/01-Workshop.md | 64 + .../01-problem-solving/02-Assignment.md | 64 + .../01-topics/01-problem-solving/03-QnA.md | 31 + .../02-basics-and-data-types/00-Overview.md | 48 + .../02-basics-and-data-types/01-Workshop.md | 64 + .../02-basics-and-data-types/02-Assignment.md | 64 + .../02-basics-and-data-types/03-QnA.md | 31 + .../99-assets/topics/01/slides/ta/Slide01.md | 10 + .../topics/01/slides/ta/TestPresentation.pdf | Bin 0 -> 72435 bytes .../topics/01/slides/ta/TestPresentation.pptx | Bin 0 -> 34586 bytes src/content/README.md | 3 + src/content/templates/assignment-template.md | 0 .../templates/contributing-guidelines.md | 21 + src/content/templates/overview-template.md | 0 .../templates/project-document-template.md | 0 src/content/templates/repository-structure.md | 70 + src/content/templates/workshop-template.md | 0 src/globals.d.ts | 17 + src/index.d.ts | 15 + src/package-lock.json | 7147 ++++++++++++++++ src/package.json | 115 + src/quartz.config.ts | 100 + src/quartz.layout.ts | 68 + src/quartz/bootstrap-cli.mjs | 41 + src/quartz/bootstrap-worker.mjs | 8 + src/quartz/build.ts | 302 + src/quartz/cfg.ts | 92 + src/quartz/cli/args.js | 108 + src/quartz/cli/constants.js | 15 + src/quartz/cli/handlers.js | 620 ++ src/quartz/cli/helpers.js | 54 + src/quartz/components/ArticleTitle.tsx | 19 + src/quartz/components/Backlinks.tsx | 55 + src/quartz/components/Body.tsx | 13 + src/quartz/components/Breadcrumbs.tsx | 93 + src/quartz/components/Comments.tsx | 62 + src/quartz/components/ConditionalRender.tsx | 22 + src/quartz/components/ContentMeta.tsx | 58 + src/quartz/components/Darkmode.tsx | 48 + src/quartz/components/Date.tsx | 31 + src/quartz/components/DesktopOnly.tsx | 14 + src/quartz/components/Explorer.tsx | 162 + src/quartz/components/Flex.tsx | 59 + src/quartz/components/Footer.tsx | 33 + src/quartz/components/Graph.tsx | 109 + src/quartz/components/Head.tsx | 105 + src/quartz/components/Header.tsx | 22 + src/quartz/components/MobileOnly.tsx | 14 + src/quartz/components/OverflowList.tsx | 48 + src/quartz/components/PageList.tsx | 114 + src/quartz/components/PageTitle.tsx | 24 + src/quartz/components/ReaderMode.tsx | 38 + src/quartz/components/RecentNotes.tsx | 93 + src/quartz/components/Search.tsx | 53 + src/quartz/components/Spacer.tsx | 8 + src/quartz/components/TableOfContents.tsx | 96 + src/quartz/components/TagList.tsx | 56 + src/quartz/components/index.ts | 53 + src/quartz/components/pages/404.tsx | 18 + src/quartz/components/pages/Content.tsx | 12 + src/quartz/components/pages/FolderContent.tsx | 126 + src/quartz/components/pages/TagContent.tsx | 133 + src/quartz/components/renderPage.tsx | 274 + .../components/scripts/callout.inline.ts | 27 + .../components/scripts/checkbox.inline.ts | 23 + .../components/scripts/clipboard.inline.ts | 37 + .../components/scripts/comments.inline.ts | 92 + .../components/scripts/darkmode.inline.ts | 37 + .../components/scripts/explorer.inline.ts | 301 + src/quartz/components/scripts/graph.inline.ts | 674 ++ .../components/scripts/mermaid.inline.ts | 258 + .../components/scripts/popover.inline.ts | 133 + .../components/scripts/readermode.inline.ts | 25 + .../components/scripts/search.inline.ts | 496 ++ src/quartz/components/scripts/spa.inline.ts | 214 + src/quartz/components/scripts/toc.inline.ts | 44 + src/quartz/components/scripts/util.ts | 46 + src/quartz/components/styles/backlinks.scss | 24 + src/quartz/components/styles/breadcrumbs.scss | 22 + src/quartz/components/styles/clipboard.scss | 36 + src/quartz/components/styles/contentMeta.scss | 14 + src/quartz/components/styles/darkmode.scss | 47 + src/quartz/components/styles/explorer.scss | 270 + src/quartz/components/styles/footer.scss | 15 + src/quartz/components/styles/graph.scss | 73 + src/quartz/components/styles/legacyToc.scss | 27 + src/quartz/components/styles/listPage.scss | 40 + .../components/styles/mermaid.inline.scss | 133 + src/quartz/components/styles/popover.scss | 89 + src/quartz/components/styles/readermode.scss | 34 + src/quartz/components/styles/recentNotes.scss | 24 + src/quartz/components/styles/search.scss | 242 + src/quartz/components/styles/toc.scss | 66 + src/quartz/components/types.ts | 29 + src/quartz/i18n/index.ts | 86 + src/quartz/i18n/locales/ar-SA.ts | 92 + src/quartz/i18n/locales/ca-ES.ts | 87 + src/quartz/i18n/locales/cs-CZ.ts | 87 + src/quartz/i18n/locales/de-DE.ts | 87 + src/quartz/i18n/locales/definition.ts | 87 + src/quartz/i18n/locales/en-GB.ts | 87 + src/quartz/i18n/locales/en-US.ts | 87 + src/quartz/i18n/locales/es-ES.ts | 87 + src/quartz/i18n/locales/fa-IR.ts | 87 + src/quartz/i18n/locales/fi-FI.ts | 87 + src/quartz/i18n/locales/fr-FR.ts | 87 + src/quartz/i18n/locales/hu-HU.ts | 85 + src/quartz/i18n/locales/id-ID.ts | 87 + src/quartz/i18n/locales/it-IT.ts | 87 + src/quartz/i18n/locales/ja-JP.ts | 85 + src/quartz/i18n/locales/ko-KR.ts | 85 + src/quartz/i18n/locales/lt-LT.ts | 107 + src/quartz/i18n/locales/nb-NO.ts | 87 + src/quartz/i18n/locales/nl-NL.ts | 89 + src/quartz/i18n/locales/pl-PL.ts | 87 + src/quartz/i18n/locales/pt-BR.ts | 87 + src/quartz/i18n/locales/ro-RO.ts | 88 + src/quartz/i18n/locales/ru-RU.ts | 99 + src/quartz/i18n/locales/th-TH.ts | 85 + src/quartz/i18n/locales/tr-TR.ts | 87 + src/quartz/i18n/locales/uk-UA.ts | 87 + src/quartz/i18n/locales/vi-VN.ts | 87 + src/quartz/i18n/locales/zh-CN.ts | 85 + src/quartz/i18n/locales/zh-TW.ts | 85 + src/quartz/plugins/emitters/404.tsx | 63 + src/quartz/plugins/emitters/aliases.ts | 55 + src/quartz/plugins/emitters/assets.ts | 52 + src/quartz/plugins/emitters/cname.ts | 29 + .../plugins/emitters/componentResources.ts | 323 + src/quartz/plugins/emitters/contentIndex.tsx | 174 + src/quartz/plugins/emitters/contentPage.tsx | 121 + src/quartz/plugins/emitters/favicon.ts | 22 + src/quartz/plugins/emitters/folderPage.tsx | 170 + src/quartz/plugins/emitters/helpers.ts | 20 + src/quartz/plugins/emitters/index.ts | 12 + src/quartz/plugins/emitters/ogImage.tsx | 182 + src/quartz/plugins/emitters/static.ts | 23 + src/quartz/plugins/emitters/tagPage.tsx | 170 + src/quartz/plugins/filters/draft.ts | 10 + src/quartz/plugins/filters/explicit.ts | 8 + src/quartz/plugins/filters/index.ts | 2 + src/quartz/plugins/index.ts | 56 + src/quartz/plugins/transformers/citations.ts | 54 + .../plugins/transformers/description.ts | 90 + .../plugins/transformers/frontmatter.ts | 156 + src/quartz/plugins/transformers/gfm.ts | 78 + src/quartz/plugins/transformers/index.ts | 13 + src/quartz/plugins/transformers/lastmod.ts | 115 + src/quartz/plugins/transformers/latex.ts | 65 + src/quartz/plugins/transformers/linebreaks.ts | 11 + src/quartz/plugins/transformers/links.ts | 172 + src/quartz/plugins/transformers/ofm.ts | 802 ++ src/quartz/plugins/transformers/oxhugofm.ts | 106 + src/quartz/plugins/transformers/roam.ts | 211 + src/quartz/plugins/transformers/syntax.ts | 31 + src/quartz/plugins/transformers/toc.ts | 73 + src/quartz/plugins/types.ts | 65 + src/quartz/plugins/vfile.ts | 14 + src/quartz/processors/emit.ts | 50 + src/quartz/processors/filter.ts | 24 + src/quartz/processors/parse.ts | 222 + src/quartz/static/giscus/dark.css | 99 + src/quartz/static/giscus/light.css | 99 + src/quartz/static/icon.png | Bin 0 -> 515534 bytes src/quartz/static/og-image.png | Bin 0 -> 39281 bytes src/quartz/styles/base.scss | 643 ++ src/quartz/styles/callouts.scss | 170 + src/quartz/styles/custom.scss | 3 + src/quartz/styles/syntax.scss | 17 + src/quartz/styles/variables.scss | 58 + src/quartz/util/clone.ts | 3 + src/quartz/util/ctx.ts | 50 + src/quartz/util/emoji.ts | 47 + src/quartz/util/emojimap.json | 7568 +++++++++++++++++ src/quartz/util/escape.ts | 17 + src/quartz/util/fileTrie.test.ts | 415 + src/quartz/util/fileTrie.ts | 170 + src/quartz/util/glob.ts | 22 + src/quartz/util/jsx.tsx | 27 + src/quartz/util/lang.ts | 13 + src/quartz/util/log.ts | 58 + src/quartz/util/og.tsx | 378 + src/quartz/util/path.test.ts | 363 + src/quartz/util/path.ts | 318 + src/quartz/util/perf.ts | 19 + src/quartz/util/random.ts | 3 + src/quartz/util/resources.tsx | 74 + src/quartz/util/sourcemap.ts | 18 + src/quartz/util/theme.ts | 176 + src/quartz/util/trace.ts | 43 + src/quartz/worker.ts | 37 + src/tsconfig.json | 22 + 203 files changed, 32322 insertions(+) create mode 100644 src/.gitattributes create mode 100644 src/.node-version create mode 100644 src/.npmrc create mode 100644 src/.prettierignore create mode 100644 src/.prettierrc create mode 100644 src/LICENSE create mode 100644 src/content/00-course-info/course-guide.md create mode 100644 src/content/00-course-info/generative-ai-usage-guidelines.md create mode 100644 src/content/00-course-info/references.md create mode 100644 src/content/00-course-info/syllabus.md create mode 100644 src/content/01-topics/01-problem-solving/00-Overview.md create mode 100644 src/content/01-topics/01-problem-solving/01-Workshop.md create mode 100644 src/content/01-topics/01-problem-solving/02-Assignment.md create mode 100644 src/content/01-topics/01-problem-solving/03-QnA.md create mode 100644 src/content/01-topics/02-basics-and-data-types/00-Overview.md create mode 100644 src/content/01-topics/02-basics-and-data-types/01-Workshop.md create mode 100644 src/content/01-topics/02-basics-and-data-types/02-Assignment.md create mode 100644 src/content/01-topics/02-basics-and-data-types/03-QnA.md create mode 100644 src/content/99-assets/topics/01/slides/ta/Slide01.md create mode 100644 src/content/99-assets/topics/01/slides/ta/TestPresentation.pdf create mode 100644 src/content/99-assets/topics/01/slides/ta/TestPresentation.pptx create mode 100644 src/content/README.md create mode 100644 src/content/templates/assignment-template.md create mode 100644 src/content/templates/contributing-guidelines.md create mode 100644 src/content/templates/overview-template.md create mode 100644 src/content/templates/project-document-template.md create mode 100644 src/content/templates/repository-structure.md create mode 100644 src/content/templates/workshop-template.md create mode 100644 src/globals.d.ts create mode 100644 src/index.d.ts create mode 100644 src/package-lock.json create mode 100644 src/package.json create mode 100644 src/quartz.config.ts create mode 100644 src/quartz.layout.ts create mode 100644 src/quartz/bootstrap-cli.mjs create mode 100644 src/quartz/bootstrap-worker.mjs create mode 100644 src/quartz/build.ts create mode 100644 src/quartz/cfg.ts create mode 100644 src/quartz/cli/args.js create mode 100644 src/quartz/cli/constants.js create mode 100644 src/quartz/cli/handlers.js create mode 100644 src/quartz/cli/helpers.js create mode 100644 src/quartz/components/ArticleTitle.tsx create mode 100644 src/quartz/components/Backlinks.tsx create mode 100644 src/quartz/components/Body.tsx create mode 100644 src/quartz/components/Breadcrumbs.tsx create mode 100644 src/quartz/components/Comments.tsx create mode 100644 src/quartz/components/ConditionalRender.tsx create mode 100644 src/quartz/components/ContentMeta.tsx create mode 100644 src/quartz/components/Darkmode.tsx create mode 100644 src/quartz/components/Date.tsx create mode 100644 src/quartz/components/DesktopOnly.tsx create mode 100644 src/quartz/components/Explorer.tsx create mode 100644 src/quartz/components/Flex.tsx create mode 100644 src/quartz/components/Footer.tsx create mode 100644 src/quartz/components/Graph.tsx create mode 100644 src/quartz/components/Head.tsx create mode 100644 src/quartz/components/Header.tsx create mode 100644 src/quartz/components/MobileOnly.tsx create mode 100644 src/quartz/components/OverflowList.tsx create mode 100644 src/quartz/components/PageList.tsx create mode 100644 src/quartz/components/PageTitle.tsx create mode 100644 src/quartz/components/ReaderMode.tsx create mode 100644 src/quartz/components/RecentNotes.tsx create mode 100644 src/quartz/components/Search.tsx create mode 100644 src/quartz/components/Spacer.tsx create mode 100644 src/quartz/components/TableOfContents.tsx create mode 100644 src/quartz/components/TagList.tsx create mode 100644 src/quartz/components/index.ts create mode 100644 src/quartz/components/pages/404.tsx create mode 100644 src/quartz/components/pages/Content.tsx create mode 100644 src/quartz/components/pages/FolderContent.tsx create mode 100644 src/quartz/components/pages/TagContent.tsx create mode 100644 src/quartz/components/renderPage.tsx create mode 100644 src/quartz/components/scripts/callout.inline.ts create mode 100644 src/quartz/components/scripts/checkbox.inline.ts create mode 100644 src/quartz/components/scripts/clipboard.inline.ts create mode 100644 src/quartz/components/scripts/comments.inline.ts create mode 100644 src/quartz/components/scripts/darkmode.inline.ts create mode 100644 src/quartz/components/scripts/explorer.inline.ts create mode 100644 src/quartz/components/scripts/graph.inline.ts create mode 100644 src/quartz/components/scripts/mermaid.inline.ts create mode 100644 src/quartz/components/scripts/popover.inline.ts create mode 100644 src/quartz/components/scripts/readermode.inline.ts create mode 100644 src/quartz/components/scripts/search.inline.ts create mode 100644 src/quartz/components/scripts/spa.inline.ts create mode 100644 src/quartz/components/scripts/toc.inline.ts create mode 100644 src/quartz/components/scripts/util.ts create mode 100644 src/quartz/components/styles/backlinks.scss create mode 100644 src/quartz/components/styles/breadcrumbs.scss create mode 100644 src/quartz/components/styles/clipboard.scss create mode 100644 src/quartz/components/styles/contentMeta.scss create mode 100644 src/quartz/components/styles/darkmode.scss create mode 100644 src/quartz/components/styles/explorer.scss create mode 100644 src/quartz/components/styles/footer.scss create mode 100644 src/quartz/components/styles/graph.scss create mode 100644 src/quartz/components/styles/legacyToc.scss create mode 100644 src/quartz/components/styles/listPage.scss create mode 100644 src/quartz/components/styles/mermaid.inline.scss create mode 100644 src/quartz/components/styles/popover.scss create mode 100644 src/quartz/components/styles/readermode.scss create mode 100644 src/quartz/components/styles/recentNotes.scss create mode 100644 src/quartz/components/styles/search.scss create mode 100644 src/quartz/components/styles/toc.scss create mode 100644 src/quartz/components/types.ts create mode 100644 src/quartz/i18n/index.ts create mode 100644 src/quartz/i18n/locales/ar-SA.ts create mode 100644 src/quartz/i18n/locales/ca-ES.ts create mode 100644 src/quartz/i18n/locales/cs-CZ.ts create mode 100644 src/quartz/i18n/locales/de-DE.ts create mode 100644 src/quartz/i18n/locales/definition.ts create mode 100644 src/quartz/i18n/locales/en-GB.ts create mode 100644 src/quartz/i18n/locales/en-US.ts create mode 100644 src/quartz/i18n/locales/es-ES.ts create mode 100644 src/quartz/i18n/locales/fa-IR.ts create mode 100644 src/quartz/i18n/locales/fi-FI.ts create mode 100644 src/quartz/i18n/locales/fr-FR.ts create mode 100644 src/quartz/i18n/locales/hu-HU.ts create mode 100644 src/quartz/i18n/locales/id-ID.ts create mode 100644 src/quartz/i18n/locales/it-IT.ts create mode 100644 src/quartz/i18n/locales/ja-JP.ts create mode 100644 src/quartz/i18n/locales/ko-KR.ts create mode 100644 src/quartz/i18n/locales/lt-LT.ts create mode 100644 src/quartz/i18n/locales/nb-NO.ts create mode 100644 src/quartz/i18n/locales/nl-NL.ts create mode 100644 src/quartz/i18n/locales/pl-PL.ts create mode 100644 src/quartz/i18n/locales/pt-BR.ts create mode 100644 src/quartz/i18n/locales/ro-RO.ts create mode 100644 src/quartz/i18n/locales/ru-RU.ts create mode 100644 src/quartz/i18n/locales/th-TH.ts create mode 100644 src/quartz/i18n/locales/tr-TR.ts create mode 100644 src/quartz/i18n/locales/uk-UA.ts create mode 100644 src/quartz/i18n/locales/vi-VN.ts create mode 100644 src/quartz/i18n/locales/zh-CN.ts create mode 100644 src/quartz/i18n/locales/zh-TW.ts create mode 100644 src/quartz/plugins/emitters/404.tsx create mode 100644 src/quartz/plugins/emitters/aliases.ts create mode 100644 src/quartz/plugins/emitters/assets.ts create mode 100644 src/quartz/plugins/emitters/cname.ts create mode 100644 src/quartz/plugins/emitters/componentResources.ts create mode 100644 src/quartz/plugins/emitters/contentIndex.tsx create mode 100644 src/quartz/plugins/emitters/contentPage.tsx create mode 100644 src/quartz/plugins/emitters/favicon.ts create mode 100644 src/quartz/plugins/emitters/folderPage.tsx create mode 100644 src/quartz/plugins/emitters/helpers.ts create mode 100644 src/quartz/plugins/emitters/index.ts create mode 100644 src/quartz/plugins/emitters/ogImage.tsx create mode 100644 src/quartz/plugins/emitters/static.ts create mode 100644 src/quartz/plugins/emitters/tagPage.tsx create mode 100644 src/quartz/plugins/filters/draft.ts create mode 100644 src/quartz/plugins/filters/explicit.ts create mode 100644 src/quartz/plugins/filters/index.ts create mode 100644 src/quartz/plugins/index.ts create mode 100644 src/quartz/plugins/transformers/citations.ts create mode 100644 src/quartz/plugins/transformers/description.ts create mode 100644 src/quartz/plugins/transformers/frontmatter.ts create mode 100644 src/quartz/plugins/transformers/gfm.ts create mode 100644 src/quartz/plugins/transformers/index.ts create mode 100644 src/quartz/plugins/transformers/lastmod.ts create mode 100644 src/quartz/plugins/transformers/latex.ts create mode 100644 src/quartz/plugins/transformers/linebreaks.ts create mode 100644 src/quartz/plugins/transformers/links.ts create mode 100644 src/quartz/plugins/transformers/ofm.ts create mode 100644 src/quartz/plugins/transformers/oxhugofm.ts create mode 100644 src/quartz/plugins/transformers/roam.ts create mode 100644 src/quartz/plugins/transformers/syntax.ts create mode 100644 src/quartz/plugins/transformers/toc.ts create mode 100644 src/quartz/plugins/types.ts create mode 100644 src/quartz/plugins/vfile.ts create mode 100644 src/quartz/processors/emit.ts create mode 100644 src/quartz/processors/filter.ts create mode 100644 src/quartz/processors/parse.ts create mode 100644 src/quartz/static/giscus/dark.css create mode 100644 src/quartz/static/giscus/light.css create mode 100644 src/quartz/static/icon.png create mode 100644 src/quartz/static/og-image.png create mode 100644 src/quartz/styles/base.scss create mode 100644 src/quartz/styles/callouts.scss create mode 100644 src/quartz/styles/custom.scss create mode 100644 src/quartz/styles/syntax.scss create mode 100644 src/quartz/styles/variables.scss create mode 100644 src/quartz/util/clone.ts create mode 100644 src/quartz/util/ctx.ts create mode 100644 src/quartz/util/emoji.ts create mode 100644 src/quartz/util/emojimap.json create mode 100644 src/quartz/util/escape.ts create mode 100644 src/quartz/util/fileTrie.test.ts create mode 100644 src/quartz/util/fileTrie.ts create mode 100644 src/quartz/util/glob.ts create mode 100644 src/quartz/util/jsx.tsx create mode 100644 src/quartz/util/lang.ts create mode 100644 src/quartz/util/log.ts create mode 100644 src/quartz/util/og.tsx create mode 100644 src/quartz/util/path.test.ts create mode 100644 src/quartz/util/path.ts create mode 100644 src/quartz/util/perf.ts create mode 100644 src/quartz/util/random.ts create mode 100644 src/quartz/util/resources.tsx create mode 100644 src/quartz/util/sourcemap.ts create mode 100644 src/quartz/util/theme.ts create mode 100644 src/quartz/util/trace.ts create mode 100644 src/quartz/worker.ts create mode 100644 src/tsconfig.json diff --git a/src/.gitattributes b/src/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/src/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/src/.node-version b/src/.node-version new file mode 100644 index 0000000..aebd91c --- /dev/null +++ b/src/.node-version @@ -0,0 +1 @@ +v22.16.0 diff --git a/src/.npmrc b/src/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/src/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/src/.prettierignore b/src/.prettierignore new file mode 100644 index 0000000..3c0687a --- /dev/null +++ b/src/.prettierignore @@ -0,0 +1,3 @@ +public +node_modules +.quartz-cache diff --git a/src/.prettierrc b/src/.prettierrc new file mode 100644 index 0000000..5788b66 --- /dev/null +++ b/src/.prettierrc @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "quoteProps": "as-needed", + "trailingComma": "all", + "tabWidth": 2, + "semi": false +} diff --git a/src/LICENSE b/src/LICENSE new file mode 100644 index 0000000..663b45b --- /dev/null +++ b/src/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 CSOrder + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/content/00-course-info/course-guide.md b/src/content/00-course-info/course-guide.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/00-course-info/generative-ai-usage-guidelines.md b/src/content/00-course-info/generative-ai-usage-guidelines.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/00-course-info/references.md b/src/content/00-course-info/references.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/00-course-info/syllabus.md b/src/content/00-course-info/syllabus.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/01-topics/01-problem-solving/00-Overview.md b/src/content/01-topics/01-problem-solving/00-Overview.md new file mode 100644 index 0000000..5bb6bca --- /dev/null +++ b/src/content/01-topics/01-problem-solving/00-Overview.md @@ -0,0 +1,48 @@ +# 🧭 Topic: Basics of C++ & Data Types + +> [!info] Quick Overview +> This topic introduces how to compile and run C++ code, basic input/output, variables, built-in data types, and the math library. +> By the end, students will be able to write simple C++ programs using variables and standard input/output streams. + +--- +## 📌 Covered in This Topic + +- Introduction to compilation and code editors +- `cin` / `cout` basic usage +- Variables and naming conventions +- Built-in data types (`int`, `float`, `double`, `char`, `bool`) +- Type conversion +- Using the math library + +--- +## 📑 Slides & Materials + +- 👨‍🏫 [Professor Slides (PDF)](./slides/prof.pdf) +- 🧑‍🏫 [TA Workshop Slides (PDF)](./slides/ta.pdf) + +--- +## 🛠️ Workshop & Assignments + +- 💬 [Workshop Questions](./workshops) +- 🧮 [Assignments](01-Workshop.md) +- ❓ [Q&A and Common Issues](./resources/qa.md) + +--- +## 🌐 Additional Resources + +- [C++ Reference](https://cplusplus.com/reference/) +- [Learn C++](https://www.learncpp.com/) +- [Data Types in C++ (W3Schools)](https://www.w3schools.com/cpp/cpp_data_types.asp) + +_Add more useful links here as the course progresses._ + +--- +## ⏩ Navigation + +- ⬅️ [Previous Topic: Problem Solving](../02-problem-solving/topic.md) +- ➡️ [Next Topic: Conditions & Loops](../04-conditions-loops/topic.md) + +--- + +> [!tip] Tip +> If something doesn’t make sense — **don’t stay stuck alone**. Ask the TA to clarify it right away. Often, a quick question can save you a lot of time and frustration. Remember: if you’re confused, chances are others are too. diff --git a/src/content/01-topics/01-problem-solving/01-Workshop.md b/src/content/01-topics/01-problem-solving/01-Workshop.md new file mode 100644 index 0000000..c828be1 --- /dev/null +++ b/src/content/01-topics/01-problem-solving/01-Workshop.md @@ -0,0 +1,64 @@ + +> [!info] Brief description +> This page lists the **workshop questions** for this topic and provides **downloadable official solutions**. +> These questions are meant to help you apply the concepts learned in class through hands-on coding exercises. + +--- + +> [!tip] How to use this page +> - Start by attempting each question on your own. +> - Use the official solutions only to review and learn better approaches. +> - If something doesn’t make sense, **ask a TA** during or after the session. +> - Check the [Q&A page](../resources/qa.md) for common questions and clarifications. + +--- + +## 📦 Download All Solutions + +- **All official solutions (zip):** [Download all official solutions](./workshops/01-basics-data-types/official-solutions.zip) + +--- + +## 🧾 Official Questions & Solutions + +| Question # | Title / Short Description | Question (Download) | Official Solution (Download) | +|------------|---------------------------------------------------------------|---------------------------------------------------------------|------------------------------------------------------------------| +| Q1 | Simple I/O and variables — read two numbers and print the sum | [Download PDF](./workshops/01-q1-question.pdf) | [01-q1-solution.cpp](./workshops/01-q1-solution.cpp) | +| Q2 | Type conversion — integer division vs floating point | [Download PDF](./workshops/01-q2-question.pdf) | [01-q2-solution.cpp](./workshops/01-q2-solution.cpp) | +| Q3 | Using `` — compute and format results | [Download PDF](./workshops/01-q3-question.pdf) | [01-q3-solution.cpp](./workshops/01-q3-solution.cpp) | +| Q4 | Edge cases & input validation | [Download PDF](./workshops/01-q4-question.pdf) | [01-q4-solution.cpp](./workshops/01-q4-solution.cpp) | + +> [!note] Not available yet? +> Some solutions will be uploaded after the workshop or assignment deadline. Check back later or ask your TA. + +--- + +## ❓ Q&A and Support + +> [!question] Got stuck or confused? +> If something in a question or solution is unclear: +> - Revisit the lecture notes and workshop slides. +> - Check the [Q&A page](../resources/qa.md) for clarifications. +> - Ask your TA — that’s what we’re here for. + +- [Topic Q&A](../resources/qa.md) +- [Workshop Slides](./workshops/01-basics-data-types/slides.pdf) +- [Professor Slides](../lectures/01-data-types/professor-slides.pdf) + +--- + +## 🙏 Acknowledgements + +> [!success] Special thanks +> These materials were created collaboratively to support your learning. +> - You are encouraged to use and adapt the solutions **for learning**, not copying. +> - If you find an error or have a better solution, you can suggest an improvement. +> - TA and instructor feedback will be added over time. + +--- + +## ⚖️ Licensing & Usage + +> [!important] Usage note +> Official workshop solutions are for **educational use only**. Please do not repost them publicly or use them in ways that violate course policy. + diff --git a/src/content/01-topics/01-problem-solving/02-Assignment.md b/src/content/01-topics/01-problem-solving/02-Assignment.md new file mode 100644 index 0000000..06b1c05 --- /dev/null +++ b/src/content/01-topics/01-problem-solving/02-Assignment.md @@ -0,0 +1,64 @@ + +> [!info] Brief description +> This page lists the **assignment questions** for this topic and provides **downloadable official solutions**. +> These questions are meant to help you apply the concepts learned in class through hands-on coding exercises. + +--- + +> [!tip] How to use this page +> - Start by attempting each question on your own. +> - Use the official solutions only to review and learn better approaches. +> - If something doesn’t make sense, **ask a TA**. +> - Check the [Q&A page](../resources/qa.md) for common questions and clarifications. + +--- + +## 📦 Download All Solutions + +- **All official solutions (zip):** [Download all official solutions](./workshops/01-basics-data-types/official-solutions.zip) + +--- + +## 🧾 Official Questions & Solutions + +| Question # | Title / Short Description | Question (Download) | Official Solution (Download) | +|------------|---------------------------------------------------------------|---------------------------------------------------------------|------------------------------------------------------------------| +| Q1 | Simple I/O and variables — read two numbers and print the sum | [Download PDF](./workshops/01-q1-question.pdf) | [01-q1-solution.cpp](./workshops/01-q1-solution.cpp) | +| Q2 | Type conversion — integer division vs floating point | [Download PDF](./workshops/01-q2-question.pdf) | [01-q2-solution.cpp](./workshops/01-q2-solution.cpp) | +| Q3 | Using `` — compute and format results | [Download PDF](./workshops/01-q3-question.pdf) | [01-q3-solution.cpp](./workshops/01-q3-solution.cpp) | +| Q4 | Edge cases & input validation | [Download PDF](./workshops/01-q4-question.pdf) | [01-q4-solution.cpp](./workshops/01-q4-solution.cpp) | + +> [!note] Not available yet? +> Some solutions will be uploaded after the workshop or assignment deadline. Check back later or ask your TA. + +--- + +## ❓ Q&A and Support + +> [!question] Got stuck or confused? +> If something in a question or solution is unclear: +> - Revisit the lecture notes and workshop slides. +> - Check the [Q&A page](../resources/qa.md) for clarifications. +> - Ask your TA — that’s what we’re here for. + +- [Topic Q&A](../resources/qa.md) +- [Workshop Slides](./workshops/01-basics-data-types/slides.pdf) +- [Professor Slides](../lectures/01-data-types/professor-slides.pdf) + +--- + +## 🙏 Acknowledgements + +> [!success] Special thanks +> These materials were created collaboratively to support your learning. +> - You are encouraged to use and adapt the solutions **for learning**, not copying. +> - If you find an error or have a better solution, you can suggest an improvement. +> - TA and instructor feedback will be added over time. + +--- + +## ⚖️ Licensing & Usage + +> [!important] Usage note +> Official assignment solutions are for **educational use only**. Please do not repost them publicly or use them in ways that violate course policy. + diff --git a/src/content/01-topics/01-problem-solving/03-QnA.md b/src/content/01-topics/01-problem-solving/03-QnA.md new file mode 100644 index 0000000..879f02e --- /dev/null +++ b/src/content/01-topics/01-problem-solving/03-QnA.md @@ -0,0 +1,31 @@ + +# **Q&A** + +## ❓ Question 1 + +> Question: _“What’s the difference between `int` and `float` in C++?”_ + +> [!info] **Answer** +`int` stores whole numbers without decimals, while `float` stores numbers with fractional parts. +For example: +> - `int x = 5;` +> - `float y = 5.25;` + +📚 **Read more:** +- [Professor Slides](https://chatgpt.com/Slides/Topic.pdf) +- [Workshop Slides](https://chatgpt.com/Workshop/Workshop.pdf) +- [External Resource](https://cplusplus.com/doc/tutorial/variables/) + +--- + +### ❓ Question 2 + +> Question: _“Why do I need to use semicolons in C++?”_ + +> [!info] Answer +> Semicolons mark the end of a statement in C++. They help the compiler understand where one command finishes and the next begins. Without it, the compiler throws an error. + +📚 **Read more:** +- [Professor Slides](https://chatgpt.com/Slides/Topic.pdf) +- [External Resource](https://www.geeksforgeeks.org/basics-of-cpp/) + diff --git a/src/content/01-topics/02-basics-and-data-types/00-Overview.md b/src/content/01-topics/02-basics-and-data-types/00-Overview.md new file mode 100644 index 0000000..5bb6bca --- /dev/null +++ b/src/content/01-topics/02-basics-and-data-types/00-Overview.md @@ -0,0 +1,48 @@ +# 🧭 Topic: Basics of C++ & Data Types + +> [!info] Quick Overview +> This topic introduces how to compile and run C++ code, basic input/output, variables, built-in data types, and the math library. +> By the end, students will be able to write simple C++ programs using variables and standard input/output streams. + +--- +## 📌 Covered in This Topic + +- Introduction to compilation and code editors +- `cin` / `cout` basic usage +- Variables and naming conventions +- Built-in data types (`int`, `float`, `double`, `char`, `bool`) +- Type conversion +- Using the math library + +--- +## 📑 Slides & Materials + +- 👨‍🏫 [Professor Slides (PDF)](./slides/prof.pdf) +- 🧑‍🏫 [TA Workshop Slides (PDF)](./slides/ta.pdf) + +--- +## 🛠️ Workshop & Assignments + +- 💬 [Workshop Questions](./workshops) +- 🧮 [Assignments](01-Workshop.md) +- ❓ [Q&A and Common Issues](./resources/qa.md) + +--- +## 🌐 Additional Resources + +- [C++ Reference](https://cplusplus.com/reference/) +- [Learn C++](https://www.learncpp.com/) +- [Data Types in C++ (W3Schools)](https://www.w3schools.com/cpp/cpp_data_types.asp) + +_Add more useful links here as the course progresses._ + +--- +## ⏩ Navigation + +- ⬅️ [Previous Topic: Problem Solving](../02-problem-solving/topic.md) +- ➡️ [Next Topic: Conditions & Loops](../04-conditions-loops/topic.md) + +--- + +> [!tip] Tip +> If something doesn’t make sense — **don’t stay stuck alone**. Ask the TA to clarify it right away. Often, a quick question can save you a lot of time and frustration. Remember: if you’re confused, chances are others are too. diff --git a/src/content/01-topics/02-basics-and-data-types/01-Workshop.md b/src/content/01-topics/02-basics-and-data-types/01-Workshop.md new file mode 100644 index 0000000..c828be1 --- /dev/null +++ b/src/content/01-topics/02-basics-and-data-types/01-Workshop.md @@ -0,0 +1,64 @@ + +> [!info] Brief description +> This page lists the **workshop questions** for this topic and provides **downloadable official solutions**. +> These questions are meant to help you apply the concepts learned in class through hands-on coding exercises. + +--- + +> [!tip] How to use this page +> - Start by attempting each question on your own. +> - Use the official solutions only to review and learn better approaches. +> - If something doesn’t make sense, **ask a TA** during or after the session. +> - Check the [Q&A page](../resources/qa.md) for common questions and clarifications. + +--- + +## 📦 Download All Solutions + +- **All official solutions (zip):** [Download all official solutions](./workshops/01-basics-data-types/official-solutions.zip) + +--- + +## 🧾 Official Questions & Solutions + +| Question # | Title / Short Description | Question (Download) | Official Solution (Download) | +|------------|---------------------------------------------------------------|---------------------------------------------------------------|------------------------------------------------------------------| +| Q1 | Simple I/O and variables — read two numbers and print the sum | [Download PDF](./workshops/01-q1-question.pdf) | [01-q1-solution.cpp](./workshops/01-q1-solution.cpp) | +| Q2 | Type conversion — integer division vs floating point | [Download PDF](./workshops/01-q2-question.pdf) | [01-q2-solution.cpp](./workshops/01-q2-solution.cpp) | +| Q3 | Using `` — compute and format results | [Download PDF](./workshops/01-q3-question.pdf) | [01-q3-solution.cpp](./workshops/01-q3-solution.cpp) | +| Q4 | Edge cases & input validation | [Download PDF](./workshops/01-q4-question.pdf) | [01-q4-solution.cpp](./workshops/01-q4-solution.cpp) | + +> [!note] Not available yet? +> Some solutions will be uploaded after the workshop or assignment deadline. Check back later or ask your TA. + +--- + +## ❓ Q&A and Support + +> [!question] Got stuck or confused? +> If something in a question or solution is unclear: +> - Revisit the lecture notes and workshop slides. +> - Check the [Q&A page](../resources/qa.md) for clarifications. +> - Ask your TA — that’s what we’re here for. + +- [Topic Q&A](../resources/qa.md) +- [Workshop Slides](./workshops/01-basics-data-types/slides.pdf) +- [Professor Slides](../lectures/01-data-types/professor-slides.pdf) + +--- + +## 🙏 Acknowledgements + +> [!success] Special thanks +> These materials were created collaboratively to support your learning. +> - You are encouraged to use and adapt the solutions **for learning**, not copying. +> - If you find an error or have a better solution, you can suggest an improvement. +> - TA and instructor feedback will be added over time. + +--- + +## ⚖️ Licensing & Usage + +> [!important] Usage note +> Official workshop solutions are for **educational use only**. Please do not repost them publicly or use them in ways that violate course policy. + diff --git a/src/content/01-topics/02-basics-and-data-types/02-Assignment.md b/src/content/01-topics/02-basics-and-data-types/02-Assignment.md new file mode 100644 index 0000000..06b1c05 --- /dev/null +++ b/src/content/01-topics/02-basics-and-data-types/02-Assignment.md @@ -0,0 +1,64 @@ + +> [!info] Brief description +> This page lists the **assignment questions** for this topic and provides **downloadable official solutions**. +> These questions are meant to help you apply the concepts learned in class through hands-on coding exercises. + +--- + +> [!tip] How to use this page +> - Start by attempting each question on your own. +> - Use the official solutions only to review and learn better approaches. +> - If something doesn’t make sense, **ask a TA**. +> - Check the [Q&A page](../resources/qa.md) for common questions and clarifications. + +--- + +## 📦 Download All Solutions + +- **All official solutions (zip):** [Download all official solutions](./workshops/01-basics-data-types/official-solutions.zip) + +--- + +## 🧾 Official Questions & Solutions + +| Question # | Title / Short Description | Question (Download) | Official Solution (Download) | +|------------|---------------------------------------------------------------|---------------------------------------------------------------|------------------------------------------------------------------| +| Q1 | Simple I/O and variables — read two numbers and print the sum | [Download PDF](./workshops/01-q1-question.pdf) | [01-q1-solution.cpp](./workshops/01-q1-solution.cpp) | +| Q2 | Type conversion — integer division vs floating point | [Download PDF](./workshops/01-q2-question.pdf) | [01-q2-solution.cpp](./workshops/01-q2-solution.cpp) | +| Q3 | Using `` — compute and format results | [Download PDF](./workshops/01-q3-question.pdf) | [01-q3-solution.cpp](./workshops/01-q3-solution.cpp) | +| Q4 | Edge cases & input validation | [Download PDF](./workshops/01-q4-question.pdf) | [01-q4-solution.cpp](./workshops/01-q4-solution.cpp) | + +> [!note] Not available yet? +> Some solutions will be uploaded after the workshop or assignment deadline. Check back later or ask your TA. + +--- + +## ❓ Q&A and Support + +> [!question] Got stuck or confused? +> If something in a question or solution is unclear: +> - Revisit the lecture notes and workshop slides. +> - Check the [Q&A page](../resources/qa.md) for clarifications. +> - Ask your TA — that’s what we’re here for. + +- [Topic Q&A](../resources/qa.md) +- [Workshop Slides](./workshops/01-basics-data-types/slides.pdf) +- [Professor Slides](../lectures/01-data-types/professor-slides.pdf) + +--- + +## 🙏 Acknowledgements + +> [!success] Special thanks +> These materials were created collaboratively to support your learning. +> - You are encouraged to use and adapt the solutions **for learning**, not copying. +> - If you find an error or have a better solution, you can suggest an improvement. +> - TA and instructor feedback will be added over time. + +--- + +## ⚖️ Licensing & Usage + +> [!important] Usage note +> Official assignment solutions are for **educational use only**. Please do not repost them publicly or use them in ways that violate course policy. + diff --git a/src/content/01-topics/02-basics-and-data-types/03-QnA.md b/src/content/01-topics/02-basics-and-data-types/03-QnA.md new file mode 100644 index 0000000..879f02e --- /dev/null +++ b/src/content/01-topics/02-basics-and-data-types/03-QnA.md @@ -0,0 +1,31 @@ + +# **Q&A** + +## ❓ Question 1 + +> Question: _“What’s the difference between `int` and `float` in C++?”_ + +> [!info] **Answer** +`int` stores whole numbers without decimals, while `float` stores numbers with fractional parts. +For example: +> - `int x = 5;` +> - `float y = 5.25;` + +📚 **Read more:** +- [Professor Slides](https://chatgpt.com/Slides/Topic.pdf) +- [Workshop Slides](https://chatgpt.com/Workshop/Workshop.pdf) +- [External Resource](https://cplusplus.com/doc/tutorial/variables/) + +--- + +### ❓ Question 2 + +> Question: _“Why do I need to use semicolons in C++?”_ + +> [!info] Answer +> Semicolons mark the end of a statement in C++. They help the compiler understand where one command finishes and the next begins. Without it, the compiler throws an error. + +📚 **Read more:** +- [Professor Slides](https://chatgpt.com/Slides/Topic.pdf) +- [External Resource](https://www.geeksforgeeks.org/basics-of-cpp/) + diff --git a/src/content/99-assets/topics/01/slides/ta/Slide01.md b/src/content/99-assets/topics/01/slides/ta/Slide01.md new file mode 100644 index 0000000..0507637 --- /dev/null +++ b/src/content/99-assets/topics/01/slides/ta/Slide01.md @@ -0,0 +1,10 @@ + + + + + diff --git a/src/content/99-assets/topics/01/slides/ta/TestPresentation.pdf b/src/content/99-assets/topics/01/slides/ta/TestPresentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74d9a246b46b98fa93290f0d88cebe667baad9fe GIT binary patch literal 72435 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

umq4T<*er^m@2I`&iGR^(mqN)@8?$X3C;3^ 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


Q?gIQR3krPURJ6r_#Z|gj{sAh^`|Dy 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 J%H!s*{|5kR(s%#> literal 0 HcmV?d00001 diff --git a/src/content/README.md b/src/content/README.md new file mode 100644 index 0000000..e144d39 --- /dev/null +++ b/src/content/README.md @@ -0,0 +1,3 @@ +--- +title: Home +--- diff --git a/src/content/templates/assignment-template.md b/src/content/templates/assignment-template.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/templates/contributing-guidelines.md b/src/content/templates/contributing-guidelines.md new file mode 100644 index 0000000..2d80ac9 --- /dev/null +++ b/src/content/templates/contributing-guidelines.md @@ -0,0 +1,21 @@ +## 💾 General Workflow +- Pull before editing +- Push after committing +- One person = one personal notes file (e.g., `04-Notes-JohnDoe.md`) +- Shared files like `Overview.md` → edit only if you’ve pulled recently and no one else is working on it +- Do NOT change the folder structure without notice + +## 🧠 Ownership +| File Type | Who Can Edit | +| -------------------- | ------------------------------------------ | +| 04-Notes-YourName.md | The owner only | +| Overview.md | Agreed upon | +| Other Files | Anyone (coordinate via Telegram or Issues) | + + +## 🛠 Tools +- Use Obsidian Git plugin or GitHub Desktop +- Keep commit messages clear: "Add summary for CNNs", not "Update" + +## 💥 Conflicts +- If conflict occurs, ping someone experienced or back up your changes diff --git a/src/content/templates/overview-template.md b/src/content/templates/overview-template.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/templates/project-document-template.md b/src/content/templates/project-document-template.md new file mode 100644 index 0000000..e69de29 diff --git a/src/content/templates/repository-structure.md b/src/content/templates/repository-structure.md new file mode 100644 index 0000000..7f22a09 --- /dev/null +++ b/src/content/templates/repository-structure.md @@ -0,0 +1,70 @@ +├─ course-info/ +│ ├─ syllabus.md +│ ├─ references.md +│ └─ generative-ai-usage-guidelines.md +│ +├─ templates/ +│ ├─ topic-overview-template.md +│ ├─ workshop-template.md +│ └─ project-template.md +│ +├─ topics/ +│ ├─ problem-solving/ +│ │ ├─ overview.md +│ │ ├─ workshop.md +│ │ ├─ assignment.md +│ │ ├─ Q&A.md +│ ├─ basics-and-data-types/ +│.... +│ ├─ conditions-and-loops/ +│ ├─ functions-1/ +│ ├─ arrays/ +│ ├─ functions-2/ +│ ├─ pointers/ +│ ├─ file-struct/ +│ ├─ mini-project/ +│ ├─ final-project/ +│ └─ ... +│ +├─ extras/ +│ ├─ debugging-tips/ +│ ├─ version-control-and-git/ +│ └─ ... +│ +├─ assets/ +│ +└─ README.md + + + +- general + - course-info + - syllabus.md + - references.md + - generative-ai-usage-guidelines.md + - templates + - topic-overview-template.md + - workshop-template.md +- topics + - problem-solving + - overview + - workshop + - assignment + - Q & A + - basics and data types + - overview + - workshop + - assignment + - Q & A + - conditions and loops + - function-basics + - arrays + - advanced-functions + - pointers + - file-struct + - mini-project + - final-project +- extras + - debugging + - git +- assets \ No newline at end of file diff --git a/src/content/templates/workshop-template.md b/src/content/templates/workshop-template.md new file mode 100644 index 0000000..e69de29 diff --git a/src/globals.d.ts b/src/globals.d.ts new file mode 100644 index 0000000..6cf30f8 --- /dev/null +++ b/src/globals.d.ts @@ -0,0 +1,17 @@ +export declare global { + interface Document { + addEventListener( + type: K, + listener: (this: Document, ev: CustomEventMap[K]) => void, + ): void + removeEventListener( + type: K, + listener: (this: Document, ev: CustomEventMap[K]) => void, + ): void + dispatchEvent(ev: CustomEventMap[K] | UIEvent): void + } + interface Window { + spaNavigate(url: URL, isBack: boolean = false) + addCleanup(fn: (...args: any[]) => void) + } +} diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 0000000..9011ee3 --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1,15 @@ +declare module "*.scss" { + const content: string + export = content +} + +// dom custom event +interface CustomEventMap { + prenav: CustomEvent<{}> + nav: CustomEvent<{ url: FullSlug }> + themechange: CustomEvent<{ theme: "light" | "dark" }> + readermodechange: CustomEvent<{ mode: "on" | "off" }> +} + +type ContentIndex = Record +declare const fetchData: Promise diff --git a/src/package-lock.json b/src/package-lock.json new file mode 100644 index 0000000..befe9d2 --- /dev/null +++ b/src/package-lock.json @@ -0,0 +1,7147 @@ +{ + "name": "@jackyzha0/quartz", + "version": "4.5.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@jackyzha0/quartz", + "version": "4.5.1", + "license": "MIT", + "dependencies": { + "@clack/prompts": "^0.11.0", + "@floating-ui/dom": "^1.7.0", + "@myriaddreamin/rehype-typst": "^0.6.0", + "@napi-rs/simple-git": "0.1.19", + "@tweenjs/tween.js": "^25.0.0", + "@webgpu/types": "^0.1.61", + "ansi-truncate": "^1.2.0", + "async-mutex": "^0.5.0", + "chokidar": "^4.0.3", + "cli-spinner": "^0.2.10", + "d3": "^7.9.0", + "esbuild-sass-plugin": "^3.3.1", + "flexsearch": "0.7.43", + "github-slugger": "^2.0.0", + "globby": "^14.1.0", + "gray-matter": "^4.0.3", + "hast-util-to-html": "^9.0.5", + "hast-util-to-jsx-runtime": "^2.3.6", + "hast-util-to-string": "^3.0.1", + "is-absolute-url": "^4.0.1", + "js-yaml": "^4.1.0", + "lightningcss": "^1.30.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", + "minimatch": "^10.0.1", + "pixi.js": "^8.9.2", + "preact": "^10.26.7", + "preact-render-to-string": "^6.5.13", + "pretty-bytes": "^7.0.0", + "pretty-time": "^1.1.0", + "reading-time": "^1.5.0", + "rehype-autolink-headings": "^7.1.0", + "rehype-citation": "^2.3.1", + "rehype-katex": "^7.0.1", + "rehype-mathjax": "^7.1.0", + "rehype-pretty-code": "^0.14.1", + "rehype-raw": "^7.0.0", + "rehype-slug": "^6.0.0", + "remark": "^15.0.1", + "remark-breaks": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "rfdc": "^1.4.1", + "satori": "^0.13.1", + "serve-handler": "^6.1.6", + "sharp": "^0.34.2", + "shiki": "^1.26.2", + "source-map-support": "^0.5.21", + "to-vfile": "^8.0.0", + "toml": "^3.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3", + "workerpool": "^9.2.0", + "ws": "^8.18.2", + "yargs": "^18.0.0" + }, + "bin": { + "quartz": "quartz/bootstrap-cli.mjs" + }, + "devDependencies": { + "@types/d3": "^7.4.3", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/node": "^22.15.23", + "@types/pretty-time": "^1.1.5", + "@types/source-map-support": "^0.5.10", + "@types/ws": "^8.18.1", + "@types/yargs": "^17.0.33", + "esbuild": "^0.25.5", + "prettier": "^3.5.3", + "tsx": "^4.19.4", + "typescript": "^5.8.3" + }, + "engines": { + "node": ">=22", + "npm": ">=10.9.2" + } + }, + "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", + "integrity": "sha512-dgeGqYDSQmn2MtnWZkwPGpJQPh43yr1lAAr9jl1NJ9pIY1RXUQxtlAUZVur0V9PHdbfQC+kkvB1KC3VpgVV3MA==", + "dependencies": { + "@citation-js/date": "^0.5.0", + "@citation-js/name": "^0.4.2", + "fetch-ponyfill": "^7.1.0", + "sync-fetch": "^0.4.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@citation-js/date": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@citation-js/date/-/date-0.5.1.tgz", + "integrity": "sha512-1iDKAZ4ie48PVhovsOXQ+C6o55dWJloXqtznnnKy6CltJBQLIuLLuUqa8zlIvma0ZigjVjgDUhnVaNU1MErtZw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@citation-js/name": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@citation-js/name/-/name-0.4.2.tgz", + "integrity": "sha512-brSPsjs2fOVzSnARLKu0qncn6suWjHVQtrqSUrnqyaRH95r/Ad4wPF5EsoWr+Dx8HzkCGb/ogmoAzfCsqlTwTQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@citation-js/plugin-bibjson": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-bibjson/-/plugin-bibjson-0.7.14.tgz", + "integrity": "sha512-Hcmk01KrpHwcl5uVoLE6TRaJRFg7/qUvpJDcKqx3LLLCsNbaBlISfRDeFETrjjipTetkX70RvtS7FfGUN58gCQ==", + "dependencies": { + "@citation-js/date": "^0.5.0", + "@citation-js/name": "^0.4.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@citation-js/core": "^0.7.0" + } + }, + "node_modules/@citation-js/plugin-bibtex": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-bibtex/-/plugin-bibtex-0.7.14.tgz", + "integrity": "sha512-xHOHqhF6dthLRv46N9U+mQgYLiiWQHLvQWK9+mcBKz+/3NWge62Xb1oBouNWwLEPd5FV/8gp9fp7SOp93T0dUg==", + "dependencies": { + "@citation-js/date": "^0.5.0", + "@citation-js/name": "^0.4.2", + "moo": "^0.5.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@citation-js/core": "^0.7.0" + } + }, + "node_modules/@citation-js/plugin-csl": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-csl/-/plugin-csl-0.7.14.tgz", + "integrity": "sha512-7AKB8lMz1IqdtoE33NnWIpteLYMuSl3xqT+Cax7sQKwAIJEoq2HBmb43Ja8xQQ36nREAupQJv1V6XksIAmYnCg==", + "dependencies": { + "@citation-js/date": "^0.5.0", + "citeproc": "^2.4.6" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@citation-js/core": "^0.7.0" + } + }, + "node_modules/@clack/core": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz", + "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz", + "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==", + "license": "MIT", + "dependencies": { + "@clack/core": "0.5.0", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", + "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", + "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.1.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", + "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", + "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.1.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", + "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", + "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", + "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", + "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "cpu": [ + "ppc64" + ], + "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.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", + "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", + "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", + "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "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.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", + "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "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.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", + "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", + "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.1.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", + "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", + "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.1.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", + "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", + "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.1.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", + "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", + "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.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", + "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", + "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.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", + "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", + "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.1.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", + "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.4.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", + "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", + "cpu": [ + "arm64" + ], + "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-ia32": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", + "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", + "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.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", + "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", + "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/@myriaddreamin/rehype-typst": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/rehype-typst/-/rehype-typst-0.6.0.tgz", + "integrity": "sha512-WQpr2j7OYtyc2Q1WOqi1wzYrBaeuAWT1Cn1Ki6VPsKoWH7O86/+zKOqltdgMpYdkav1uXYs3RfO5Ir8h0WkZyQ==", + "license": "MIT", + "dependencies": { + "@myriaddreamin/typst-ts-node-compiler": "^0.6.0", + "@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.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler/-/typst-ts-node-compiler-0.6.0.tgz", + "integrity": "sha512-C40MzRKZ8pDWzrS7VOtTypGyFaHTuZFFx3o/uQ6ryS2GqZkK3vGox4lIpR7ct11UHiAjQNR3LFQ5WjQ7P3niBQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-android-arm64": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-darwin-arm64": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-darwin-x64": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-linux-x64-musl": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc": "0.6.0", + "@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc": "0.6.0" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm-eabi/-/typst-ts-node-compiler-android-arm-eabi-0.6.0.tgz", + "integrity": "sha512-Gfrf9Fky5iYtutGWYwqRC4gvllK1p1q6YELCbycI47NCFptONI++3dfub4PixWRn9m8NrmaNFIBQSyLHWsvbLw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-android-arm64": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-android-arm64/-/typst-ts-node-compiler-android-arm64-0.6.0.tgz", + "integrity": "sha512-EzO6W4xELC6at30hSkkOp5BveszwCmTWceu0PMh6lPxeQF1vnjxUK60MLFfJ40zb1TOXsj4l2pbdBoGqLznC1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-darwin-arm64": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-arm64/-/typst-ts-node-compiler-darwin-arm64-0.6.0.tgz", + "integrity": "sha512-8tR1GqFr+q4rNZm8z0230eF7eRCVCSaUefDw1+Qw8EnDPIvwEP8bT0/u2YqHmxthfVfs1msV8hDpRKVeBa6E3g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@myriaddreamin/typst-ts-node-compiler-darwin-x64": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-darwin-x64/-/typst-ts-node-compiler-darwin-x64-0.6.0.tgz", + "integrity": "sha512-eytv5ifNvhux9naqEb+4pu1Z4ghQBWiybP4lT/aB44I9H5xjmtYQxiKwNBz54am6RLiMcyLpw/xFdeB13bsdWA==", + "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.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm-gnueabihf/-/typst-ts-node-compiler-linux-arm-gnueabihf-0.6.0.tgz", + "integrity": "sha512-b20do+PmbsYq07QlTW8uLU3MaoAm6DSCx1IrCEAlUpNH+/29x51Rvyq5JeRrYVOtkR6BxPzyhCM79r5jOkewbQ==", + "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.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-gnu/-/typst-ts-node-compiler-linux-arm64-gnu-0.6.0.tgz", + "integrity": "sha512-AM92MVfEbISYvIA8NwPl2l78nOZIh5er5qQ/NZw2kx4YgTKgklJINEPHXm/aAk7PcpX7G10P45D/xGd5KpX9HQ==", + "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.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-arm64-musl/-/typst-ts-node-compiler-linux-arm64-musl-0.6.0.tgz", + "integrity": "sha512-nSokVjKQR0ZH7Jub53q7he89+m72RSbL97exSedkB4OdZAi9tAxGFIgceGJuN5AC+DiNtMmqsPwlJiERUjgPhQ==", + "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.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-gnu/-/typst-ts-node-compiler-linux-x64-gnu-0.6.0.tgz", + "integrity": "sha512-3Y2ORiYuCTzQkiHSCHWiGuzTBbNvHTB2lCr3DDsZdvTZ2LZMifPwwICN26X3tlnt6GyC3o/ejZBcMnfNqYbdCw==", + "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.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-linux-x64-musl/-/typst-ts-node-compiler-linux-x64-musl-0.6.0.tgz", + "integrity": "sha512-b+kTb4vI0sFTkPtIAUE+UqjhZ4kTiAkh4F/2QKnFitAsURlLcRwTcMc9NJm6SXwW1OM0nPj1IGTfUOFpqLOIPQ==", + "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.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-arm64-msvc/-/typst-ts-node-compiler-win32-arm64-msvc-0.6.0.tgz", + "integrity": "sha512-04omIPrXSsRKu4XDhj1WZ9uMjdcFcejBGzyOEV351HVDqg5kxgDB32iG3oLySLrzEcbi9WwI5Si46WrW0wh4mA==", + "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.6.0", + "resolved": "https://registry.npmjs.org/@myriaddreamin/typst-ts-node-compiler-win32-x64-msvc/-/typst-ts-node-compiler-win32-x64-msvc-0.6.0.tgz", + "integrity": "sha512-w5UEmXSZ+Eg7Y04EzjgqeHUo7P8bNz9S1c4CUfLrbfZvbTmYNjA0WeqZJ3+tV03BSVxiPiVhrfo95sLqKISNrg==", + "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", + "integrity": "sha512-jMxvwzkKzd3cXo2EB9GM2ic0eYo2rP/BS6gJt6HnWbsDO1O8GSD4k7o2Cpr2YERtMpGF/MGcDfsfj2EbQPtrXw==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@napi-rs/simple-git-android-arm-eabi": "0.1.19", + "@napi-rs/simple-git-android-arm64": "0.1.19", + "@napi-rs/simple-git-darwin-arm64": "0.1.19", + "@napi-rs/simple-git-darwin-x64": "0.1.19", + "@napi-rs/simple-git-freebsd-x64": "0.1.19", + "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.19", + "@napi-rs/simple-git-linux-arm64-gnu": "0.1.19", + "@napi-rs/simple-git-linux-arm64-musl": "0.1.19", + "@napi-rs/simple-git-linux-powerpc64le-gnu": "0.1.19", + "@napi-rs/simple-git-linux-s390x-gnu": "0.1.19", + "@napi-rs/simple-git-linux-x64-gnu": "0.1.19", + "@napi-rs/simple-git-linux-x64-musl": "0.1.19", + "@napi-rs/simple-git-win32-arm64-msvc": "0.1.19", + "@napi-rs/simple-git-win32-x64-msvc": "0.1.19" + } + }, + "node_modules/@napi-rs/simple-git-android-arm-eabi": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.19.tgz", + "integrity": "sha512-XryEH/hadZ4Duk/HS/HC/cA1j0RHmqUGey3MsCf65ZS0VrWMqChXM/xlTPWuY5jfCc/rPubHaqI7DZlbexnX/g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-android-arm64": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.19.tgz", + "integrity": "sha512-ZQ0cPvY6nV9p7zrR9ZPo7hQBkDAcY/CHj3BjYNhykeUCiSNCrhvwX+WEeg5on8M1j4d5jcI/cwVG2FslfiByUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-darwin-arm64": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.19.tgz", + "integrity": "sha512-viZB5TYgjA1vH+QluhxZo0WKro3xBA+1xSzYx8mcxUMO5gnAoUMwXn0ZO/6Zy6pai+aGae+cj6XihGnrBRu3Pg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-darwin-x64": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.19.tgz", + "integrity": "sha512-6dNkzSNUV5X9rsVYQbpZLyJu4Gtkl2vNJ3abBXHX/Etk0ILG5ZasO3ncznIANZQpqcbn/QPHr49J2QYAXGoKJA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-freebsd-x64": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-freebsd-x64/-/simple-git-freebsd-x64-0.1.19.tgz", + "integrity": "sha512-sB9krVIchzd20FjI2ZZ8FDsTSsXLBdnwJ6CpeVyrhXHnoszfcqxt49ocZHujAS9lMpXq7i2Nv1EXJmCy4KdhwA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.19.tgz", + "integrity": "sha512-6HPn09lr9N1n5/XKfP8Np53g4fEXVxOFqNkS6rTH3Rm1lZHdazTRH62RggXLTguZwjcE+MvOLvoTIoR5kAS8+g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm64-gnu": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.19.tgz", + "integrity": "sha512-G0gISckt4cVDp3oh5Z6PV3GHJrJO6Z8bIS+9xA7vTtKdqB1i5y0n3cSFLlzQciLzhr+CajFD27doW4lEyErQ/Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm64-musl": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.19.tgz", + "integrity": "sha512-OwTRF+H4IZYxmDFRi1IrLMfqbdIpvHeYbJl2X94NVsLVOY+3NUHvEzL3fYaVx5urBaMnIK0DD3wZLbcueWvxbA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-powerpc64le-gnu": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-powerpc64le-gnu/-/simple-git-linux-powerpc64le-gnu-0.1.19.tgz", + "integrity": "sha512-p7zuNNVyzpRvkCt2RIGv9FX/WPcPbZ6/FRUgUTZkA2WU33mrbvNqSi4AOqCCl6mBvEd+EOw5NU4lS9ORRJvAEg==", + "cpu": [ + "powerpc64le" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-s390x-gnu": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-s390x-gnu/-/simple-git-linux-s390x-gnu-0.1.19.tgz", + "integrity": "sha512-6N2vwJUPLiak8GLrS0a3is0gSb0UwI2CHOOqtvQxPmv+JVI8kn3vKiUscsktdDb0wGEPeZ8PvZs0y8UWix7K4g==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-x64-gnu": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.19.tgz", + "integrity": "sha512-61YfeO1J13WK7MalLgP3QlV6of2rWnVw1aqxWkAgy/lGxoOFSJ4Wid6ANVCEZk4tJpPX/XNeneqkUz5xpeb2Cw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-x64-musl": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.19.tgz", + "integrity": "sha512-cCTWNpMJnN3PrUBItWcs3dQKCydsIasbrS3laMzq8k7OzF93Zrp2LWDTPlLCO9brbBVpBzy2Qk5Xg9uAfe/Ukw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-win32-arm64-msvc": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.19.tgz", + "integrity": "sha512-sWavb1BjeLKKBA+PbTsRSSzVNfb7V/dOpaJvkgR5d2kWFn/AHmCZHSSj/3nyZdYf0BdDC+DIvqk3daAEZ6QMVw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-win32-x64-msvc": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.19.tgz", + "integrity": "sha512-FmNuPoK4+qwaSCkp8lm3sJlrxk374enW+zCE5ZksXlZzj/9BDJAULJb5QUJ7o9Y8A/G+d8LkdQLPBE2Jaxe5XA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==", + "license": "MIT" + }, + "node_modules/@shikijs/core": { + "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.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.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.26.2.tgz", + "integrity": "sha512-ngkIu9swLVo9Zt5QBtz5Sk08vmPcwuj01r7pPK/Zjmo2U2WyKMK4WMUMmkdQiUacdcLth0zt8u1onp4zhkFXKQ==", + "dependencies": { + "@shikijs/types": "1.26.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^1.0.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "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.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "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.2" + } + }, + "node_modules/@shikijs/themes": { + "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.2" + } + }, + "node_modules/@shikijs/types": { + "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" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "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", + "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", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", + "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==", + "license": "MIT" + }, + "node_modules/@types/css-font-loading-module": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz", + "integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==", + "license": "MIT" + }, + "node_modules/@types/d3": { + "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": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "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 + }, + "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": "*" + } + }, + "node_modules/@types/d3-brush": { + "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": "*" + } + }, + "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 + }, + "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 + }, + "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": "*" + } + }, + "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 + }, + "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 + }, + "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": "*" + } + }, + "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 + }, + "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 + }, + "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": "*" + } + }, + "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 + }, + "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 + }, + "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": "*" + } + }, + "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 + }, + "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": "*" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "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": "*" + } + }, + "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 + }, + "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 + }, + "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": "*" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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": "*" + } + }, + "node_modules/@types/d3-zoom": { + "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": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/earcut": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", + "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", + "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", + "dependencies": { + "@types/estree": "*" + } + }, + "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 + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==" + }, + "node_modules/@types/mathjax": { + "version": "0.0.40", + "resolved": "https://registry.npmjs.org/@types/mathjax/-/mathjax-0.0.40.tgz", + "integrity": "sha512-rHusx08LCg92WJxrsM3SPjvLTSvK5C+gealtSuhKbEOcUZfWlwigaFoPLf6Dfxhg4oryN5qP9Sj7zOQ4HYXINw==" + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "22.15.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.23.tgz", + "integrity": "sha512-7Ec1zaFPF4RJ0eXu1YT/xgiebqwqoJz8rYPDi/O2BcZ++Wpt0Kq9cl0eg6NN6bYbPnR67ZLo7St5Q3UK0SnARw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/pretty-time": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/pretty-time/-/pretty-time-1.1.5.tgz", + "integrity": "sha512-5yl+BYwmnRWZb783W8YYoHXvPY8q/rp7ctHBVaGBB9RxlzGpHNJ72tGQMK7TrUSnxzl1dbDcBDuBCSbtfnSQGg==", + "dev": true + }, + "node_modules/@types/source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==", + "dev": true, + "dependencies": { + "source-map": "^0.6.0" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@webgpu/types": { + "version": "0.1.61", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.61.tgz", + "integrity": "sha512-w2HbBvH+qO19SB5pJOJFKs533CdZqxl3fcGonqL321VHkW7W/iBo6H8bjDy6pr/+pbMwIu5dnuaAxH7NxBqUrQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-truncate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ansi-truncate/-/ansi-truncate-1.2.0.tgz", + "integrity": "sha512-/SLVrxNIP8o8iRHjdK3K9s2hDqdvb86NEjZOAB6ecWFsOo+9obaby97prnvAPn6j7ExXCpbvtlJFYPkkspg4BQ==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^1.2.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "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", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "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", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/citeproc": { + "version": "2.4.63", + "resolved": "https://registry.npmjs.org/citeproc/-/citeproc-2.4.63.tgz", + "integrity": "sha512-68F95Bp4UbgZU/DBUGQn0qV3HDZLCdI9+Bb2ByrTaNJDL5VEm9LqaiNaxljsvoaExSLEXe1/r6n2Z06SCzW3/Q==" + }, + "node_modules/cli-spinner": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", + "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "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", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "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", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "peer": true + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "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-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", + "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/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "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.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" + }, + "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/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", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/esbuild-sass-plugin": { + "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.8", + "safe-identifier": "^0.4.2", + "sass": "^1.71.1" + }, + "peerDependencies": { + "esbuild": ">=0.20.1", + "sass-embedded": "^1.71.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "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", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-string-truncated-width": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-1.2.1.tgz", + "integrity": "sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fetch-ponyfill": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-7.1.0.tgz", + "integrity": "sha512-FhbbL55dj/qdVO3YNK7ZEkshvj3eQ7EuIGV2I6ic/2YiocvyWv+7jg2s4AyS0wdRU75s3tA8ZxI/xPigb0v5Aw==", + "dependencies": { + "node-fetch": "~2.6.1" + } + }, + "node_modules/fetch-ponyfill/node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/fetch-ponyfill/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/fetch-ponyfill/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/fetch-ponyfill/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "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.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flexsearch": { + "version": "0.7.43", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz", + "integrity": "sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==" + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fsevents": { + "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": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gifuct-js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gifuct-js/-/gifuct-js-2.1.2.tgz", + "integrity": "sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg==", + "license": "MIT", + "dependencies": { + "js-binary-schema-parser": "^2.0.3" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "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", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-dom": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz", + "integrity": "sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==", + "dependencies": { + "@types/hast": "^3.0.0", + "hastscript": "^8.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-dom": "^5.0.0", + "hast-util-from-html": "^2.0.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/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/hast-util-from-html/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/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/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", + "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/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/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/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/hast-util-to-html/node_modules/property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/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/hast-util-to-jsx-runtime/node_modules/property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz", + "integrity": "sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text/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/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "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-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "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.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "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", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", + "license": "MIT" + }, + "node_modules/js-binary-schema-parser": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz", + "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/katex": { + "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" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "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/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mathjax-full": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", + "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==", + "dependencies": { + "esm": "^3.2.25", + "mhchemparser": "^4.1.0", + "mj-context-menu": "^0.6.1", + "speech-rule-engine": "^4.0.6" + } + }, + "node_modules/mdast-util-find-and-replace": { + "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", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^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", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/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-from-markdown/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "longest-streak": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.1.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/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-mdx-jsx/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-newline-to-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz", + "integrity": "sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-find-and-replace": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", + "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.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", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/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-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mhchemparser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", + "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==" + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.0.0.tgz", + "integrity": "sha512-iJ2Q28vBoEovLN5o3GO12CpqorQRYDPT+p4zW50tGwTfJB+iv/VnB6Ini+gqa24K97DwptMBBIvVX6Bjk49oyQ==", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromorph": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/micromorph/-/micromorph-0.4.5.tgz", + "integrity": "sha512-Erasr0xiDvDeEhh7B/k7RFTwwfaAX10D7BMorNpokkwDh6XsRLYWDPaWF1m5JQeMSkGdqlEtQ8s68NcdDWuGgw==" + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mj-context-menu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", + "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==" + }, + "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.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", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/oniguruma-to-es": { + "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", + "regex-recursion": "^5.1.1" + } + }, + "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", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-latin/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/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "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": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pixi.js": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.9.2.tgz", + "integrity": "sha512-oLFBkOOA/O6OpT5T8o05AxgZB9x9yWNzEQ+WTNZZFoCvfU2GdT4sFTjpVFuHQzgZPmAm/1IFhKdNiXVnlL8PRw==", + "license": "MIT", + "dependencies": { + "@pixi/colord": "^2.9.6", + "@types/css-font-loading-module": "^0.0.12", + "@types/earcut": "^2.1.4", + "@webgpu/types": "^0.1.40", + "@xmldom/xmldom": "^0.8.10", + "earcut": "^2.2.4", + "eventemitter3": "^5.0.1", + "gifuct-js": "^2.1.2", + "ismobilejs": "^1.1.1", + "parse-svg-path": "^0.1.2" + } + }, + "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.26.7", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.7.tgz", + "integrity": "sha512-43xS+QYc1X1IPbw03faSgY6I6OYWcLrJRv3hU0+qMOfh/XCHcP0MX2CVjNARYR2cC/guu975sta4OcjlczxD7g==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "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" + } + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-bytes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-7.0.0.tgz", + "integrity": "sha512-U5otLYPR3L0SVjHGrkEUx5mf7MxV2ceXeE7VwWPk+hyzC5drNohsOGNPDZqxCqyX1lkbEN4kl1LiI8QFd7r0ZA==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readdirp": { + "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": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/regex": { + "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.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" + } + }, + "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", + "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz", + "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-citation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/rehype-citation/-/rehype-citation-2.3.1.tgz", + "integrity": "sha512-bwSuB5SMilyS/vT7K7ByTxjeKda4GWJin6dHKKZyp5O2z+uLk2ySG7a5/IOmuGovoajN9AcYxTRE4kUiVTk51g==", + "license": "MIT", + "dependencies": { + "@citation-js/core": "^0.7.14", + "@citation-js/date": "^0.5.1", + "@citation-js/name": "^0.4.2", + "@citation-js/plugin-bibjson": "^0.7.14", + "@citation-js/plugin-bibtex": "^0.7.14", + "@citation-js/plugin-csl": "^0.7.14", + "citeproc": "^2.4.63", + "cross-fetch": "^4.0.0", + "hast-util-from-dom": "^5.0.0", + "hast-util-from-parse5": "^8.0.1", + "js-yaml": "^4.1.0", + "parse5": "^7.1.2", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0" + } + }, + "node_modules/rehype-katex": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz", + "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", + "dependencies": { + "@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", + "katex": "^0.16.0", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-mathjax": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/rehype-mathjax/-/rehype-mathjax-7.1.0.tgz", + "integrity": "sha512-mJHNpoqCC5UZ24OKx0wNjlzV18qeJz/Q/LtEjxXzt8vqrZ1Z3GxQnVrHcF5/PogcXUK8cWwJ4U/LWOQWEiABHw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mathjax": "^0.0.40", + "hast-util-to-text": "^4.0.0", + "hastscript": "^9.0.0", + "mathjax-full": "^3.0.0", + "unified": "^11.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-mathjax/node_modules/hastscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.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", + "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-pretty-code": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.14.1.tgz", + "integrity": "sha512-IpG4OL0iYlbx78muVldsK86hdfNoht0z63AP7sekQNW2QOTmjxB7RbTO+rhIYNGRljgHxgVZoPwUl6bIC9SbjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "hast-util-to-string": "^3.0.0", + "parse-numeric-range": "^1.3.0", + "rehype-parse": "^9.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "shiki": "^1.0.0 || ^2.0.0 || ^3.0.0" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "dependencies": { + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "dependencies": { + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-breaks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz", + "integrity": "sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-newline-to-break": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-math": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz", + "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-math": "^3.0.0", + "micromark-extension-math": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.1.0.tgz", + "integrity": "sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "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.79.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", + "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "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/satori": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.13.1.tgz", + "integrity": "sha512-FlXblaCRDOONmz4JSIG9lUxSIklBZsMVwfLkvXv0MaHa3H6GWZDZccpcCeLqdQ6RjBkYMSh6zZDxkkBFJ4M61A==", + "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-gradient-parser": "^0.0.16", + "css-to-react-native": "^3.0.0", + "emoji-regex-xs": "^2.0.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-xs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "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", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sharp": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", + "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.2", + "@img/sharp-darwin-x64": "0.34.2", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.2", + "@img/sharp-linux-arm64": "0.34.2", + "@img/sharp-linux-s390x": "0.34.2", + "@img/sharp-linux-x64": "0.34.2", + "@img/sharp-linuxmusl-arm64": "0.34.2", + "@img/sharp-linuxmusl-x64": "0.34.2", + "@img/sharp-wasm32": "0.34.2", + "@img/sharp-win32-arm64": "0.34.2", + "@img/sharp-win32-ia32": "0.34.2", + "@img/sharp-win32-x64": "0.34.2" + } + }, + "node_modules/shiki": { + "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.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" + } + }, + "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", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speech-rule-engine": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz", + "integrity": "sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==", + "dependencies": { + "commander": "9.2.0", + "wicked-good-xpath": "1.3.0", + "xmldom-sre": "0.1.31" + }, + "bin": { + "sre": "bin/sre" + } + }, + "node_modules/speech-rule-engine/node_modules/commander": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-js": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.8" + } + }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "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", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-fetch": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.4.5.tgz", + "integrity": "sha512-esiWJ7ixSKGpd9DJPBTC4ckChqdOjIwJfYhVHkcQ2Gnm41323p1TRmEI+esTQ9ppD+b5opps2OTEGTCGX5kF+g==", + "dependencies": { + "buffer": "^5.7.1", + "node-fetch": "^2.6.1" + }, + "engines": { + "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/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-vfile": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-8.0.0.tgz", + "integrity": "sha512-IcmH1xB5576MJc9qcfEC/m/nQCFt3fzMHz45sSlgJyTWjRbKW1HAkJpuf3DgE57YzIlZcwcBZA5ENQbBo4aLkg==", + "dependencies": { + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsx": { + "version": "4.19.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", + "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/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-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after/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-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" + }, + "funding": { + "type": "opencollective", + "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", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children/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-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position/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-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/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": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children/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-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" + }, + "funding": { + "type": "opencollective", + "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/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", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/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/vfile/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/vfile/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==" + }, + "node_modules/workerpool": { + "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": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==", + "engines": { + "node": ">=0.1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "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", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/src/package.json b/src/package.json new file mode 100644 index 0000000..ba07693 --- /dev/null +++ b/src/package.json @@ -0,0 +1,115 @@ +{ + "name": "@jackyzha0/quartz", + "description": "🌱 publish your digital garden and notes as a website", + "private": true, + "version": "4.5.1", + "type": "module", + "author": "jackyzha0 ", + "license": "MIT", + "homepage": "https://quartz.jzhao.xyz", + "repository": { + "type": "git", + "url": "https://github.com/jackyzha0/quartz.git" + }, + "scripts": { + "quartz": "./quartz/bootstrap-cli.mjs", + "docs": "npx quartz build --serve -d docs", + "check": "tsc --noEmit && npx prettier . --check", + "format": "npx prettier . --write", + "test": "tsx --test", + "profile": "0x -D prof ./quartz/bootstrap-cli.mjs build --concurrency=1" + }, + "engines": { + "npm": ">=10.9.2", + "node": ">=22" + }, + "keywords": [ + "site generator", + "ssg", + "digital-garden", + "markdown", + "blog", + "quartz" + ], + "bin": { + "quartz": "./quartz/bootstrap-cli.mjs" + }, + "dependencies": { + "@clack/prompts": "^0.11.0", + "@floating-ui/dom": "^1.7.0", + "@myriaddreamin/rehype-typst": "^0.6.0", + "@napi-rs/simple-git": "0.1.19", + "@tweenjs/tween.js": "^25.0.0", + "@webgpu/types": "^0.1.61", + "ansi-truncate": "^1.2.0", + "async-mutex": "^0.5.0", + "chokidar": "^4.0.3", + "cli-spinner": "^0.2.10", + "d3": "^7.9.0", + "esbuild-sass-plugin": "^3.3.1", + "flexsearch": "0.7.43", + "github-slugger": "^2.0.0", + "globby": "^14.1.0", + "gray-matter": "^4.0.3", + "hast-util-to-html": "^9.0.5", + "hast-util-to-jsx-runtime": "^2.3.6", + "hast-util-to-string": "^3.0.1", + "is-absolute-url": "^4.0.1", + "js-yaml": "^4.1.0", + "lightningcss": "^1.30.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", + "minimatch": "^10.0.1", + "pixi.js": "^8.9.2", + "preact": "^10.26.7", + "preact-render-to-string": "^6.5.13", + "pretty-bytes": "^7.0.0", + "pretty-time": "^1.1.0", + "reading-time": "^1.5.0", + "rehype-autolink-headings": "^7.1.0", + "rehype-citation": "^2.3.1", + "rehype-katex": "^7.0.1", + "rehype-mathjax": "^7.1.0", + "rehype-pretty-code": "^0.14.1", + "rehype-raw": "^7.0.0", + "rehype-slug": "^6.0.0", + "remark": "^15.0.1", + "remark-breaks": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "rfdc": "^1.4.1", + "satori": "^0.13.1", + "serve-handler": "^6.1.6", + "sharp": "^0.34.2", + "shiki": "^1.26.2", + "source-map-support": "^0.5.21", + "to-vfile": "^8.0.0", + "toml": "^3.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3", + "workerpool": "^9.2.0", + "ws": "^8.18.2", + "yargs": "^18.0.0" + }, + "devDependencies": { + "@types/d3": "^7.4.3", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/node": "^22.15.23", + "@types/pretty-time": "^1.1.5", + "@types/source-map-support": "^0.5.10", + "@types/ws": "^8.18.1", + "@types/yargs": "^17.0.33", + "esbuild": "^0.25.5", + "prettier": "^3.5.3", + "tsx": "^4.19.4", + "typescript": "^5.8.3" + } +} diff --git a/src/quartz.config.ts b/src/quartz.config.ts new file mode 100644 index 0000000..884f034 --- /dev/null +++ b/src/quartz.config.ts @@ -0,0 +1,100 @@ +import { QuartzConfig } from "./quartz/cfg" +import * as Plugin from "./quartz/plugins" +/** + * Quartz 4 Configuration + * + * See https://quartz.jzhao.xyz/configuration for more information. + */ +const config: QuartzConfig = { + configuration: { + pageTitle: "C++", + pageTitleSuffix: "", + enableSPA: true, + enablePopovers: true, + analytics: { + provider: "plausible", + }, + locale: "en-US", + baseUrl: "quartz.jzhao.xyz", + ignorePatterns: ["private", "templates", ".obsidian"], + defaultDateType: "modified", + theme: { + fontOrigin: "googleFonts", + cdnCaching: true, + typography: { + header: "Space Grotesk", + body: "Work Sans", + code: "IBM Plex Mono", + }, + colors: { + lightMode: { + light: "#faf8f8", + lightgray: "#e5e5e5", + gray: "#b8b8b8", + darkgray: "#4e4e4e", + dark: "#2b2b2b", + secondary: "#284b63", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)", + textHighlight: "#fff23688", + }, + darkMode: { + light: "#161618", + lightgray: "#393639", + gray: "#646464", + darkgray: "#d4d4d4", + dark: "#ebebec", + secondary: "#7b97aa", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)", + textHighlight: "#b3aa0288", + }, + }, + }, + + }, + plugins: { + transformers: [ + Plugin.FrontMatter(), + Plugin.CreatedModifiedDate({ + priority: ["frontmatter", "git", "filesystem"], + }), + Plugin.SyntaxHighlighting({ + theme: { + light: "github-light", + dark: "github-dark", + }, + keepBackground: false, + }), + Plugin.ObsidianFlavoredMarkdown({ enableInHtmlEmbed: true }), + Plugin.RoamFlavoredMarkdown(), + Plugin.GitHubFlavoredMarkdown(), + Plugin.TableOfContents(), + Plugin.CrawlLinks({ markdownLinkResolution: "shortest" }), + Plugin.Description(), + Plugin.Latex({ renderEngine: "katex" }), + ], + filters: [Plugin.RemoveDrafts()], + emitters: [ + Plugin.AliasRedirects(), + Plugin.ComponentResources(), + Plugin.ContentPage(), + Plugin.FolderPage(), + Plugin.TagPage(), + Plugin.ContentIndex({ + enableSiteMap: true, + enableRSS: true, + }), + Plugin.Assets(), + Plugin.Static(), + Plugin.Favicon(), + Plugin.NotFoundPage(), + // Comment out CustomOgImages to speed up build time + Plugin.CustomOgImages(), + ], + }, +} + + + +export default config diff --git a/src/quartz.layout.ts b/src/quartz.layout.ts new file mode 100644 index 0000000..970a5be --- /dev/null +++ b/src/quartz.layout.ts @@ -0,0 +1,68 @@ +import { PageLayout, SharedLayout } from "./quartz/cfg" +import * as Component from "./quartz/components" + +// components shared across all pages +export const sharedPageComponents: SharedLayout = { + head: Component.Head(), + header: [], + afterBody: [], + footer: Component.Footer({ + links: { + GitHub: "https://github.com/jackyzha0/quartz", + "Discord Community": "https://discord.gg/cRFFHYye7t", + }, + }), +} + +// components for pages that display a single page (e.g. a single note) +export const defaultContentPageLayout: PageLayout = { + beforeBody: [ + Component.ConditionalRender({ + component: Component.Breadcrumbs(), + condition: (page) => page.fileData.slug !== "index", + }), + Component.ArticleTitle(), + Component.ContentMeta(), + Component.TagList(), + ], + left: [ + Component.PageTitle(), + Component.MobileOnly(Component.Spacer()), + Component.Flex({ + components: [ + { + Component: Component.Search(), + grow: true, + }, + { Component: Component.Darkmode() }, + { Component: Component.ReaderMode() }, + ], + }), + Component.Explorer(), + ], + right: [ + Component.Graph(), + Component.DesktopOnly(Component.TableOfContents()), + Component.Backlinks(), + ], +} + +// components for pages that display lists of pages (e.g. tags or folders) +export const defaultListPageLayout: PageLayout = { + beforeBody: [Component.Breadcrumbs(), Component.ArticleTitle(), Component.ContentMeta()], + left: [ + Component.PageTitle(), + Component.MobileOnly(Component.Spacer()), + Component.Flex({ + components: [ + { + Component: Component.Search(), + grow: true, + }, + { Component: Component.Darkmode() }, + ], + }), + Component.Explorer(), + ], + right: [], +} diff --git a/src/quartz/bootstrap-cli.mjs b/src/quartz/bootstrap-cli.mjs new file mode 100644 index 0000000..8b0b926 --- /dev/null +++ b/src/quartz/bootstrap-cli.mjs @@ -0,0 +1,41 @@ +#!/usr/bin/env -S node --no-deprecation +import yargs from "yargs" +import { hideBin } from "yargs/helpers" +import { + handleBuild, + handleCreate, + handleUpdate, + handleRestore, + handleSync, +} from "./cli/handlers.js" +import { CommonArgv, BuildArgv, CreateArgv, SyncArgv } from "./cli/args.js" +import { version } from "./cli/constants.js" + +yargs(hideBin(process.argv)) + .scriptName("quartz") + .version(version) + .usage("$0 [args]") + .command("create", "Initialize Quartz", CreateArgv, async (argv) => { + await handleCreate(argv) + }) + .command("update", "Get the latest Quartz updates", CommonArgv, async (argv) => { + await handleUpdate(argv) + }) + .command( + "restore", + "Try to restore your content folder from the cache", + CommonArgv, + async (argv) => { + await handleRestore(argv) + }, + ) + .command("sync", "Sync your Quartz to and from GitHub.", SyncArgv, async (argv) => { + await handleSync(argv) + }) + .command("build", "Build Quartz into a bundle of static HTML files", BuildArgv, async (argv) => { + await handleBuild(argv) + }) + .showHelpOnFail(false) + .help() + .strict() + .demandCommand().argv diff --git a/src/quartz/bootstrap-worker.mjs b/src/quartz/bootstrap-worker.mjs new file mode 100644 index 0000000..c4c4949 --- /dev/null +++ b/src/quartz/bootstrap-worker.mjs @@ -0,0 +1,8 @@ +#!/usr/bin/env node +import workerpool from "workerpool" +const cacheFile = "./.quartz-cache/transpiled-worker.mjs" +const { parseMarkdown, processHtml } = await import(cacheFile) +workerpool.worker({ + parseMarkdown, + processHtml, +}) diff --git a/src/quartz/build.ts b/src/quartz/build.ts new file mode 100644 index 0000000..d9f5efc --- /dev/null +++ b/src/quartz/build.ts @@ -0,0 +1,302 @@ +import sourceMapSupport from "source-map-support" +sourceMapSupport.install(options) +import path from "path" +import { PerfTimer } from "./util/perf" +import { rm } from "fs/promises" +import { GlobbyFilterFunction, isGitIgnored } from "globby" +import { styleText } from "util" +import { parseMarkdown } from "./processors/parse" +import { filterContent } from "./processors/filter" +import { emitContent } from "./processors/emit" +import cfg from "../quartz.config" +import { FilePath, joinSegments, slugifyFilePath } from "./util/path" +import chokidar from "chokidar" +import { ProcessedContent } from "./plugins/vfile" +import { Argv, BuildCtx } from "./util/ctx" +import { glob, toPosixPath } from "./util/glob" +import { trace } from "./util/trace" +import { options } from "./util/sourcemap" +import { Mutex } from "async-mutex" +import { getStaticResourcesFromPlugins } from "./plugins" +import { randomIdNonSecure } from "./util/random" +import { ChangeEvent } from "./plugins/types" +import { minimatch } from "minimatch" + +type ContentMap = Map< + FilePath, + | { + type: "markdown" + content: ProcessedContent + } + | { + type: "other" + } +> + +type BuildData = { + ctx: BuildCtx + ignored: GlobbyFilterFunction + mut: Mutex + contentMap: ContentMap + changesSinceLastBuild: Record + lastBuildMs: number +} + +async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) { + const ctx: BuildCtx = { + buildId: randomIdNonSecure(), + argv, + cfg, + allSlugs: [], + allFiles: [], + incremental: false, + } + + const perf = new PerfTimer() + const output = argv.output + + const pluginCount = Object.values(cfg.plugins).flat().length + const pluginNames = (key: "transformers" | "filters" | "emitters") => + cfg.plugins[key].map((plugin) => plugin.name) + if (argv.verbose) { + console.log(`Loaded ${pluginCount} plugins`) + console.log(` Transformers: ${pluginNames("transformers").join(", ")}`) + console.log(` Filters: ${pluginNames("filters").join(", ")}`) + console.log(` Emitters: ${pluginNames("emitters").join(", ")}`) + } + + const release = await mut.acquire() + perf.addEvent("clean") + await rm(output, { recursive: true, force: true }) + console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) + + perf.addEvent("glob") + const allFiles = await glob("**/*.*", argv.directory, cfg.configuration.ignorePatterns) + const markdownPaths = allFiles.filter((fp) => fp.endsWith(".md")).sort() + console.log( + `Found ${markdownPaths.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`, + ) + + const filePaths = markdownPaths.map((fp) => joinSegments(argv.directory, fp) as FilePath) + ctx.allFiles = allFiles + ctx.allSlugs = allFiles.map((fp) => slugifyFilePath(fp as FilePath)) + + const parsedFiles = await parseMarkdown(ctx, filePaths) + const filteredContent = filterContent(ctx, parsedFiles) + + await emitContent(ctx, filteredContent) + console.log( + styleText("green", `Done processing ${markdownPaths.length} files in ${perf.timeSince()}`), + ) + release() + + if (argv.watch) { + ctx.incremental = true + return startWatching(ctx, mut, parsedFiles, clientRefresh) + } +} + +// setup watcher for rebuilds +async function startWatching( + ctx: BuildCtx, + mut: Mutex, + initialContent: ProcessedContent[], + clientRefresh: () => void, +) { + const { argv, allFiles } = ctx + + const contentMap: ContentMap = new Map() + for (const filePath of allFiles) { + contentMap.set(filePath, { + type: "other", + }) + } + + for (const content of initialContent) { + const [_tree, vfile] = content + contentMap.set(vfile.data.relativePath!, { + type: "markdown", + content, + }) + } + + const gitIgnoredMatcher = await isGitIgnored() + const buildData: BuildData = { + ctx, + mut, + contentMap, + ignored: (fp) => { + const pathStr = toPosixPath(fp.toString()) + if (pathStr.startsWith(".git/")) return true + if (gitIgnoredMatcher(pathStr)) return true + for (const pattern of cfg.configuration.ignorePatterns) { + if (minimatch(pathStr, pattern)) { + return true + } + } + + return false + }, + + changesSinceLastBuild: {}, + lastBuildMs: 0, + } + + const watcher = chokidar.watch(".", { + persistent: true, + cwd: argv.directory, + ignoreInitial: true, + }) + + const changes: ChangeEvent[] = [] + watcher + .on("add", (fp) => { + if (buildData.ignored(fp)) return + changes.push({ path: fp as FilePath, type: "add" }) + void rebuild(changes, clientRefresh, buildData) + }) + .on("change", (fp) => { + if (buildData.ignored(fp)) return + changes.push({ path: fp as FilePath, type: "change" }) + void rebuild(changes, clientRefresh, buildData) + }) + .on("unlink", (fp) => { + if (buildData.ignored(fp)) return + changes.push({ path: fp as FilePath, type: "delete" }) + void rebuild(changes, clientRefresh, buildData) + }) + + return async () => { + await watcher.close() + } +} + +async function rebuild(changes: ChangeEvent[], clientRefresh: () => void, buildData: BuildData) { + const { ctx, contentMap, mut, changesSinceLastBuild } = buildData + const { argv, cfg } = ctx + + const buildId = randomIdNonSecure() + ctx.buildId = buildId + buildData.lastBuildMs = new Date().getTime() + const numChangesInBuild = changes.length + const release = await mut.acquire() + + // if there's another build after us, release and let them do it + if (ctx.buildId !== buildId) { + release() + return + } + + const perf = new PerfTimer() + perf.addEvent("rebuild") + console.log(styleText("yellow", "Detected change, rebuilding...")) + + // update changesSinceLastBuild + for (const change of changes) { + changesSinceLastBuild[change.path] = change.type + } + + const staticResources = getStaticResourcesFromPlugins(ctx) + const pathsToParse: FilePath[] = [] + for (const [fp, type] of Object.entries(changesSinceLastBuild)) { + if (type === "delete" || path.extname(fp) !== ".md") continue + const fullPath = joinSegments(argv.directory, toPosixPath(fp)) as FilePath + pathsToParse.push(fullPath) + } + + const parsed = await parseMarkdown(ctx, pathsToParse) + for (const content of parsed) { + contentMap.set(content[1].data.relativePath!, { + type: "markdown", + content, + }) + } + + // update state using changesSinceLastBuild + // we do this weird play of add => compute change events => remove + // so that partialEmitters can do appropriate cleanup based on the content of deleted files + for (const [file, change] of Object.entries(changesSinceLastBuild)) { + if (change === "delete") { + // universal delete case + contentMap.delete(file as FilePath) + } + + // manually track non-markdown files as processed files only + // contains markdown files + if (change === "add" && path.extname(file) !== ".md") { + contentMap.set(file as FilePath, { + type: "other", + }) + } + } + + const changeEvents: ChangeEvent[] = Object.entries(changesSinceLastBuild).map(([fp, type]) => { + const path = fp as FilePath + const processedContent = contentMap.get(path) + if (processedContent?.type === "markdown") { + const [_tree, file] = processedContent.content + return { + type, + path, + file, + } + } + + return { + type, + path, + } + }) + + // update allFiles and then allSlugs with the consistent view of content map + ctx.allFiles = Array.from(contentMap.keys()) + ctx.allSlugs = ctx.allFiles.map((fp) => slugifyFilePath(fp as FilePath)) + let processedFiles = filterContent( + ctx, + Array.from(contentMap.values()) + .filter((file) => file.type === "markdown") + .map((file) => file.content), + ) + + let emittedFiles = 0 + for (const emitter of cfg.plugins.emitters) { + // Try to use partialEmit if available, otherwise assume the output is static + const emitFn = emitter.partialEmit ?? emitter.emit + const emitted = await emitFn(ctx, processedFiles, staticResources, changeEvents) + if (emitted === null) { + continue + } + + if (Symbol.asyncIterator in emitted) { + // Async generator case + for await (const file of emitted) { + emittedFiles++ + if (ctx.argv.verbose) { + console.log(`[emit:${emitter.name}] ${file}`) + } + } + } else { + // Array case + emittedFiles += emitted.length + if (ctx.argv.verbose) { + for (const file of emitted) { + console.log(`[emit:${emitter.name}] ${file}`) + } + } + } + } + + console.log(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince("rebuild")}`) + console.log(styleText("green", `Done rebuilding in ${perf.timeSince()}`)) + changes.splice(0, numChangesInBuild) + clientRefresh() + release() +} + +export default async (argv: Argv, mut: Mutex, clientRefresh: () => void) => { + try { + return await buildQuartz(argv, mut, clientRefresh) + } catch (err) { + trace("\nExiting Quartz due to a fatal error", err as Error) + } +} diff --git a/src/quartz/cfg.ts b/src/quartz/cfg.ts new file mode 100644 index 0000000..b5de75d --- /dev/null +++ b/src/quartz/cfg.ts @@ -0,0 +1,92 @@ +import { ValidDateType } from "./components/Date" +import { QuartzComponent } from "./components/types" +import { ValidLocale } from "./i18n" +import { PluginTypes } from "./plugins/types" +import { Theme } from "./util/theme" + +export type Analytics = + | null + | { + provider: "plausible" + host?: string + } + | { + provider: "google" + tagId: string + } + | { + provider: "umami" + websiteId: string + host?: string + } + | { + provider: "goatcounter" + websiteId: string + host?: string + scriptSrc?: string + } + | { + provider: "posthog" + apiKey: string + host?: string + } + | { + provider: "tinylytics" + siteId: string + } + | { + provider: "cabin" + host?: string + } + | { + provider: "clarity" + projectId?: string + } + +export interface GlobalConfiguration { + pageTitle: string + pageTitleSuffix?: string + /** Whether to enable single-page-app style rendering. this prevents flashes of unstyled content and improves smoothness of Quartz */ + enableSPA: boolean + /** Whether to display Wikipedia-style popovers when hovering over links */ + enablePopovers: boolean + /** Analytics mode */ + analytics: Analytics + /** Glob patterns to not search */ + ignorePatterns: string[] + /** Whether to use created, modified, or published as the default type of date */ + defaultDateType: ValidDateType + /** Base URL to use for CNAME files, sitemaps, and RSS feeds that require an absolute URL. + * Quartz will avoid using this as much as possible and use relative URLs most of the time + */ + baseUrl?: string + theme: Theme + /** + * Allow to translate the date in the language of your choice. + * Also used for UI translation (default: en-US) + * 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 + */ + locale: ValidLocale +} + +export interface QuartzConfig { + configuration: GlobalConfiguration + plugins: PluginTypes +} + +export interface FullPageLayout { + head: QuartzComponent + header: QuartzComponent[] + beforeBody: QuartzComponent[] + pageBody: QuartzComponent + afterBody: QuartzComponent[] + left: QuartzComponent[] + right: QuartzComponent[] + footer: QuartzComponent +} + +export type PageLayout = Pick +export type SharedLayout = Pick diff --git a/src/quartz/cli/args.js b/src/quartz/cli/args.js new file mode 100644 index 0000000..d2408e9 --- /dev/null +++ b/src/quartz/cli/args.js @@ -0,0 +1,108 @@ +export const CommonArgv = { + directory: { + string: true, + alias: ["d"], + default: "content", + describe: "directory to look for content files", + }, + verbose: { + boolean: true, + alias: ["v"], + default: false, + describe: "print out extra logging information", + }, +} + +export const CreateArgv = { + ...CommonArgv, + source: { + string: true, + alias: ["s"], + describe: "source directory to copy/create symlink from", + }, + strategy: { + string: true, + alias: ["X"], + choices: ["new", "copy", "symlink"], + describe: "strategy for content folder setup", + }, + links: { + string: true, + alias: ["l"], + choices: ["absolute", "shortest", "relative"], + describe: "strategy to resolve links", + }, +} + +export const SyncArgv = { + ...CommonArgv, + commit: { + boolean: true, + default: true, + describe: "create a git commit for your unsaved changes", + }, + message: { + string: true, + alias: ["m"], + describe: "option to override the default Quartz commit message", + }, + push: { + boolean: true, + default: true, + describe: "push updates to your Quartz fork", + }, + pull: { + boolean: true, + default: true, + describe: "pull updates from your Quartz fork", + }, +} + +export const BuildArgv = { + ...CommonArgv, + output: { + string: true, + alias: ["o"], + default: "public", + describe: "output folder for files", + }, + serve: { + boolean: true, + default: false, + describe: "run a local server to live-preview your Quartz", + }, + watch: { + boolean: true, + default: false, + describe: "watch for changes and rebuild automatically", + }, + baseDir: { + string: true, + default: "", + describe: "base path to serve your local server on", + }, + port: { + number: true, + default: 8080, + describe: "port to serve Quartz on", + }, + wsPort: { + number: true, + default: 3001, + describe: "port to use for WebSocket-based hot-reload notifications", + }, + remoteDevHost: { + string: true, + default: "", + describe: "A URL override for the websocket connection if you are not developing on localhost", + }, + bundleInfo: { + boolean: true, + default: false, + describe: "show detailed bundle information", + }, + concurrency: { + number: true, + describe: "how many threads to use to parse notes", + }, +} diff --git a/src/quartz/cli/constants.js b/src/quartz/cli/constants.js new file mode 100644 index 0000000..f4a9ce5 --- /dev/null +++ b/src/quartz/cli/constants.js @@ -0,0 +1,15 @@ +import path from "path" +import { readFileSync } from "fs" + +/** + * All constants relating to helpers or handlers + */ +export const ORIGIN_NAME = "origin" +export const UPSTREAM_NAME = "upstream" +export const QUARTZ_SOURCE_BRANCH = "v4" +export const cwd = process.cwd() +export const cacheDir = path.join(cwd, ".quartz-cache") +export const cacheFile = "./quartz/.quartz-cache/transpiled-build.mjs" +export const fp = "./quartz/build.ts" +export const { version } = JSON.parse(readFileSync("./package.json").toString()) +export const contentCacheFolder = path.join(cacheDir, "content-cache") diff --git a/src/quartz/cli/handlers.js b/src/quartz/cli/handlers.js new file mode 100644 index 0000000..9b68aed --- /dev/null +++ b/src/quartz/cli/handlers.js @@ -0,0 +1,620 @@ +import { promises } from "fs" +import path from "path" +import esbuild from "esbuild" +import { styleText } from "util" +import { sassPlugin } from "esbuild-sass-plugin" +import fs from "fs" +import { intro, outro, select, text } from "@clack/prompts" +import { rm } from "fs/promises" +import chokidar from "chokidar" +import prettyBytes from "pretty-bytes" +import { execSync, spawnSync } from "child_process" +import http from "http" +import serveHandler from "serve-handler" +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, + gitPull, + popContentFolder, + stashContentFolder, +} from "./helpers.js" +import { + UPSTREAM_NAME, + QUARTZ_SOURCE_BRANCH, + ORIGIN_NAME, + version, + fp, + cacheFile, + cwd, +} from "./constants.js" + +/** + * Resolve content directory path + * @param contentPath path to resolve + */ +function resolveContentPath(contentPath) { + if (path.isAbsolute(contentPath)) return path.relative(cwd, contentPath) + return path.join(cwd, contentPath) +} + +/** + * Handles `npx quartz create` + * @param {*} argv arguments for `create` + */ +export async function handleCreate(argv) { + console.log() + intro(styleText(["bgGreen", "black"], ` Quartz v${version} `)) + const contentFolder = resolveContentPath(argv.directory) + let setupStrategy = argv.strategy?.toLowerCase() + let linkResolutionStrategy = argv.links?.toLowerCase() + const sourceDirectory = argv.source + + // 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") { + // Error handling + if (!sourceDirectory) { + outro( + styleText( + "red", + `Setup strategies (arg '${styleText( + "yellow", + `-${CreateArgv.strategy.alias[0]}`, + )}') other than '${styleText( + "yellow", + "new", + )}' require content folder argument ('${styleText( + "yellow", + `-${CreateArgv.source.alias[0]}`, + )}') to be set`, + ), + ) + process.exit(1) + } else { + if (!fs.existsSync(sourceDirectory)) { + outro( + styleText( + "red", + `Input directory to copy/symlink 'content' from not found ('${styleText( + "yellow", + sourceDirectory, + )}', invalid argument "${styleText("yellow", `-${CreateArgv.source.alias[0]}`)})`, + ), + ) + process.exit(1) + } else if (!fs.lstatSync(sourceDirectory).isDirectory()) { + outro( + styleText( + "red", + `Source directory to copy/symlink 'content' from is not a directory (found file at '${styleText( + "yellow", + sourceDirectory, + )}', invalid argument ${styleText("yellow", `-${CreateArgv.source.alias[0]}`)}")`, + ), + ) + process.exit(1) + } + } + } + } + + // Use cli process if cmd args werent provided + if (!setupStrategy) { + setupStrategy = exitIfCancel( + await select({ + message: `Choose how to initialize the content in \`${contentFolder}\``, + options: [ + { value: "new", label: "Empty Quartz" }, + { value: "copy", label: "Copy an existing folder", hint: "overwrites `content`" }, + { + value: "symlink", + label: "Symlink an existing folder", + hint: "don't select this unless you know what you are doing!", + }, + ], + }), + ) + } + + async function rmContentFolder() { + const contentStat = await fs.promises.lstat(contentFolder) + if (contentStat.isSymbolicLink()) { + await fs.promises.unlink(contentFolder) + } else { + await rm(contentFolder, { recursive: true, force: true }) + } + } + + const gitkeepPath = path.join(contentFolder, ".gitkeep") + if (fs.existsSync(gitkeepPath)) { + await fs.promises.unlink(gitkeepPath) + } + if (setupStrategy === "copy" || setupStrategy === "symlink") { + let originalFolder = sourceDirectory + + // If input directory was not passed, use cli + if (!sourceDirectory) { + originalFolder = escapePath( + exitIfCancel( + await text({ + message: "Enter the full path to existing content folder", + placeholder: + "On most terminal emulators, you can drag and drop a folder into the window and it will paste the full path", + validate(fp) { + const fullPath = escapePath(fp) + if (!fs.existsSync(fullPath)) { + return "The given path doesn't exist" + } else if (!fs.lstatSync(fullPath).isDirectory()) { + return "The given path is not a folder" + } + }, + }), + ), + ) + } + + await rmContentFolder() + if (setupStrategy === "copy") { + await fs.promises.cp(originalFolder, contentFolder, { + recursive: true, + preserveTimestamps: true, + }) + } else if (setupStrategy === "symlink") { + await fs.promises.symlink(originalFolder, contentFolder, "dir") + } + } else if (setupStrategy === "new") { + await fs.promises.writeFile( + path.join(contentFolder, "index.md"), + `--- +title: Welcome to Quartz +--- + +This is a blank Quartz installation. +See the [documentation](https://quartz.jzhao.xyz) for how to get started. +`, + ) + } + + // Use cli process if cmd args werent provided + if (!linkResolutionStrategy) { + // get a preferred link resolution strategy + linkResolutionStrategy = exitIfCancel( + await select({ + message: `Choose how Quartz should resolve links in your content. This should match Obsidian's link format. You can change this later in \`quartz.config.ts\`.`, + options: [ + { + value: "shortest", + label: "Treat links as shortest path", + hint: "(default)", + }, + { + value: "absolute", + label: "Treat links as absolute path", + }, + { + value: "relative", + label: "Treat links as relative paths", + }, + ], + }), + ) + } + + // now, do config changes + const configFilePath = path.join(cwd, "quartz.config.ts") + let configContent = await fs.promises.readFile(configFilePath, { encoding: "utf-8" }) + configContent = configContent.replace( + /markdownLinkResolution: '(.+)'/, + `markdownLinkResolution: '${linkResolutionStrategy}'`, + ) + await fs.promises.writeFile(configFilePath, configContent) + + // setup remote + execSync( + `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`, + { stdio: "ignore" }, + ) + + outro(`You're all set! Not sure what to do next? Try: + • Customizing Quartz a bit more by editing \`quartz.config.ts\` + • Running \`npx quartz build --serve\` to preview your Quartz locally + • Hosting your Quartz online (see: https://quartz.jzhao.xyz/hosting) +`) +} + +/** + * Handles `npx quartz build` + * @param {*} argv arguments for `build` + */ +export async function handleBuild(argv) { + if (argv.serve) { + argv.watch = true + } + + console.log(`\n${styleText(["bgGreen", "black"], ` Quartz v${version} `)} \n`) + const ctx = await esbuild.context({ + entryPoints: [fp], + outfile: cacheFile, + bundle: true, + keepNames: true, + minifyWhitespace: true, + minifySyntax: true, + platform: "node", + format: "esm", + jsx: "automatic", + jsxImportSource: "preact", + packages: "external", + metafile: true, + sourcemap: true, + sourcesContent: false, + plugins: [ + sassPlugin({ + type: "css-text", + cssImports: true, + }), + sassPlugin({ + filter: /\.inline\.scss$/, + type: "css", + cssImports: true, + }), + { + name: "inline-script-loader", + setup(build) { + build.onLoad({ filter: /\.inline\.(ts|js)$/ }, async (args) => { + let text = await promises.readFile(args.path, "utf8") + + // remove default exports that we manually inserted + text = text.replace("export default", "") + text = text.replace("export", "") + + const sourcefile = path.relative(path.resolve("."), args.path) + const resolveDir = path.dirname(sourcefile) + const transpiled = await esbuild.build({ + stdin: { + contents: text, + loader: "ts", + resolveDir, + sourcefile, + }, + write: false, + bundle: true, + minify: true, + platform: "browser", + format: "esm", + }) + const rawMod = transpiled.outputFiles[0].text + return { + contents: rawMod, + loader: "text", + } + }) + }, + }, + ], + }) + + const buildMutex = new Mutex() + let lastBuildMs = 0 + let cleanupBuild = null + const build = async (clientRefresh) => { + const buildStart = new Date().getTime() + lastBuildMs = buildStart + const release = await buildMutex.acquire() + if (lastBuildMs > buildStart) { + release() + return + } + + if (cleanupBuild) { + console.log(styleText("yellow", "Detected a source code change, doing a hard rebuild...")) + await cleanupBuild() + } + + const result = await ctx.rebuild().catch((err) => { + console.error(`${styleText("red", "Couldn't parse Quartz configuration:")} ${fp}`) + console.log(`Reason: ${styleText("grey", err)}`) + process.exit(1) + }) + release() + + if (argv.bundleInfo) { + const outputFileName = "quartz/.quartz-cache/transpiled-build.mjs" + const meta = result.metafile.outputs[outputFileName] + console.log( + `Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes( + meta.bytes, + )})`, + ) + console.log(await esbuild.analyzeMetafile(result.metafile, { color: true })) + } + + // bypass module cache + // https://github.com/nodejs/modules/issues/307 + const { default: buildQuartz } = await import(`../../${cacheFile}?update=${randomUUID()}`) + // ^ this import is relative, so base "cacheFile" path can't be used + + cleanupBuild = await buildQuartz(argv, buildMutex, clientRefresh) + clientRefresh() + } + + let clientRefresh = () => {} + if (argv.serve) { + const connections = [] + clientRefresh = () => connections.forEach((conn) => conn.send("rebuild")) + + if (argv.baseDir !== "" && !argv.baseDir.startsWith("/")) { + argv.baseDir = "/" + argv.baseDir + } + + await build(clientRefresh) + const server = http.createServer(async (req, res) => { + if (argv.baseDir && !req.url?.startsWith(argv.baseDir)) { + console.log( + styleText( + "red", + `[404] ${req.url} (warning: link outside of site, this is likely a Quartz bug)`, + ), + ) + res.writeHead(404) + res.end() + return + } + + // strip baseDir prefix + req.url = req.url?.slice(argv.baseDir.length) + + const serve = async () => { + const release = await buildMutex.acquire() + await serveHandler(req, res, { + public: argv.output, + directoryListing: false, + headers: [ + { + 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 + const statusString = + status >= 200 && status < 300 + ? styleText("green", `[${status}]`) + : styleText("red", `[${status}]`) + console.log(statusString + styleText("grey", ` ${argv.baseDir}${req.url}`)) + release() + } + + const redirect = (newFp) => { + newFp = argv.baseDir + newFp + res.writeHead(302, { + Location: newFp, + }) + console.log( + styleText("yellow", "[302]") + + styleText("grey", ` ${argv.baseDir}${req.url} -> ${newFp}`), + ) + res.end() + } + + let fp = req.url?.split("?")[0] ?? "/" + + // handle redirects + if (fp.endsWith("/")) { + // /trailing/ + // does /trailing/index.html exist? if so, serve it + const indexFp = path.posix.join(fp, "index.html") + if (fs.existsSync(path.posix.join(argv.output, indexFp))) { + req.url = fp + return serve() + } + + // does /trailing.html exist? if so, redirect to /trailing + let base = fp.slice(0, -1) + if (path.extname(base) === "") { + base += ".html" + } + if (fs.existsSync(path.posix.join(argv.output, base))) { + return redirect(fp.slice(0, -1)) + } + } else { + // /regular + // does /regular.html exist? if so, serve it + let base = fp + if (path.extname(base) === "") { + base += ".html" + } + if (fs.existsSync(path.posix.join(argv.output, base))) { + req.url = fp + return serve() + } + + // does /regular/index.html exist? if so, redirect to /regular/ + let indexFp = path.posix.join(fp, "index.html") + if (fs.existsSync(path.posix.join(argv.output, indexFp))) { + return redirect(fp + "/") + } + } + + return serve() + }) + + server.listen(argv.port) + const wss = new WebSocketServer({ port: argv.wsPort }) + wss.on("connection", (ws) => connections.push(ws)) + console.log( + styleText( + "cyan", + `Started a Quartz server listening at http://localhost:${argv.port}${argv.baseDir}`, + ), + ) + } else { + await build(clientRefresh) + ctx.dispose() + } + + if (argv.watch) { + const paths = await globby([ + "**/*.ts", + "quartz/cli/*.js", + "quartz/static/**/*", + "**/*.tsx", + "**/*.scss", + "package.json", + ]) + chokidar + .watch(paths, { ignoreInitial: true }) + .on("add", () => build(clientRefresh)) + .on("change", () => build(clientRefresh)) + .on("unlink", () => build(clientRefresh)) + + console.log(styleText("grey", "hint: exit with ctrl+c")) + } +} + +/** + * Handles `npx quartz update` + * @param {*} argv arguments for `update` + */ +export async function handleUpdate(argv) { + const contentFolder = resolveContentPath(argv.directory) + console.log(`\n${styleText(["bgGreen", "black"], ` Quartz v${version} `)} \n`) + console.log("Backing up your content") + execSync( + `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`, + ) + await stashContentFolder(contentFolder) + console.log( + "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", + ) + + try { + gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH) + } catch { + console.log(styleText("red", "An error occurred above while pulling updates.")) + await popContentFolder(contentFolder) + return + } + + await popContentFolder(contentFolder) + console.log("Ensuring dependencies are up to date") + + /* + 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(styleText("green", "Done!")) + } else { + console.log(styleText("red", "An error occurred above while installing dependencies.")) + } +} + +/** + * Handles `npx quartz restore` + * @param {*} argv arguments for `restore` + */ +export async function handleRestore(argv) { + const contentFolder = resolveContentPath(argv.directory) + await popContentFolder(contentFolder) +} + +/** + * Handles `npx quartz sync` + * @param {*} argv arguments for `sync` + */ +export async function handleSync(argv) { + const contentFolder = resolveContentPath(argv.directory) + console.log(`\n${styleText(["bgGreen", "black"], ` Quartz v${version} `)}\n`) + console.log("Backing up your content") + + if (argv.commit) { + const contentStat = await fs.promises.lstat(contentFolder) + if (contentStat.isSymbolicLink()) { + const linkTarg = await fs.promises.readlink(contentFolder) + console.log(styleText("yellow", "Detected symlink, trying to dereference before committing")) + + // stash symlink file + await stashContentFolder(contentFolder) + + // follow symlink and copy content + await fs.promises.cp(linkTarg, contentFolder, { + recursive: true, + preserveTimestamps: true, + }) + } + + const currentTimestamp = new Date().toLocaleString("en-US", { + dateStyle: "medium", + timeStyle: "short", + }) + const commitMessage = argv.message ?? `Quartz sync: ${currentTimestamp}` + spawnSync("git", ["add", "."], { stdio: "inherit" }) + spawnSync("git", ["commit", "-m", commitMessage], { stdio: "inherit" }) + + if (contentStat.isSymbolicLink()) { + // put symlink back + await popContentFolder(contentFolder) + } + } + + await stashContentFolder(contentFolder) + + if (argv.pull) { + console.log( + "Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.", + ) + try { + gitPull(ORIGIN_NAME, QUARTZ_SOURCE_BRANCH) + } catch { + console.log(styleText("red", "An error occurred above while pulling updates.")) + await popContentFolder(contentFolder) + return + } + } + + await popContentFolder(contentFolder) + if (argv.push) { + console.log("Pushing your changes") + const currentBranch = execSync("git rev-parse --abbrev-ref HEAD").toString().trim() + const res = spawnSync("git", ["push", "-uf", ORIGIN_NAME, currentBranch], { + stdio: "inherit", + }) + if (res.status !== 0) { + console.log( + styleText("red", `An error occurred above while pushing to remote ${ORIGIN_NAME}.`), + ) + return + } + } + + console.log(styleText("green", "Done!")) +} diff --git a/src/quartz/cli/helpers.js b/src/quartz/cli/helpers.js new file mode 100644 index 0000000..1bc58ad --- /dev/null +++ b/src/quartz/cli/helpers.js @@ -0,0 +1,54 @@ +import { isCancel, outro } from "@clack/prompts" +import { styleText } from "util" +import { contentCacheFolder } from "./constants.js" +import { spawnSync } from "child_process" +import fs from "fs" + +export function escapePath(fp) { + return fp + .replace(/\\ /g, " ") // unescape spaces + .replace(/^".*"$/, "$1") + .replace(/^'.*"$/, "$1") + .trim() +} + +export function exitIfCancel(val) { + if (isCancel(val)) { + outro(styleText("red", "Exiting")) + process.exit(0) + } else { + return val + } +} + +export async function stashContentFolder(contentFolder) { + await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) + await fs.promises.cp(contentFolder, contentCacheFolder, { + force: true, + recursive: true, + verbatimSymlinks: true, + preserveTimestamps: true, + }) + await fs.promises.rm(contentFolder, { force: true, recursive: true }) +} + +export function gitPull(origin, branch) { + const flags = ["--no-rebase", "--autostash", "-s", "recursive", "-X", "ours", "--no-edit"] + const out = spawnSync("git", ["pull", ...flags, origin, branch], { stdio: "inherit" }) + if (out.stderr) { + throw new Error(styleText("red", `Error while pulling updates: ${out.stderr}`)) + } else if (out.status !== 0) { + throw new Error(styleText("red", "Error while pulling updates")) + } +} + +export async function popContentFolder(contentFolder) { + await fs.promises.rm(contentFolder, { force: true, recursive: true }) + await fs.promises.cp(contentCacheFolder, contentFolder, { + force: true, + recursive: true, + verbatimSymlinks: true, + preserveTimestamps: true, + }) + await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) +} diff --git a/src/quartz/components/ArticleTitle.tsx b/src/quartz/components/ArticleTitle.tsx new file mode 100644 index 0000000..318aeb2 --- /dev/null +++ b/src/quartz/components/ArticleTitle.tsx @@ -0,0 +1,19 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { classNames } from "../util/lang" + +const ArticleTitle: QuartzComponent = ({ fileData, displayClass }: QuartzComponentProps) => { + const title = fileData.frontmatter?.title + if (title) { + return

{title}

+ } else { + return null + } +} + +ArticleTitle.css = ` +.article-title { + margin: 2rem 0 0 0; +} +` + +export default (() => ArticleTitle) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Backlinks.tsx b/src/quartz/components/Backlinks.tsx new file mode 100644 index 0000000..0d34457 --- /dev/null +++ b/src/quartz/components/Backlinks.tsx @@ -0,0 +1,55 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import style from "./styles/backlinks.scss" +import { resolveRelative, simplifySlug } from "../util/path" +import { i18n } from "../i18n" +import { classNames } from "../util/lang" +import OverflowListFactory from "./OverflowList" + +interface BacklinksOptions { + hideWhenEmpty: boolean +} + +const defaultOptions: BacklinksOptions = { + hideWhenEmpty: true, +} + +export default ((opts?: Partial) => { + const options: BacklinksOptions = { ...defaultOptions, ...opts } + const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory() + + 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 + Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded + + return Backlinks +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Body.tsx b/src/quartz/components/Body.tsx new file mode 100644 index 0000000..96b6278 --- /dev/null +++ b/src/quartz/components/Body.tsx @@ -0,0 +1,13 @@ +// @ts-ignore +import clipboardScript from "./scripts/clipboard.inline" +import clipboardStyle from "./styles/clipboard.scss" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +const Body: QuartzComponent = ({ children }: QuartzComponentProps) => { + return
{children}
+} + +Body.afterDOMLoaded = clipboardScript +Body.css = clipboardStyle + +export default (() => Body) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Breadcrumbs.tsx b/src/quartz/components/Breadcrumbs.tsx new file mode 100644 index 0000000..5144a31 --- /dev/null +++ b/src/quartz/components/Breadcrumbs.tsx @@ -0,0 +1,93 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import breadcrumbsStyle from "./styles/breadcrumbs.scss" +import { FullSlug, SimpleSlug, resolveRelative, simplifySlug } from "../util/path" +import { classNames } from "../util/lang" +import { trieFromAllFiles } from "../util/ctx" + +type CrumbData = { + displayName: string + path: string +} + +interface BreadcrumbOptions { + /** + * Symbol between crumbs + */ + spacerSymbol: string + /** + * Name of first crumb + */ + rootName: string + /** + * Whether to look up frontmatter title for folders (could cause performance problems with big vaults) + */ + resolveFrontmatterTitle: boolean + /** + * Whether to display the current page in the breadcrumbs. + */ + showCurrentPage: boolean +} + +const defaultOptions: BreadcrumbOptions = { + spacerSymbol: "❯", + rootName: "Home", + resolveFrontmatterTitle: true, + showCurrentPage: true, +} + +function formatCrumb(displayName: string, baseSlug: FullSlug, currentSlug: SimpleSlug): CrumbData { + return { + displayName: displayName.replaceAll("-", " "), + path: resolveRelative(baseSlug, currentSlug), + } +} + +export default ((opts?: Partial) => { + const options: BreadcrumbOptions = { ...defaultOptions, ...opts } + const Breadcrumbs: QuartzComponent = ({ + fileData, + allFiles, + displayClass, + ctx, + }: QuartzComponentProps) => { + const trie = (ctx.trie ??= trieFromAllFiles(allFiles)) + const slugParts = fileData.slug!.split("/") + const pathNodes = trie.ancestryChain(slugParts) + + if (!pathNodes) { + return null + } + + const crumbs: CrumbData[] = pathNodes.map((node, idx) => { + const crumb = formatCrumb(node.displayName, fileData.slug!, simplifySlug(node.slug)) + if (idx === 0) { + crumb.displayName = options.rootName + } + + // For last node (current page), set empty path + if (idx === pathNodes.length - 1) { + crumb.path = "" + } + + return crumb + }) + + if (!options.showCurrentPage) { + crumbs.pop() + } + + return ( + + ) + } + Breadcrumbs.css = breadcrumbsStyle + + return Breadcrumbs +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Comments.tsx b/src/quartz/components/Comments.tsx new file mode 100644 index 0000000..a731521 --- /dev/null +++ b/src/quartz/components/Comments.tsx @@ -0,0 +1,62 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { classNames } from "../util/lang" +// @ts-ignore +import script from "./scripts/comments.inline" + +type Options = { + provider: "giscus" + options: { + repo: `${string}/${string}` + repoId: string + category: string + categoryId: string + themeUrl?: string + lightTheme?: string + darkTheme?: string + mapping?: "url" | "title" | "og:title" | "specific" | "number" | "pathname" + strict?: boolean + reactionsEnabled?: boolean + inputPosition?: "top" | "bottom" + lang?: string + } +} + +function boolToStringBool(b: boolean): string { + return b ? "1" : "0" +} + +export default ((opts: Options) => { + const Comments: QuartzComponent = ({ displayClass, fileData, cfg }: QuartzComponentProps) => { + // check if comments should be displayed according to frontmatter + const disableComment: boolean = + typeof fileData.frontmatter?.comments !== "undefined" && + (!fileData.frontmatter?.comments || fileData.frontmatter?.comments === "false") + if (disableComment) { + return <> + } + + return ( +
+ ) + } + + Comments.afterDOMLoaded = script + + return Comments +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/ConditionalRender.tsx b/src/quartz/components/ConditionalRender.tsx new file mode 100644 index 0000000..74a4db0 --- /dev/null +++ b/src/quartz/components/ConditionalRender.tsx @@ -0,0 +1,22 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +type ConditionalRenderConfig = { + component: QuartzComponent + condition: (props: QuartzComponentProps) => boolean +} + +export default ((config: ConditionalRenderConfig) => { + const ConditionalRender: QuartzComponent = (props: QuartzComponentProps) => { + if (config.condition(props)) { + return + } + + return null + } + + ConditionalRender.afterDOMLoaded = config.component.afterDOMLoaded + ConditionalRender.beforeDOMLoaded = config.component.beforeDOMLoaded + ConditionalRender.css = config.component.css + + return ConditionalRender +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/ContentMeta.tsx b/src/quartz/components/ContentMeta.tsx new file mode 100644 index 0000000..e378bcc --- /dev/null +++ b/src/quartz/components/ContentMeta.tsx @@ -0,0 +1,58 @@ +import { Date, getDate } from "./Date" +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import readingTime from "reading-time" +import { classNames } from "../util/lang" +import { i18n } from "../i18n" +import { JSX } from "preact" +import style from "./styles/contentMeta.scss" + +interface ContentMetaOptions { + /** + * Whether to display reading time + */ + showReadingTime: boolean + showComma: boolean +} + +const defaultOptions: ContentMetaOptions = { + showReadingTime: true, + showComma: true, +} + +export default ((opts?: Partial) => { + // Merge options with defaults + const options: ContentMetaOptions = { ...defaultOptions, ...opts } + + function ContentMetadata({ cfg, fileData, displayClass }: QuartzComponentProps) { + const text = fileData.text + + if (text) { + const segments: (string | JSX.Element)[] = [] + + if (fileData.dates) { + segments.push() + } + + // Display reading time if enabled + if (options.showReadingTime) { + const { minutes, words: _words } = readingTime(text) + const displayedTime = i18n(cfg.locale).components.contentMeta.readingTime({ + minutes: Math.ceil(minutes), + }) + segments.push({displayedTime}) + } + + return ( +

+ {segments} +

+ ) + } else { + return null + } + } + + ContentMetadata.css = style + + return ContentMetadata +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Darkmode.tsx b/src/quartz/components/Darkmode.tsx new file mode 100644 index 0000000..afc23d7 --- /dev/null +++ b/src/quartz/components/Darkmode.tsx @@ -0,0 +1,48 @@ +// @ts-ignore +import darkmodeScript from "./scripts/darkmode.inline" +import styles from "./styles/darkmode.scss" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { i18n } from "../i18n" +import { classNames } from "../util/lang" + +const Darkmode: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => { + return ( + + ) +} + +Darkmode.beforeDOMLoaded = darkmodeScript +Darkmode.css = styles + +export default (() => Darkmode) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Date.tsx b/src/quartz/components/Date.tsx new file mode 100644 index 0000000..0a92cc4 --- /dev/null +++ b/src/quartz/components/Date.tsx @@ -0,0 +1,31 @@ +import { GlobalConfiguration } from "../cfg" +import { ValidLocale } from "../i18n" +import { QuartzPluginData } from "../plugins/vfile" + +interface Props { + date: Date + locale?: ValidLocale +} + +export type ValidDateType = keyof Required["dates"] + +export function getDate(cfg: GlobalConfiguration, data: QuartzPluginData): Date | undefined { + if (!cfg.defaultDateType) { + throw new Error( + `Field 'defaultDateType' was not set in the configuration object of quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.`, + ) + } + return data.dates?.[cfg.defaultDateType] +} + +export function formatDate(d: Date, locale: ValidLocale = "en-US"): string { + return d.toLocaleDateString(locale, { + year: "numeric", + month: "short", + day: "2-digit", + }) +} + +export function Date({ date, locale }: Props) { + return +} diff --git a/src/quartz/components/DesktopOnly.tsx b/src/quartz/components/DesktopOnly.tsx new file mode 100644 index 0000000..ee80137 --- /dev/null +++ b/src/quartz/components/DesktopOnly.tsx @@ -0,0 +1,14 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +export default ((component: QuartzComponent) => { + const Component = component + const DesktopOnly: QuartzComponent = (props: QuartzComponentProps) => { + return + } + + DesktopOnly.displayName = component.displayName + DesktopOnly.afterDOMLoaded = component?.afterDOMLoaded + DesktopOnly.beforeDOMLoaded = component?.beforeDOMLoaded + DesktopOnly.css = component?.css + return DesktopOnly +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Explorer.tsx b/src/quartz/components/Explorer.tsx new file mode 100644 index 0000000..56784f1 --- /dev/null +++ b/src/quartz/components/Explorer.tsx @@ -0,0 +1,162 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import style from "./styles/explorer.scss" + +// @ts-ignore +import script from "./scripts/explorer.inline" +import { classNames } from "../util/lang" +import { i18n } from "../i18n" +import { FileTrieNode } from "../util/fileTrie" +import OverflowListFactory from "./OverflowList" +import { concatenateResources } from "../util/resources" + +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: "link", + useSavedState: true, + mapFn: (node) => { + return node + }, + sortFn: (a, b) => { + // 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, { + numeric: true, + sensitivity: "base", + }) + } + + if (!a.isFolder && b.isFolder) { + return 1 + } else { + return -1 + } + }, + filterFn: (node) => node.slugSegment !== "tags", + order: ["filter", "map", "sort"], +} + +export type FolderState = { + path: string + collapsed: boolean +} + +export default ((userOpts?: Partial) => { + const opts: Options = { ...defaultOptions, ...userOpts } + const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory() + + const Explorer: QuartzComponent = ({ cfg, displayClass }: QuartzComponentProps) => { + return ( +
+ + +
+ +
+ + +
+ ) + } + + Explorer.css = style + Explorer.afterDOMLoaded = concatenateResources(script, overflowListAfterDOMLoaded) + return Explorer +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Flex.tsx b/src/quartz/components/Flex.tsx new file mode 100644 index 0000000..70d2149 --- /dev/null +++ b/src/quartz/components/Flex.tsx @@ -0,0 +1,59 @@ +import { concatenateResources } from "../util/resources" +import { classNames } from "../util/lang" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +type FlexConfig = { + components: { + Component: QuartzComponent + grow?: boolean + shrink?: boolean + basis?: string + order?: number + align?: "start" | "end" | "center" | "stretch" + justify?: "start" | "end" | "center" | "between" | "around" + }[] + direction?: "row" | "row-reverse" | "column" | "column-reverse" + wrap?: "nowrap" | "wrap" | "wrap-reverse" + gap?: string +} + +export default ((config: FlexConfig) => { + const Flex: QuartzComponent = (props: QuartzComponentProps) => { + const direction = config.direction ?? "row" + const wrap = config.wrap ?? "nowrap" + const gap = config.gap ?? "1rem" + + return ( +
+ {config.components.map((c) => { + const grow = c.grow ? 1 : 0 + const shrink = (c.shrink ?? true) ? 1 : 0 + const basis = c.basis ?? "auto" + const order = c.order ?? 0 + const align = c.align ?? "center" + const justify = c.justify ?? "center" + + return ( +
+ +
+ ) + })} +
+ ) + } + + Flex.afterDOMLoaded = concatenateResources( + ...config.components.map((c) => c.Component.afterDOMLoaded), + ) + Flex.beforeDOMLoaded = concatenateResources( + ...config.components.map((c) => c.Component.beforeDOMLoaded), + ) + Flex.css = concatenateResources(...config.components.map((c) => c.Component.css)) + return Flex +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Footer.tsx b/src/quartz/components/Footer.tsx new file mode 100644 index 0000000..cff28cb --- /dev/null +++ b/src/quartz/components/Footer.tsx @@ -0,0 +1,33 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import style from "./styles/footer.scss" +import { version } from "../../package.json" +import { i18n } from "../i18n" + +interface Options { + links: Record +} + +export default ((opts?: Options) => { + const Footer: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => { + const year = new Date().getFullYear() + const links = opts?.links ?? [] + return ( +
+

+ {i18n(cfg.locale).components.footer.createdWith}{" "} + Quartz v{version} © {year} +

+
    + {Object.entries(links).map(([text, link]) => ( +
  • + {text} +
  • + ))} +
+
+ ) + } + + Footer.css = style + return Footer +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Graph.tsx b/src/quartz/components/Graph.tsx new file mode 100644 index 0000000..907372e --- /dev/null +++ b/src/quartz/components/Graph.tsx @@ -0,0 +1,109 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +// @ts-ignore +import script from "./scripts/graph.inline" +import style from "./styles/graph.scss" +import { i18n } from "../i18n" +import { classNames } from "../util/lang" + +export interface D3Config { + drag: boolean + zoom: boolean + depth: number + scale: number + repelForce: number + centerForce: number + linkDistance: number + fontSize: number + opacityScale: number + removeTags: string[] + showTags: boolean + focusOnHover?: boolean + enableRadial?: boolean +} + +interface GraphOptions { + localGraph: Partial | undefined + globalGraph: Partial | undefined +} + +const defaultOptions: GraphOptions = { + localGraph: { + drag: true, + zoom: true, + depth: 1, + scale: 1.1, + repelForce: 0.5, + centerForce: 0.3, + linkDistance: 30, + fontSize: 0.6, + opacityScale: 1, + showTags: true, + removeTags: [], + focusOnHover: false, + enableRadial: false, + }, + globalGraph: { + drag: true, + zoom: true, + depth: -1, + scale: 0.9, + repelForce: 0.5, + centerForce: 0.2, + linkDistance: 30, + fontSize: 0.6, + opacityScale: 1, + showTags: true, + removeTags: [], + focusOnHover: true, + enableRadial: true, + }, +} + +export default ((opts?: Partial) => { + const Graph: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => { + const localGraph = { ...defaultOptions.localGraph, ...opts?.localGraph } + const globalGraph = { ...defaultOptions.globalGraph, ...opts?.globalGraph } + return ( +
+

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

+
+
+ +
+
+
+
+
+ ) + } + + Graph.css = style + Graph.afterDOMLoaded = script + + return Graph +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Head.tsx b/src/quartz/components/Head.tsx new file mode 100644 index 0000000..23183ca --- /dev/null +++ b/src/quartz/components/Head.tsx @@ -0,0 +1,105 @@ +import { i18n } from "../i18n" +import { FullSlug, getFileExtension, joinSegments, pathToRoot } from "../util/path" +import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/resources" +import { googleFontHref, googleFontSubsetHref } from "../util/theme" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { unescapeHTML } from "../util/escape" +import { CustomOgImagesEmitterName } from "../plugins/emitters/ogImage" +export default (() => { + const Head: QuartzComponent = ({ + cfg, + fileData, + externalResources, + ctx, + }: QuartzComponentProps) => { + const titleSuffix = cfg.pageTitleSuffix ?? "" + const title = + (fileData.frontmatter?.title ?? i18n(cfg.locale).propertyDefaults.title) + titleSuffix + const description = + fileData.frontmatter?.socialDescription ?? + fileData.frontmatter?.description ?? + unescapeHTML(fileData.description?.trim() ?? i18n(cfg.locale).propertyDefaults.description) + + const { css, js, additionalHead } = externalResources + + const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) + const path = url.pathname as FullSlug + const baseDir = fileData.slug === "404" ? path : pathToRoot(fileData.slug!) + const iconPath = joinSegments(baseDir, "static/icon.png") + + // Url of current page + const socialUrl = + fileData.slug === "404" ? url.toString() : joinSegments(url.toString(), fileData.slug!) + + const usesCustomOgImage = ctx.cfg.plugins.emitters.some( + (e) => e.name === CustomOgImagesEmitterName, + ) + const ogImageDefaultPath = `https://${cfg.baseUrl}/static/og-image.png` + + return ( + + {title} + + {cfg.theme.cdnCaching && cfg.theme.fontOrigin === "googleFonts" && ( + <> + + + + {cfg.theme.typography.title && ( + + )} + + )} + + + + + + + + + + + + + {!usesCustomOgImage && ( + <> + + + + + + )} + + {cfg.baseUrl && ( + <> + + + + + )} + + + + + + {css.map((resource) => CSSResourceToStyleElement(resource, true))} + {js + .filter((resource) => resource.loadTime === "beforeDOMReady") + .map((res) => JSResourceToScriptElement(res, true))} + {additionalHead.map((resource) => { + if (typeof resource === "function") { + return resource(fileData) + } else { + return resource + } + })} + + ) + } + + return Head +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Header.tsx b/src/quartz/components/Header.tsx new file mode 100644 index 0000000..eba17ae --- /dev/null +++ b/src/quartz/components/Header.tsx @@ -0,0 +1,22 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +const Header: QuartzComponent = ({ children }: QuartzComponentProps) => { + return children.length > 0 ?
{children}
: null +} + +Header.css = ` +header { + display: flex; + flex-direction: row; + align-items: center; + margin: 2rem 0; + gap: 1.5rem; +} + +header h1 { + margin: 0; + flex: auto; +} +` + +export default (() => Header) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/MobileOnly.tsx b/src/quartz/components/MobileOnly.tsx new file mode 100644 index 0000000..29958cf --- /dev/null +++ b/src/quartz/components/MobileOnly.tsx @@ -0,0 +1,14 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +export default ((component: QuartzComponent) => { + const Component = component + const MobileOnly: QuartzComponent = (props: QuartzComponentProps) => { + return + } + + MobileOnly.displayName = component.displayName + MobileOnly.afterDOMLoaded = component?.afterDOMLoaded + MobileOnly.beforeDOMLoaded = component?.beforeDOMLoaded + MobileOnly.css = component?.css + return MobileOnly +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/OverflowList.tsx b/src/quartz/components/OverflowList.tsx new file mode 100644 index 0000000..2cd1a75 --- /dev/null +++ b/src/quartz/components/OverflowList.tsx @@ -0,0 +1,48 @@ +import { JSX } from "preact" + +const OverflowList = ({ + children, + ...props +}: JSX.HTMLAttributes & { id: string }) => { + return ( +
    + {children} +
  • +
+ ) +} + +let numExplorers = 0 +export default () => { + const id = `list-${numExplorers++}` + + return { + OverflowList: (props: JSX.HTMLAttributes) => ( + + ), + overflowListAfterDOMLoaded: ` +document.addEventListener("nav", (e) => { + const observer = new IntersectionObserver((entries) => { + for (const entry of entries) { + const parentUl = entry.target.parentElement + if (!parentUl) return + 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()) +}) +`, + } +} diff --git a/src/quartz/components/PageList.tsx b/src/quartz/components/PageList.tsx new file mode 100644 index 0000000..7bf2382 --- /dev/null +++ b/src/quartz/components/PageList.tsx @@ -0,0 +1,114 @@ +import { FullSlug, isFolderPath, resolveRelative } from "../util/path" +import { QuartzPluginData } from "../plugins/vfile" +import { Date, getDate } from "./Date" +import { QuartzComponent, QuartzComponentProps } from "./types" +import { GlobalConfiguration } from "../cfg" + +export type SortFn = (f1: QuartzPluginData, f2: QuartzPluginData) => number + +export function byDateAndAlphabetical(cfg: GlobalConfiguration): SortFn { + return (f1, f2) => { + // Sort by date/alphabetical + if (f1.dates && f2.dates) { + // sort descending + return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.getTime() + } else if (f1.dates && !f2.dates) { + // prioritize files with dates + return -1 + } else if (!f1.dates && f2.dates) { + return 1 + } + + // otherwise, sort lexographically by title + const f1Title = f1.frontmatter?.title.toLowerCase() ?? "" + const f2Title = f2.frontmatter?.title.toLowerCase() ?? "" + return f1Title.localeCompare(f2Title) + } +} + +export function byDateAndAlphabeticalFolderFirst(cfg: GlobalConfiguration): SortFn { + return (f1, f2) => { + // Sort folders first + const f1IsFolder = isFolderPath(f1.slug ?? "") + const f2IsFolder = isFolderPath(f2.slug ?? "") + if (f1IsFolder && !f2IsFolder) return -1 + if (!f1IsFolder && f2IsFolder) return 1 + + // If both are folders or both are files, sort by date/alphabetical + if (f1.dates && f2.dates) { + // sort descending + return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.getTime() + } else if (f1.dates && !f2.dates) { + // prioritize files with dates + return -1 + } else if (!f1.dates && f2.dates) { + return 1 + } + + // otherwise, sort lexographically by title + const f1Title = f1.frontmatter?.title.toLowerCase() ?? "" + const f2Title = f2.frontmatter?.title.toLowerCase() ?? "" + return f1Title.localeCompare(f2Title) + } +} + +type Props = { + limit?: number + sort?: SortFn +} & QuartzComponentProps + +export const PageList: QuartzComponent = ({ cfg, fileData, allFiles, limit, sort }: Props) => { + const sorter = sort ?? byDateAndAlphabeticalFolderFirst(cfg) + let list = allFiles.sort(sorter) + if (limit) { + list = list.slice(0, limit) + } + + return ( +
    + {list.map((page) => { + const title = page.frontmatter?.title + const tags = page.frontmatter?.tags ?? [] + + return ( +
  • +
    +

    + {page.dates && } +

    + + +
    +
  • + ) + })} +
+ ) +} + +PageList.css = ` +.section h3 { + margin: 0; +} + +.section > .tags { + margin: 0; +} +` diff --git a/src/quartz/components/PageTitle.tsx b/src/quartz/components/PageTitle.tsx new file mode 100644 index 0000000..53ee824 --- /dev/null +++ b/src/quartz/components/PageTitle.tsx @@ -0,0 +1,24 @@ +import { pathToRoot } from "../util/path" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { classNames } from "../util/lang" +import { i18n } from "../i18n" + +const PageTitle: QuartzComponent = ({ fileData, cfg, displayClass }: QuartzComponentProps) => { + const title = cfg?.pageTitle ?? i18n(cfg.locale).propertyDefaults.title + const baseDir = pathToRoot(fileData.slug!) + return ( +

+ {title} +

+ ) +} + +PageTitle.css = ` +.page-title { + font-size: 1.75rem; + margin: 0; + font-family: var(--titleFont); +} +` + +export default (() => PageTitle) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/ReaderMode.tsx b/src/quartz/components/ReaderMode.tsx new file mode 100644 index 0000000..4b3165e --- /dev/null +++ b/src/quartz/components/ReaderMode.tsx @@ -0,0 +1,38 @@ +// @ts-ignore +import readerModeScript from "./scripts/readermode.inline" +import styles from "./styles/readermode.scss" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { i18n } from "../i18n" +import { classNames } from "../util/lang" + +const ReaderMode: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => { + return ( + + ) +} + +ReaderMode.beforeDOMLoaded = readerModeScript +ReaderMode.css = styles + +export default (() => ReaderMode) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/RecentNotes.tsx b/src/quartz/components/RecentNotes.tsx new file mode 100644 index 0000000..2c32fea --- /dev/null +++ b/src/quartz/components/RecentNotes.tsx @@ -0,0 +1,93 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { FullSlug, SimpleSlug, resolveRelative } from "../util/path" +import { QuartzPluginData } from "../plugins/vfile" +import { byDateAndAlphabetical } from "./PageList" +import style from "./styles/recentNotes.scss" +import { Date, getDate } from "./Date" +import { GlobalConfiguration } from "../cfg" +import { i18n } from "../i18n" +import { classNames } from "../util/lang" + +interface Options { + title?: string + limit: number + linkToMore: SimpleSlug | false + showTags: boolean + filter: (f: QuartzPluginData) => boolean + sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number +} + +const defaultOptions = (cfg: GlobalConfiguration): Options => ({ + limit: 3, + linkToMore: false, + showTags: true, + filter: () => true, + sort: byDateAndAlphabetical(cfg), +}) + +export default ((userOpts?: Partial) => { + const RecentNotes: QuartzComponent = ({ + allFiles, + fileData, + displayClass, + cfg, + }: QuartzComponentProps) => { + const opts = { ...defaultOptions(cfg), ...userOpts } + const pages = allFiles.filter(opts.filter).sort(opts.sort) + const remaining = Math.max(0, pages.length - opts.limit) + return ( +
+

{opts.title ?? i18n(cfg.locale).components.recentNotes.title}

+
    + {pages.slice(0, opts.limit).map((page) => { + const title = page.frontmatter?.title ?? i18n(cfg.locale).propertyDefaults.title + const tags = page.frontmatter?.tags ?? [] + + return ( +
  • +
    + + {page.dates && ( +

    + +

    + )} + {opts.showTags && ( + + )} +
    +
  • + ) + })} +
+ {opts.linkToMore && remaining > 0 && ( +

+ + {i18n(cfg.locale).components.recentNotes.seeRemainingMore({ remaining })} + +

+ )} +
+ ) + } + + RecentNotes.css = style + return RecentNotes +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Search.tsx b/src/quartz/components/Search.tsx new file mode 100644 index 0000000..4c6664a --- /dev/null +++ b/src/quartz/components/Search.tsx @@ -0,0 +1,53 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import style from "./styles/search.scss" +// @ts-ignore +import script from "./scripts/search.inline" +import { classNames } from "../util/lang" +import { i18n } from "../i18n" + +export interface SearchOptions { + enablePreview: boolean +} + +const defaultOptions: SearchOptions = { + enablePreview: true, +} + +export default ((userOpts?: Partial) => { + const Search: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => { + const opts = { ...defaultOptions, ...userOpts } + const searchPlaceholder = i18n(cfg.locale).components.search.searchBarPlaceholder + return ( +
+ +
+
+ +
+
+
+
+ ) + } + + Search.afterDOMLoaded = script + Search.css = style + + return Search +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/Spacer.tsx b/src/quartz/components/Spacer.tsx new file mode 100644 index 0000000..5288752 --- /dev/null +++ b/src/quartz/components/Spacer.tsx @@ -0,0 +1,8 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { classNames } from "../util/lang" + +function Spacer({ displayClass }: QuartzComponentProps) { + return
+} + +export default (() => Spacer) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/TableOfContents.tsx b/src/quartz/components/TableOfContents.tsx new file mode 100644 index 0000000..f3dc905 --- /dev/null +++ b/src/quartz/components/TableOfContents.tsx @@ -0,0 +1,96 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import legacyStyle from "./styles/legacyToc.scss" +import modernStyle from "./styles/toc.scss" +import { classNames } from "../util/lang" + +// @ts-ignore +import script from "./scripts/toc.inline" +import { i18n } from "../i18n" +import OverflowListFactory from "./OverflowList" +import { concatenateResources } from "../util/resources" + +interface Options { + layout: "modern" | "legacy" +} + +const defaultOptions: Options = { + layout: "modern", +} + +export default ((opts?: Partial) => { + const layout = opts?.layout ?? defaultOptions.layout + const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory() + const TableOfContents: QuartzComponent = ({ + fileData, + displayClass, + cfg, + }: QuartzComponentProps) => { + if (!fileData.toc) { + return null + } + + return ( +
+ + + {fileData.toc.map((tocEntry) => ( +
  • + + {tocEntry.text} + +
  • + ))} +
    +
    + ) + } + + TableOfContents.css = modernStyle + TableOfContents.afterDOMLoaded = concatenateResources(script, overflowListAfterDOMLoaded) + + const LegacyTableOfContents: QuartzComponent = ({ fileData, cfg }: QuartzComponentProps) => { + if (!fileData.toc) { + return null + } + return ( +
    + +

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

    +
    + +
    + ) + } + LegacyTableOfContents.css = legacyStyle + + return layout === "modern" ? TableOfContents : LegacyTableOfContents +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/TagList.tsx b/src/quartz/components/TagList.tsx new file mode 100644 index 0000000..c73ed39 --- /dev/null +++ b/src/quartz/components/TagList.tsx @@ -0,0 +1,56 @@ +import { FullSlug, resolveRelative } from "../util/path" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { classNames } from "../util/lang" + +const TagList: QuartzComponent = ({ fileData, displayClass }: QuartzComponentProps) => { + const tags = fileData.frontmatter?.tags + if (tags && tags.length > 0) { + return ( +
      + {tags.map((tag) => { + const linkDest = resolveRelative(fileData.slug!, `tags/${tag}` as FullSlug) + return ( +
    • + + {tag} + +
    • + ) + })} +
    + ) + } else { + return null + } +} + +TagList.css = ` +.tags { + list-style: none; + display: flex; + padding-left: 0; + gap: 0.4rem; + margin: 1rem 0; + flex-wrap: wrap; +} + +.section-li > .section > .tags { + justify-content: flex-end; +} + +.tags > li { + display: inline-block; + white-space: nowrap; + margin: 0; + overflow-wrap: normal; +} + +a.internal.tag-link { + border-radius: 8px; + background-color: var(--highlight); + padding: 0.2rem 0.4rem; + margin: 0 0.1rem; +} +` + +export default (() => TagList) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/index.ts b/src/quartz/components/index.ts new file mode 100644 index 0000000..cece8e6 --- /dev/null +++ b/src/quartz/components/index.ts @@ -0,0 +1,53 @@ +import Content from "./pages/Content" +import TagContent from "./pages/TagContent" +import FolderContent from "./pages/FolderContent" +import NotFound from "./pages/404" +import ArticleTitle from "./ArticleTitle" +import Darkmode from "./Darkmode" +import ReaderMode from "./ReaderMode" +import Head from "./Head" +import PageTitle from "./PageTitle" +import ContentMeta from "./ContentMeta" +import Spacer from "./Spacer" +import TableOfContents from "./TableOfContents" +import Explorer from "./Explorer" +import TagList from "./TagList" +import Graph from "./Graph" +import Backlinks from "./Backlinks" +import Search from "./Search" +import Footer from "./Footer" +import DesktopOnly from "./DesktopOnly" +import MobileOnly from "./MobileOnly" +import RecentNotes from "./RecentNotes" +import Breadcrumbs from "./Breadcrumbs" +import Comments from "./Comments" +import Flex from "./Flex" +import ConditionalRender from "./ConditionalRender" + +export { + ArticleTitle, + Content, + TagContent, + FolderContent, + Darkmode, + ReaderMode, + Head, + PageTitle, + ContentMeta, + Spacer, + TableOfContents, + Explorer, + TagList, + Graph, + Backlinks, + Search, + Footer, + DesktopOnly, + MobileOnly, + RecentNotes, + NotFound, + Breadcrumbs, + Comments, + Flex, + ConditionalRender, +} diff --git a/src/quartz/components/pages/404.tsx b/src/quartz/components/pages/404.tsx new file mode 100644 index 0000000..63da2c8 --- /dev/null +++ b/src/quartz/components/pages/404.tsx @@ -0,0 +1,18 @@ +import { i18n } from "../../i18n" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "../types" + +const NotFound: QuartzComponent = ({ cfg }: QuartzComponentProps) => { + // If baseUrl contains a pathname after the domain, use this as the home link + const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) + const baseDir = url.pathname + + return ( + + ) +} + +export default (() => NotFound) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/pages/Content.tsx b/src/quartz/components/pages/Content.tsx new file mode 100644 index 0000000..e21aad7 --- /dev/null +++ b/src/quartz/components/pages/Content.tsx @@ -0,0 +1,12 @@ +import { ComponentChildren } from "preact" +import { htmlToJsx } from "../../util/jsx" +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "../types" + +const Content: QuartzComponent = ({ fileData, tree }: QuartzComponentProps) => { + const content = htmlToJsx(fileData.filePath!, tree) as ComponentChildren + const classes: string[] = fileData.frontmatter?.cssclasses ?? [] + const classString = ["popover-hint", ...classes].join(" ") + return
    {content}
    +} + +export default (() => Content) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/pages/FolderContent.tsx b/src/quartz/components/pages/FolderContent.tsx new file mode 100644 index 0000000..afd4f5d --- /dev/null +++ b/src/quartz/components/pages/FolderContent.tsx @@ -0,0 +1,126 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "../types" + +import style from "../styles/listPage.scss" +import { PageList, SortFn } from "../PageList" +import { Root } from "hast" +import { htmlToJsx } from "../../util/jsx" +import { i18n } from "../../i18n" +import { QuartzPluginData } from "../../plugins/vfile" +import { ComponentChildren } from "preact" +import { concatenateResources } from "../../util/resources" +import { trieFromAllFiles } from "../../util/ctx" + +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) => { + const options: FolderContentOptions = { ...defaultOptions, ...opts } + + const FolderContent: QuartzComponent = (props: QuartzComponentProps) => { + const { tree, fileData, allFiles, cfg } = props + + const trie = (props.ctx.trie ??= trieFromAllFiles(allFiles)) + const folder = trie.findNode(fileData.slug!.split("/")) + if (!folder) { + return null + } + + const allPagesInFolder: QuartzPluginData[] = + folder.children + .map((node) => { + // regular file, proceed + if (node.data) { + return node.data + } + + if (node.isFolder && options.showSubfolders) { + // folders that dont have data need synthetic files + const getMostRecentDates = (): QuartzPluginData["dates"] => { + let maybeDates: QuartzPluginData["dates"] | undefined = undefined + for (const child of node.children) { + if (child.data?.dates) { + // compare all dates and assign to maybeDates if its more recent or its not set + if (!maybeDates) { + maybeDates = { ...child.data.dates } + } else { + if (child.data.dates.created > maybeDates.created) { + maybeDates.created = child.data.dates.created + } + + if (child.data.dates.modified > maybeDates.modified) { + maybeDates.modified = child.data.dates.modified + } + + if (child.data.dates.published > maybeDates.published) { + maybeDates.published = child.data.dates.published + } + } + } + } + return ( + maybeDates ?? { + created: new Date(), + modified: new Date(), + published: new Date(), + } + ) + } + + return { + slug: node.slug, + dates: getMostRecentDates(), + frontmatter: { + title: node.displayName, + tags: [], + }, + } + } + }) + .filter((page) => page !== undefined) ?? [] + const cssClasses: string[] = fileData.frontmatter?.cssclasses ?? [] + const classes = cssClasses.join(" ") + const listProps = { + ...props, + sort: options.sort, + allFiles: allPagesInFolder, + } + + const content = ( + (tree as Root).children.length === 0 + ? fileData.description + : htmlToJsx(fileData.filePath!, tree) + ) as ComponentChildren + + return ( +
    +
    {content}
    +
    + {options.showFolderCount && ( +

    + {i18n(cfg.locale).pages.folderContent.itemsUnderFolder({ + count: allPagesInFolder.length, + })} +

    + )} +
    + +
    +
    +
    + ) + } + + FolderContent.css = concatenateResources(style, PageList.css) + return FolderContent +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/pages/TagContent.tsx b/src/quartz/components/pages/TagContent.tsx new file mode 100644 index 0000000..a1df6e1 --- /dev/null +++ b/src/quartz/components/pages/TagContent.tsx @@ -0,0 +1,133 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "../types" +import style from "../styles/listPage.scss" +import { PageList, SortFn } from "../PageList" +import { FullSlug, getAllSegmentPrefixes, resolveRelative, simplifySlug } from "../../util/path" +import { QuartzPluginData } from "../../plugins/vfile" +import { Root } from "hast" +import { htmlToJsx } from "../../util/jsx" +import { i18n } from "../../i18n" +import { ComponentChildren } from "preact" +import { concatenateResources } from "../../util/resources" + +interface TagContentOptions { + sort?: SortFn + numPages: number +} + +const defaultOptions: TagContentOptions = { + numPages: 10, +} + +export default ((opts?: Partial) => { + const options: TagContentOptions = { ...defaultOptions, ...opts } + + const TagContent: QuartzComponent = (props: QuartzComponentProps) => { + const { tree, fileData, allFiles, cfg } = props + const slug = fileData.slug + + if (!(slug?.startsWith("tags/") || slug === "tags")) { + throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug}`) + } + + const tag = simplifySlug(slug.slice("tags/".length) as FullSlug) + const allPagesWithTag = (tag: string) => + allFiles.filter((file) => + (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(tag), + ) + + const content = ( + (tree as Root).children.length === 0 + ? fileData.description + : htmlToJsx(fileData.filePath!, tree) + ) as ComponentChildren + const cssClasses: string[] = fileData.frontmatter?.cssclasses ?? [] + const classes = cssClasses.join(" ") + if (tag === "/") { + const tags = [ + ...new Set( + allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes), + ), + ].sort((a, b) => a.localeCompare(b)) + const tagItemMap: Map = new Map() + for (const tag of tags) { + tagItemMap.set(tag, allPagesWithTag(tag)) + } + return ( +
    +
    +

    {content}

    +
    +

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

    +
    + {tags.map((tag) => { + const pages = tagItemMap.get(tag)! + const listProps = { + ...props, + allFiles: pages, + } + + const contentPage = allFiles.filter((file) => file.slug === `tags/${tag}`).at(0) + + const root = contentPage?.htmlAst + const content = + !root || root?.children.length === 0 + ? contentPage?.description + : htmlToJsx(contentPage.filePath!, root) + + const tagListingPage = `/tags/${tag}` as FullSlug + const href = resolveRelative(fileData.slug!, tagListingPage) + + return ( +
    +

    + + {tag} + +

    + {content &&

    {content}

    } +
    +

    + {i18n(cfg.locale).pages.tagContent.itemsUnderTag({ count: pages.length })} + {pages.length > options.numPages && ( + <> + {" "} + + {i18n(cfg.locale).pages.tagContent.showingFirst({ + count: options.numPages, + })} + + + )} +

    + +
    +
    + ) + })} +
    +
    + ) + } else { + const pages = allPagesWithTag(tag) + const listProps = { + ...props, + allFiles: pages, + } + + return ( +
    +
    {content}
    +
    +

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

    +
    + +
    +
    +
    + ) + } + } + + TagContent.css = concatenateResources(style, PageList.css) + return TagContent +}) satisfies QuartzComponentConstructor diff --git a/src/quartz/components/renderPage.tsx b/src/quartz/components/renderPage.tsx new file mode 100644 index 0000000..e43189d --- /dev/null +++ b/src/quartz/components/renderPage.tsx @@ -0,0 +1,274 @@ +import { render } from "preact-render-to-string" +import { QuartzComponent, QuartzComponentProps } from "./types" +import HeaderConstructor from "./Header" +import BodyConstructor from "./Body" +import { JSResourceToScriptElement, StaticResources } from "../util/resources" +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" +import { i18n } from "../i18n" + +interface RenderComponents { + head: QuartzComponent + header: QuartzComponent[] + beforeBody: QuartzComponent[] + pageBody: QuartzComponent + afterBody: QuartzComponent[] + left: QuartzComponent[] + right: QuartzComponent[] + footer: QuartzComponent +} + +const headerRegex = new RegExp(/h[1-6]/) +export function pageResources( + baseDir: FullSlug | RelativeURL, + staticResources: StaticResources, +): StaticResources { + const contentIndexPath = joinSegments(baseDir, "static/contentIndex.json") + const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())` + + const resources: StaticResources = { + css: [ + { + content: joinSegments(baseDir, "index.css"), + }, + ...staticResources.css, + ], + js: [ + { + src: joinSegments(baseDir, "prescript.js"), + loadTime: "beforeDOMReady", + contentType: "external", + }, + { + loadTime: "beforeDOMReady", + contentType: "inline", + spaPreserve: true, + script: contentIndexScript, + }, + ...staticResources.js, + ], + additionalHead: staticResources.additionalHead, + } + + resources.js.push({ + src: joinSegments(baseDir, "postscript.js"), + loadTime: "afterDOMReady", + moduleType: "module", + contentType: "external", + }) + + return resources +} + +function renderTranscludes( + root: Root, + cfg: GlobalConfiguration, + slug: FullSlug, + componentData: QuartzComponentProps, +) { + // process transcludes in componentData + visit(root, "element", (node, _index, _parent) => { + if (node.tagName === "blockquote") { + const classNames = (node.properties?.className ?? []) as string[] + if (classNames.includes("transclude")) { + const inner = node.children[0] as Element + const transcludeTarget = (inner.properties["data-slug"] ?? slug) as FullSlug + const page = componentData.allFiles.find((f) => f.slug === transcludeTarget) + if (!page) { + return + } + + let blockRef = node.properties.dataBlock as string | undefined + if (blockRef?.startsWith("#^")) { + // block transclude + blockRef = blockRef.slice("#^".length) + let blockNode = page.blocks?.[blockRef] + if (blockNode) { + if (blockNode.tagName === "li") { + blockNode = { + type: "element", + tagName: "ul", + properties: {}, + children: [blockNode], + } + } + + node.children = [ + normalizeHastElement(blockNode, slug, transcludeTarget), + { + type: "element", + tagName: "a", + properties: { href: inner.properties?.href, class: ["internal", "transclude-src"] }, + children: [ + { type: "text", value: i18n(cfg.locale).components.transcludes.linkToOriginal }, + ], + }, + ] + } + } else if (blockRef?.startsWith("#") && page.htmlAst) { + // header transclude + blockRef = blockRef.slice(1) + let startIdx = undefined + let startDepth = undefined + let endIdx = undefined + for (const [i, el] of page.htmlAst.children.entries()) { + // skip non-headers + if (!(el.type === "element" && el.tagName.match(headerRegex))) continue + const depth = Number(el.tagName.substring(1)) + + // lookin for our blockref + if (startIdx === undefined || startDepth === undefined) { + // skip until we find the blockref that matches + if (el.properties?.id === blockRef) { + startIdx = i + startDepth = depth + } + } else if (depth <= startDepth) { + // looking for new header that is same level or higher + endIdx = i + break + } + } + + if (startIdx === undefined) { + return + } + + node.children = [ + ...(page.htmlAst.children.slice(startIdx, endIdx) as ElementContent[]).map((child) => + normalizeHastElement(child as Element, slug, transcludeTarget), + ), + { + type: "element", + tagName: "a", + properties: { href: inner.properties?.href, class: ["internal", "transclude-src"] }, + children: [ + { type: "text", value: i18n(cfg.locale).components.transcludes.linkToOriginal }, + ], + }, + ] + } else if (page.htmlAst) { + // page transclude + node.children = [ + { + type: "element", + tagName: "h1", + properties: {}, + children: [ + { + type: "text", + value: + page.frontmatter?.title ?? + i18n(cfg.locale).components.transcludes.transcludeOf({ + targetSlug: page.slug!, + }), + }, + ], + }, + ...(page.htmlAst.children as ElementContent[]).map((child) => + normalizeHastElement(child as Element, slug, transcludeTarget), + ), + { + type: "element", + tagName: "a", + properties: { href: inner.properties?.href, class: ["internal", "transclude-src"] }, + children: [ + { type: "text", value: i18n(cfg.locale).components.transcludes.linkToOriginal }, + ], + }, + ] + } + } + } + }) +} + +export function renderPage( + cfg: GlobalConfiguration, + slug: FullSlug, + componentData: QuartzComponentProps, + components: RenderComponents, + pageResources: StaticResources, +): string { + // make a deep copy of the tree so we don't remove the transclusion references + // for the file cached in contentMap in build.ts + const root = clone(componentData.tree) as Root + renderTranscludes(root, cfg, slug, componentData) + + // set componentData.tree to the edited html that has transclusions rendered + componentData.tree = root + + const { + head: Head, + header, + beforeBody, + pageBody: Content, + afterBody, + left, + right, + footer: Footer, + } = components + const Header = HeaderConstructor() + const Body = BodyConstructor() + + const LeftComponent = ( + + ) + + const RightComponent = ( + + ) + + const lang = componentData.fileData.frontmatter?.lang ?? cfg.locale?.split("-")[0] ?? "en" + const doc = ( + + + +
    + + {LeftComponent} +
    + + +
    + +
    + {RightComponent} +
    + +
    + + {pageResources.js + .filter((resource) => resource.loadTime === "afterDOMReady") + .map((res) => JSResourceToScriptElement(res))} + + ) + + return "\n" + render(doc) +} diff --git a/src/quartz/components/scripts/callout.inline.ts b/src/quartz/components/scripts/callout.inline.ts new file mode 100644 index 0000000..242ce51 --- /dev/null +++ b/src/quartz/components/scripts/callout.inline.ts @@ -0,0 +1,27 @@ +function toggleCallout(this: HTMLElement) { + const outerBlock = this.parentElement! + outerBlock.classList.toggle("is-collapsed") + const content = outerBlock.getElementsByClassName("callout-content")[0] as HTMLElement + if (!content) return + const collapsed = outerBlock.classList.contains("is-collapsed") + content.style.gridTemplateRows = collapsed ? "0fr" : "1fr" +} + +function setupCallout() { + const collapsible = document.getElementsByClassName( + `callout is-collapsible`, + ) as HTMLCollectionOf + for (const div of collapsible) { + const title = div.getElementsByClassName("callout-title")[0] as HTMLElement + const content = div.getElementsByClassName("callout-content")[0] as HTMLElement + if (!title || !content) continue + + title.addEventListener("click", toggleCallout) + window.addCleanup(() => title.removeEventListener("click", toggleCallout)) + + const collapsed = div.classList.contains("is-collapsed") + content.style.gridTemplateRows = collapsed ? "0fr" : "1fr" + } +} + +document.addEventListener("nav", setupCallout) diff --git a/src/quartz/components/scripts/checkbox.inline.ts b/src/quartz/components/scripts/checkbox.inline.ts new file mode 100644 index 0000000..50ab042 --- /dev/null +++ b/src/quartz/components/scripts/checkbox.inline.ts @@ -0,0 +1,23 @@ +import { getFullSlug } from "../../util/path" + +const checkboxId = (index: number) => `${getFullSlug(window)}-checkbox-${index}` + +document.addEventListener("nav", () => { + const checkboxes = document.querySelectorAll( + "input.checkbox-toggle", + ) as NodeListOf + checkboxes.forEach((el, index) => { + const elId = checkboxId(index) + + const switchState = (e: Event) => { + const newCheckboxState = (e.target as HTMLInputElement)?.checked ? "true" : "false" + localStorage.setItem(elId, newCheckboxState) + } + + el.addEventListener("change", switchState) + window.addCleanup(() => el.removeEventListener("change", switchState)) + if (localStorage.getItem(elId) === "true") { + el.checked = true + } + }) +}) diff --git a/src/quartz/components/scripts/clipboard.inline.ts b/src/quartz/components/scripts/clipboard.inline.ts new file mode 100644 index 0000000..e16c112 --- /dev/null +++ b/src/quartz/components/scripts/clipboard.inline.ts @@ -0,0 +1,37 @@ +const svgCopy = + '' +const svgCheck = + '' + +document.addEventListener("nav", () => { + const els = document.getElementsByTagName("pre") + for (let i = 0; i < els.length; i++) { + const codeBlock = els[i].getElementsByTagName("code")[0] + if (codeBlock) { + 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" + button.innerHTML = svgCopy + button.ariaLabel = "Copy source" + function onClick() { + navigator.clipboard.writeText(source).then( + () => { + button.blur() + button.innerHTML = svgCheck + setTimeout(() => { + button.innerHTML = svgCopy + button.style.borderColor = "" + }, 2000) + }, + (error) => console.error(error), + ) + } + button.addEventListener("click", onClick) + window.addCleanup(() => button.removeEventListener("click", onClick)) + els[i].prepend(button) + } + } +}) diff --git a/src/quartz/components/scripts/comments.inline.ts b/src/quartz/components/scripts/comments.inline.ts new file mode 100644 index 0000000..2b876bf --- /dev/null +++ b/src/quartz/components/scripts/comments.inline.ts @@ -0,0 +1,92 @@ +const changeTheme = (e: CustomEventMap["themechange"]) => { + const theme = e.detail.theme + const iframe = document.querySelector("iframe.giscus-frame") as HTMLIFrameElement + if (!iframe) { + return + } + + if (!iframe.contentWindow) { + return + } + + iframe.contentWindow.postMessage( + { + giscus: { + setConfig: { + theme: getThemeUrl(getThemeName(theme)), + }, + }, + }, + "https://giscus.app", + ) +} + +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 + inputPosition: "top" | "bottom" + lang: string + } +} + +document.addEventListener("nav", () => { + const giscusContainer = document.querySelector(".giscus") as GiscusElement + if (!giscusContainer) { + return + } + + const giscusScript = document.createElement("script") + giscusScript.src = "https://giscus.app/client.js" + giscusScript.async = true + giscusScript.crossOrigin = "anonymous" + giscusScript.setAttribute("data-loading", "lazy") + giscusScript.setAttribute("data-emit-metadata", "0") + giscusScript.setAttribute("data-repo", giscusContainer.dataset.repo) + giscusScript.setAttribute("data-repo-id", giscusContainer.dataset.repoId) + giscusScript.setAttribute("data-category", giscusContainer.dataset.category) + giscusScript.setAttribute("data-category-id", giscusContainer.dataset.categoryId) + giscusScript.setAttribute("data-mapping", giscusContainer.dataset.mapping) + giscusScript.setAttribute("data-strict", giscusContainer.dataset.strict) + giscusScript.setAttribute("data-reactions-enabled", giscusContainer.dataset.reactionsEnabled) + giscusScript.setAttribute("data-input-position", giscusContainer.dataset.inputPosition) + giscusScript.setAttribute("data-lang", giscusContainer.dataset.lang) + const theme = document.documentElement.getAttribute("saved-theme") + if (theme) { + giscusScript.setAttribute("data-theme", getThemeUrl(getThemeName(theme))) + } + + giscusContainer.appendChild(giscusScript) + + document.addEventListener("themechange", changeTheme) + window.addCleanup(() => document.removeEventListener("themechange", changeTheme)) +}) diff --git a/src/quartz/components/scripts/darkmode.inline.ts b/src/quartz/components/scripts/darkmode.inline.ts new file mode 100644 index 0000000..d8dfee9 --- /dev/null +++ b/src/quartz/components/scripts/darkmode.inline.ts @@ -0,0 +1,37 @@ +const userPref = window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark" +const currentTheme = localStorage.getItem("theme") ?? userPref +document.documentElement.setAttribute("saved-theme", currentTheme) + +const emitThemeChangeEvent = (theme: "light" | "dark") => { + const event: CustomEventMap["themechange"] = new CustomEvent("themechange", { + detail: { theme }, + }) + document.dispatchEvent(event) +} + +document.addEventListener("nav", () => { + const switchTheme = () => { + const newTheme = + document.documentElement.getAttribute("saved-theme") === "dark" ? "light" : "dark" + document.documentElement.setAttribute("saved-theme", newTheme) + localStorage.setItem("theme", newTheme) + emitThemeChangeEvent(newTheme) + } + + const themeChange = (e: MediaQueryListEvent) => { + const newTheme = e.matches ? "dark" : "light" + document.documentElement.setAttribute("saved-theme", newTheme) + localStorage.setItem("theme", newTheme) + emitThemeChangeEvent(newTheme) + } + + for (const darkmodeButton of document.getElementsByClassName("darkmode")) { + darkmodeButton.addEventListener("click", switchTheme) + window.addCleanup(() => darkmodeButton.removeEventListener("click", switchTheme)) + } + + // Listen for changes in prefers-color-scheme + const colorSchemeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)") + colorSchemeMediaQuery.addEventListener("change", themeChange) + window.addCleanup(() => colorSchemeMediaQuery.removeEventListener("change", themeChange)) +}) diff --git a/src/quartz/components/scripts/explorer.inline.ts b/src/quartz/components/scripts/explorer.inline.ts new file mode 100644 index 0000000..9c83411 --- /dev/null +++ b/src/quartz/components/scripts/explorer.inline.ts @@ -0,0 +1,301 @@ +import { FileTrieNode } from "../../util/fileTrie" +import { FullSlug, resolveRelative, simplifySlug } from "../../util/path" +import { ContentDetails } from "../../plugins/emitters/contentIndex" + +type MaybeHTMLElement = HTMLElement | undefined + +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) { + const nearestExplorer = this.closest(".explorer") as HTMLElement + if (!nearestExplorer) return + const explorerCollapsed = nearestExplorer.classList.toggle("collapsed") + nearestExplorer.setAttribute( + "aria-expanded", + nearestExplorer.getAttribute("aria-expanded") === "true" ? "false" : "true", + ) + + if (!explorerCollapsed) { + // Stop from being scrollable when mobile explorer is open + document.documentElement.classList.add("mobile-no-scroll") + } else { + document.documentElement.classList.remove("mobile-no-scroll") + } +} + +function toggleFolder(evt: MouseEvent) { + evt.stopPropagation() + const target = evt.target as MaybeHTMLElement + if (!target) return + + // Check if target was svg icon or button + const isSvg = target.nodeName === "svg" + + // corresponding