Musings from the mountains himwant.org

Initial Commit

+15655
+1
.gitattributes
··· 1 + public/* -linguist-detectable
+2
.github/FUNDING.yml
··· 1 + # These are supported funding model platforms 2 + ko_fi: stelclementine
+93
.github/workflows/astro.yml
··· 1 + # Sample workflow for building and deploying an Astro site to GitHub Pages 2 + # 3 + # To get started with Astro see: https://docs.astro.build/en/getting-started/ 4 + # 5 + name: Deploy Astro site to Pages 6 + 7 + on: 8 + # Runs on pushes targeting the default branch 9 + push: 10 + branches: ['main'] 11 + 12 + # Allows you to run this workflow manually from the Actions tab 13 + workflow_dispatch: 14 + 15 + # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 16 + permissions: 17 + contents: read 18 + pages: write 19 + id-token: write 20 + 21 + # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 22 + # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 23 + concurrency: 24 + group: 'pages' 25 + cancel-in-progress: false 26 + 27 + env: 28 + BUILD_PATH: '.' # default value when not using subfolders 29 + # BUILD_PATH: subfolder 30 + 31 + jobs: 32 + build: 33 + name: Build 34 + runs-on: ubuntu-latest 35 + steps: 36 + - name: Checkout 37 + uses: actions/checkout@v4 38 + - name: Detect package manager 39 + id: detect-package-manager 40 + run: | 41 + if [ -f "${{ github.workspace }}/yarn.lock" ]; then 42 + echo "manager=yarn" >> $GITHUB_OUTPUT 43 + echo "command=install" >> $GITHUB_OUTPUT 44 + echo "runner=yarn" >> $GITHUB_OUTPUT 45 + echo "lockfile=yarn.lock" >> $GITHUB_OUTPUT 46 + exit 0 47 + elif [ -f "${{ github.workspace }}/package.json" ]; then 48 + echo "manager=npm" >> $GITHUB_OUTPUT 49 + echo "command=ci" >> $GITHUB_OUTPUT 50 + echo "runner=npx --no-install" >> $GITHUB_OUTPUT 51 + echo "lockfile=package-lock.json" >> $GITHUB_OUTPUT 52 + exit 0 53 + else 54 + echo "Unable to determine package manager" 55 + exit 1 56 + fi 57 + - name: Setup Node 58 + uses: actions/setup-node@v4 59 + with: 60 + node-version: '20' 61 + cache: ${{ steps.detect-package-manager.outputs.manager }} 62 + cache-dependency-path: ${{ env.BUILD_PATH }}/${{ steps.detect-package-manager.outputs.lockfile }} 63 + - name: Setup Pages 64 + id: pages 65 + uses: actions/configure-pages@v5 66 + - name: Install dependencies 67 + run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }} 68 + working-directory: ${{ env.BUILD_PATH }} 69 + - name: Build with Astro 70 + run: | 71 + ${{ steps.detect-package-manager.outputs.runner }} astro build \ 72 + --site "${{ steps.pages.outputs.origin }}" \ 73 + --base "${{ steps.pages.outputs.base_path }}" 74 + - name: Build Pagefind Index 75 + run: | 76 + ${{ steps.detect-package-manager.outputs.runner }} pagefind --site dist 77 + working-directory: ${{ env.BUILD_PATH }} 78 + - name: Upload artifact 79 + uses: actions/upload-pages-artifact@v3 80 + with: 81 + path: ${{ env.BUILD_PATH }}/dist 82 + 83 + deploy: 84 + environment: 85 + name: github-pages 86 + url: ${{ steps.deployment.outputs.page_url }} 87 + needs: build 88 + runs-on: ubuntu-latest 89 + name: Deploy 90 + steps: 91 + - name: Deploy to GitHub Pages 92 + id: deployment 93 + uses: actions/deploy-pages@v4
+24
.gitignore
··· 1 + # build output 2 + dist/ 3 + 4 + # generated types 5 + .astro/ 6 + 7 + # dependencies 8 + node_modules/ 9 + 10 + # logs 11 + npm-debug.log* 12 + yarn-debug.log* 13 + yarn-error.log* 14 + pnpm-debug.log* 15 + 16 + # environment variables 17 + .env 18 + .env.production 19 + 20 + # macOS-specific files 21 + .DS_Store 22 + 23 + # jetbrains setting folder 24 + .idea/
+4
.vscode/extensions.json
··· 1 + { 2 + "recommendations": ["astro-build.astro-vscode"], 3 + "unwantedRecommendations": [] 4 + }
+11
.vscode/launch.json
··· 1 + { 2 + "version": "0.2.0", 3 + "configurations": [ 4 + { 5 + "command": "./node_modules/.bin/astro dev", 6 + "name": "Development server", 7 + "request": "launch", 8 + "type": "node-terminal" 9 + } 10 + ] 11 + }
+7
LICENSE.txt
··· 1 + Copyright 2025 Stel Clementine 2 + 3 + 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: 4 + 5 + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 + 7 + 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.
+81
README.md
··· 1 + # MultiTerm Astro 🎨⚡️ 2 + 3 + **MultiTerm** is an Astro blog theme designed for coders who love their color schemes. Easily theme your whole website with your favorite color schemes and have your prose rendered with a nod to the aesthetics of raw markdown. 4 + 5 + Check out the [Showing Off Blog Features](https://multiterm.stelclementine.com/posts/showing-off-blog-features) post to see all the exciting MultiTerm capabilites on the [live example site](https://multiterm.stelclementine.com)! 6 + 7 + > v2.0.0 has been released! 🥳 8 + 9 + ![Example website screenshot](https://i.imgur.com/sC8fZGN.png) 10 + ![Example website screenshot](https://i.imgur.com/Kms96QY.png) 11 + ![Example website screenshot](https://i.imgur.com/Nrr76Ub.png) 12 + ![Example website screenshot](https://i.imgur.com/vKxEO5k.png) 13 + ![Example website screenshot](https://i.imgur.com/wHGGJY9.png) 14 + ![Example website screenshot](https://i.imgur.com/YerKFZW.png) 15 + ![Example autogenerated social card](https://i.imgur.com/4CBBdF3.png) 16 + 17 + ## ✨ Features 18 + 19 + - **Amazing Theme Selection**: Personalize your blog's appearance with your favorite editor color scheme. Pick your favorite [Shiki themes](https://expressive-code.com/guides/themes/#available-themes) bundled with Expressive Code. 20 + - **Dark/Light/Auto Theme Mode**: Choose any two Shiki themes and use the standard light/dark/auto model for automatically adapting to your reader's theme preferences with button in the site header. 21 + - **Multiple Theme Mode**: Choose three (or all 59!) Shiki themes and allow your reader to choose their favorite from a dialog menu opened from a button in the header. Every element seamlessly changes color interactively using the magic of CSS variables. 22 + - **GitHub Comment Section**: Allow readers to respond, discuss, and react with a comment section powered by GitHub and [Giscus](https://giscus.app). Painstakingly themed to match your site perfectly. 23 + - **GitHub Activity Widget**: Optionally include a statically generated GitHub activity calendar on the homepage that (of course) matches the active color scheme perfectly. 24 + - **Markdown Extensions**: Admonitions, auto-generated TOC that sticks to the side on large screens, emoji shortcodes, KaTeX math, MDX, and reading time estimates. See the example site's [Showing Off Blog Features](https://multiterm.stelclementine.com/posts/showing-off-blog-features) post. 25 + - **RSS Feed and Sitemap**: Built-in support for RSS feeds and sitemap with no extra configuration. 26 + - **Social Links**: Easily include links to common developer platforms including GitHub, Mastodon, Twitter, LinkedIn and E-mail. 27 + - **Responsive Design**: Optimized for all devices from desktops to mobile phones. Built with [Tailwind v4](https://tailwindcss.com/). 28 + - **SEO Optimized**: Boost your site's visibility with built-in SEO best practices and automatically generated social card images for every page via [Satori](https://github.com/vercel/satori). 29 + - **Customizable Build**: Powered by [Astro](https://astro.build/), render as a static site (the default) or generate content dynamically. 30 + 31 + Check out the example site [PageSpeed scores](https://pagespeed.web.dev/analysis/https-multiterm-stelclementine-com/qhnp521yci?form_factor=mobile) and [OpenGraph analysis](https://www.opengraph.xyz/url/https%3A%2F%2Fmultiterm.stelclementine.com) 32 + 33 + ## 🚀 Getting Started 34 + 35 + **Clone the Repository**: 36 + 37 + ```bash 38 + git clone --depth 1 https://github.com/stelcodes/multiterm-astro my-new-blog && cd my-new-blog 39 + ``` 40 + 41 + **Install Dependencies**: 42 + 43 + ```bash 44 + npm install 45 + ``` 46 + 47 + **Start the Development Server**: 48 + 49 + ```bash 50 + npm run dev 51 + ``` 52 + 53 + **Build Your Site and View the Results**: 54 + 55 + ```bash 56 + npm run build && npm run preview 57 + ``` 58 + 59 + ## 🛠️ Configuration 60 + 61 + Simple configuration is a core feature of MultiTerm. All configuration is done from a single file: `src/site.config.ts`. This is where you can tailor your website to match your vision. 62 + 63 + Please take a look at `src/site.config.ts` for more information about the configuration options. 64 + 65 + To add your own content, check out the `src/content` directory. Feel free to remove all the example content and replace it with your own! 66 + 67 + ## 📄 License 68 + 69 + This project is licensed under the [MIT License](LICENSE.txt). 70 + 71 + ## Inspiration 72 + 73 + - https://github.com/panr/hugo-theme-terminal 74 + - https://github.com/chrismwilliams/astro-theme-cactus 75 + 76 + ## 🩷 Sponsor 77 + 78 + Consider [buying me a coffee](https://ko-fi.com/stelclementine) to keep me caffeinated while I work on open source projects like this one! 79 + 80 + 81 + [![Star History Chart](https://api.star-history.com/svg?repos=stelcodes/multiterm-astro&type=Date)](https://www.star-history.com/#stelcodes/multiterm-astro&Date)
+82
astro.config.mjs
··· 1 + // @ts-check 2 + import { defineConfig } from 'astro/config' 3 + import tailwindcss from '@tailwindcss/vite' 4 + import sitemap from '@astrojs/sitemap' 5 + import mdx from '@astrojs/mdx' 6 + import { rehypeHeadingIds } from '@astrojs/markdown-remark' 7 + import rehypeAutolinkHeadings from 'rehype-autolink-headings' 8 + import expressiveCode from 'astro-expressive-code' 9 + import siteConfig from './src/site.config' 10 + import { pluginLineNumbers } from '@expressive-code/plugin-line-numbers' 11 + import remarkDescription from './src/plugins/remark-description' /* Add description to frontmatter */ 12 + import remarkReadingTime from './src/plugins/remark-reading-time' /* Add reading time to frontmatter */ 13 + import rehypeTitleFigure from './src/plugins/rehype-title-figure' /* Wraps titles in figures */ 14 + import { remarkGithubCard } from './src/plugins/remark-github-card' 15 + import { fromHtmlIsomorphic } from 'hast-util-from-html-isomorphic' 16 + import rehypeExternalLinks from 'rehype-external-links' 17 + import remarkDirective from 'remark-directive' /* Handle ::: directives as nodes */ 18 + import rehypeUnwrapImages from 'rehype-unwrap-images' 19 + import { remarkAdmonitions } from './src/plugins/remark-admonitions' /* Add admonitions */ 20 + import remarkCharacterDialogue from './src/plugins/remark-character-dialogue' /* Custom plugin to handle character admonitions */ 21 + import remarkUnknownDirectives from './src/plugins/remark-unknown-directives' /* Custom plugin to handle unknown admonitions */ 22 + import remarkMath from 'remark-math' /* for latex math support */ 23 + import rehypeKatex from 'rehype-katex' /* again, for latex math support */ 24 + import remarkGemoji from './src/plugins/remark-gemoji' /* for shortcode emoji support */ 25 + import rehypePixelated from './src/plugins/rehype-pixelated' /* Custom plugin to handle pixelated images */ 26 + 27 + // https://astro.build/config 28 + export default defineConfig({ 29 + site: siteConfig.site, 30 + trailingSlash: siteConfig.trailingSlashes ? 'always' : 'never', 31 + prefetch: true, 32 + markdown: { 33 + remarkPlugins: [ 34 + [remarkDescription, { maxChars: 200 }], 35 + remarkReadingTime, 36 + remarkDirective, 37 + remarkGithubCard, 38 + remarkAdmonitions, 39 + [remarkCharacterDialogue, { characters: siteConfig.characters }], 40 + remarkUnknownDirectives, 41 + remarkMath, 42 + remarkGemoji, 43 + ], 44 + rehypePlugins: [ 45 + [rehypeHeadingIds, { headingIdCompat: true }], 46 + [rehypeAutolinkHeadings, { behavior: 'wrap' }], 47 + rehypeTitleFigure, 48 + [ 49 + rehypeExternalLinks, 50 + { 51 + rel: ['noreferrer', 'noopener'], 52 + target: '_blank', 53 + }, 54 + ], 55 + rehypeUnwrapImages, 56 + rehypePixelated, 57 + rehypeKatex, 58 + ], 59 + }, 60 + image: { 61 + responsiveStyles: true, 62 + }, 63 + vite: { 64 + plugins: [tailwindcss()], 65 + }, 66 + integrations: [ 67 + sitemap(), 68 + expressiveCode({ 69 + themes: siteConfig.themes.include, 70 + useDarkModeMediaQuery: false, 71 + defaultProps: { 72 + showLineNumbers: false, 73 + wrap: false, 74 + }, 75 + plugins: [pluginLineNumbers()], 76 + }), // Must come after expressive-code integration 77 + mdx(), 78 + ], 79 + experimental: { 80 + contentIntellisense: true, 81 + }, 82 + })
+1
dev/README.md
··· 1 + The `theme-data.json` file is auto-generated and only used during theme development as a reference. It is not imported or required to build the site. Feel free to delete the whole `dev` directory if you like.
+1118
dev/theme-data.json
··· 1 + { 2 + "allKeys": { 3 + "activityBar.activeBackground": 8, 4 + "activityBar.activeBorder": 31, 5 + "activityBar.background": 58, 6 + "activityBar.border": 32, 7 + "activityBar.dropBackground": 12, 8 + "activityBar.dropBorder": 8, 9 + "activityBar.foreground": 55, 10 + "activityBar.inactiveForeground": 28, 11 + "activityBarBadge.background": 57, 12 + "activityBarBadge.foreground": 49, 13 + "activityBarTop.foreground": 11, 14 + "badge.background": 60, 15 + "badge.foreground": 60, 16 + "banner.background": 7, 17 + "banner.foreground": 7, 18 + "banner.iconForeground": 7, 19 + "beginning.punctuation.definition.list.markdown": 10, 20 + "brackethighlighter.angle": 10, 21 + "brackethighlighter.curly": 10, 22 + "brackethighlighter.quote": 10, 23 + "brackethighlighter.round": 10, 24 + "brackethighlighter.square": 10, 25 + "brackethighlighter.tag": 10, 26 + "brackethighlighter.unmatched": 10, 27 + "breadcrumb.activeSelectionForeground": 31, 28 + "breadcrumb.background": 20, 29 + "breadcrumb.focusForeground": 33, 30 + "breadcrumb.foreground": 33, 31 + "breadcrumbPicker.background": 29, 32 + "button.background": 60, 33 + "button.border": 60, 34 + "button.foreground": 60, 35 + "button.hoverBackground": 60, 36 + "button.secondaryBackground": 60, 37 + "button.secondaryForeground": 60, 38 + "button.secondaryHoverBackground": 60, 39 + "button.separator": 60, 40 + "carriage-return": 10, 41 + "charts.blue": 12, 42 + "charts.foreground": 12, 43 + "charts.green": 12, 44 + "charts.lines": 10, 45 + "charts.orange": 12, 46 + "charts.purple": 12, 47 + "charts.red": 12, 48 + "charts.yellow": 12, 49 + "checkbox.background": 22, 50 + "checkbox.border": 27, 51 + "checkbox.foreground": 12, 52 + "comment": 60, 53 + "constant": 30, 54 + "constant.character": 24, 55 + "constant.character.escape": 31, 56 + "constant.character.format.placeholder.other.python": 11, 57 + "constant.escape": 7, 58 + "constant.keyword.clojure": 7, 59 + "constant.language": 37, 60 + "constant.language.boolean": 19, 61 + "constant.language.json": 10, 62 + "constant.language.null": 7, 63 + "constant.language.python": 7, 64 + "constant.numeric": 43, 65 + "constant.other": 7, 66 + "constant.other.character-class.regexp": 13, 67 + "constant.other.color": 10, 68 + "constant.other.key": 12, 69 + "constant.other.placeholder": 17, 70 + "constant.other.reference.link": 10, 71 + "constant.other.reference.link.markdown": 13, 72 + "constant.other.symbol": 17, 73 + "constant.sha.git-rebase": 9, 74 + "contrastActiveBorder": 60, 75 + "contrastBorder": 60, 76 + "debugConsole.errorForeground": 19, 77 + "debugConsole.infoForeground": 19, 78 + "debugConsole.sourceForeground": 14, 79 + "debugConsole.warningForeground": 19, 80 + "debugConsoleInputIcon.foreground": 15, 81 + "debugExceptionWidget.background": 19, 82 + "debugExceptionWidget.border": 19, 83 + "debugIcon.breakpointCurrentStackframeForeground": 12, 84 + "debugIcon.breakpointDisabledForeground": 14, 85 + "debugIcon.breakpointForeground": 19, 86 + "debugIcon.breakpointStackframeForeground": 12, 87 + "debugIcon.breakpointUnverifiedForeground": 12, 88 + "debugIcon.continueForeground": 12, 89 + "debugIcon.disconnectForeground": 12, 90 + "debugIcon.pauseForeground": 12, 91 + "debugIcon.restartForeground": 12, 92 + "debugIcon.startForeground": 12, 93 + "debugIcon.stepBackForeground": 12, 94 + "debugIcon.stepIntoForeground": 12, 95 + "debugIcon.stepOutForeground": 12, 96 + "debugIcon.stepOverForeground": 12, 97 + "debugIcon.stopForeground": 12, 98 + "debugTokenExpression.boolean": 13, 99 + "debugTokenExpression.error": 13, 100 + "debugTokenExpression.name": 9, 101 + "debugTokenExpression.number": 13, 102 + "debugTokenExpression.string": 13, 103 + "debugTokenExpression.value": 9, 104 + "debugToolBar.background": 51, 105 + "debugToolBar.border": 9, 106 + "descriptionForeground": 60, 107 + "diffEditor.border": 10, 108 + "diffEditor.diagonalFill": 14, 109 + "diffEditor.insertedLineBackground": 60, 110 + "diffEditor.insertedTextBackground": 60, 111 + "diffEditor.insertedTextBorder": 60, 112 + "diffEditor.removedLineBackground": 60, 113 + "diffEditor.removedTextBackground": 60, 114 + "diffEditor.removedTextBorder": 60, 115 + "diffEditorOverview.insertedForeground": 8, 116 + "diffEditorOverview.removedForeground": 8, 117 + "disabledForeground": 60, 118 + "dropdown.background": 60, 119 + "dropdown.border": 60, 120 + "dropdown.foreground": 60, 121 + "dropdown.listBackground": 21, 122 + "editor.background": 60, 123 + "editor.findMatchBackground": 60, 124 + "editor.findMatchBorder": 22, 125 + "editor.findMatchHighlightBackground": 60, 126 + "editor.findMatchHighlightBorder": 12, 127 + "editor.findRangeHighlightBackground": 60, 128 + "editor.findRangeHighlightBorder": 8, 129 + "editor.focusedStackFrameHighlightBackground": 21, 130 + "editor.foldBackground": 24, 131 + "editor.foreground": 60, 132 + "editor.hoverHighlightBackground": 60, 133 + "editor.inactiveSelectionBackground": 60, 134 + "editor.lineHighlightBackground": 49, 135 + "editor.lineHighlightBorder": 32, 136 + "editor.linkedEditingBackground": 12, 137 + "editor.rangeHighlightBackground": 25, 138 + "editor.selectionBackground": 60, 139 + "editor.selectionHighlightBackground": 60, 140 + "editor.selectionHighlightBorder": 17, 141 + "editor.snippetFinalTabstopHighlightBackground": 7, 142 + "editor.snippetFinalTabstopHighlightBorder": 60, 143 + "editor.snippetTabstopHighlightBackground": 60, 144 + "editor.stackFrameHighlightBackground": 21, 145 + "editor.wordHighlightBackground": 45, 146 + "editor.wordHighlightBorder": 16, 147 + "editor.wordHighlightStrongBackground": 43, 148 + "editor.wordHighlightStrongBorder": 16, 149 + "editorActiveLineNumber.foreground": 60, 150 + "editorBracketHighlight.foreground1": 36, 151 + "editorBracketHighlight.foreground2": 36, 152 + "editorBracketHighlight.foreground3": 36, 153 + "editorBracketHighlight.foreground4": 34, 154 + "editorBracketHighlight.foreground5": 34, 155 + "editorBracketHighlight.foreground6": 34, 156 + "editorBracketHighlight.unexpectedBracket.foreground": 26, 157 + "editorBracketMatch.background": 43, 158 + "editorBracketMatch.border": 40, 159 + "editorBracketPairGuide.activeBackground1": 7, 160 + "editorBracketPairGuide.activeBackground2": 7, 161 + "editorBracketPairGuide.activeBackground3": 7, 162 + "editorBracketPairGuide.activeBackground4": 7, 163 + "editorBracketPairGuide.activeBackground5": 7, 164 + "editorBracketPairGuide.activeBackground6": 7, 165 + "editorCodeLens.foreground": 26, 166 + "editorCursor.background": 14, 167 + "editorCursor.foreground": 46, 168 + "editorError.background": 7, 169 + "editorError.border": 9, 170 + "editorError.foreground": 60, 171 + "editorGroup.border": 60, 172 + "editorGroup.dropBackground": 60, 173 + "editorGroup.dropIntoPromptBackground": 60, 174 + "editorGroup.dropIntoPromptBorder": 60, 175 + "editorGroup.dropIntoPromptForeground": 60, 176 + "editorGroup.emptyBackground": 60, 177 + "editorGroup.focusedEmptyBorder": 60, 178 + "editorGroupHeader.border": 60, 179 + "editorGroupHeader.noTabsBackground": 60, 180 + "editorGroupHeader.tabsBackground": 60, 181 + "editorGroupHeader.tabsBorder": 60, 182 + "editorGutter.addedBackground": 48, 183 + "editorGutter.background": 19, 184 + "editorGutter.commentRangeForeground": 14, 185 + "editorGutter.deletedBackground": 48, 186 + "editorGutter.foldingControlForeground": 12, 187 + "editorGutter.modifiedBackground": 48, 188 + "editorHint.foreground": 60, 189 + "editorHoverWidget.background": 60, 190 + "editorHoverWidget.border": 60, 191 + "editorHoverWidget.foreground": 60, 192 + "editorHoverWidget.highlightForeground": 7, 193 + "editorHoverWidget.statusBarBackground": 60, 194 + "editorIndentGuide.activeBackground": 38, 195 + "editorIndentGuide.activeBackground1": 10, 196 + "editorIndentGuide.background": 39, 197 + "editorIndentGuide.background1": 10, 198 + "editorInfo.background": 7, 199 + "editorInfo.border": 8, 200 + "editorInfo.foreground": 60, 201 + "editorInlayHint.background": 60, 202 + "editorInlayHint.foreground": 60, 203 + "editorInlayHint.parameterBackground": 60, 204 + "editorInlayHint.parameterForeground": 60, 205 + "editorInlayHint.typeBackground": 60, 206 + "editorInlayHint.typeForeground": 60, 207 + "editorLightBulb.foreground": 60, 208 + "editorLightBulbAutoFix.foreground": 60, 209 + "editorLineNumber.activeForeground": 60, 210 + "editorLineNumber.foreground": 60, 211 + "editorLink.activeForeground": 60, 212 + "editorMarkerNavigation.background": 27, 213 + "editorMarkerNavigationError.background": 15, 214 + "editorMarkerNavigationInfo.background": 12, 215 + "editorMarkerNavigationWarning.background": 15, 216 + "editorOverviewRuler.addedForeground": 20, 217 + "editorOverviewRuler.background": 8, 218 + "editorOverviewRuler.border": 41, 219 + "editorOverviewRuler.commonContentForeground": 13, 220 + "editorOverviewRuler.currentContentForeground": 16, 221 + "editorOverviewRuler.deletedForeground": 20, 222 + "editorOverviewRuler.errorForeground": 25, 223 + "editorOverviewRuler.findMatchForeground": 23, 224 + "editorOverviewRuler.incomingContentForeground": 16, 225 + "editorOverviewRuler.infoForeground": 22, 226 + "editorOverviewRuler.modifiedForeground": 24, 227 + "editorOverviewRuler.rangeHighlightForeground": 14, 228 + "editorOverviewRuler.selectionHighlightForeground": 16, 229 + "editorOverviewRuler.warningForeground": 25, 230 + "editorOverviewRuler.wordHighlightForeground": 18, 231 + "editorOverviewRuler.wordHighlightStrongForeground": 18, 232 + "editorPane.background": 60, 233 + "editorRuler.foreground": 37, 234 + "editorStickyScroll.background": 60, 235 + "editorStickyScrollHover.background": 60, 236 + "editorSuggestWidget.background": 40, 237 + "editorSuggestWidget.border": 36, 238 + "editorSuggestWidget.foreground": 27, 239 + "editorSuggestWidget.highlightForeground": 28, 240 + "editorSuggestWidget.selectedBackground": 38, 241 + "editorWarning.background": 7, 242 + "editorWarning.border": 9, 243 + "editorWarning.foreground": 60, 244 + "editorWhitespace.foreground": 49, 245 + "editorWidget.background": 60, 246 + "editorWidget.border": 60, 247 + "editorWidget.foreground": 60, 248 + "editorWidget.resizeBorder": 15, 249 + "entity": 11, 250 + "entity.name": 33, 251 + "entity.name.class": 26, 252 + "entity.name.constant": 14, 253 + "entity.name.function": 54, 254 + "entity.name.function.decorator": 7, 255 + "entity.name.method.js": 7, 256 + "entity.name.module.js": 7, 257 + "entity.name.namespace": 21, 258 + "entity.name.scope-resolution": 7, 259 + "entity.name.section": 10, 260 + "entity.name.section.group-title.ini": 11, 261 + "entity.name.section.markdown": 9, 262 + "entity.name.selector": 7, 263 + "entity.name.tag": 59, 264 + "entity.name.tag.yaml": 19, 265 + "entity.name.type": 42, 266 + "entity.name.type.class": 13, 267 + "entity.name.type.module": 7, 268 + "entity.name.type.namespace.cs": 10, 269 + "entity.name.variable.field.cs": 9, 270 + "entity.name.variable.local.cs": 9, 271 + "entity.other.attribute-name": 50, 272 + "entity.other.attribute-name.class": 18, 273 + "entity.other.attribute-name.class.css": 8, 274 + "entity.other.attribute-name.id": 13, 275 + "entity.other.inherited-class": 41, 276 + "errorForeground": 60, 277 + "extensionBadge.remoteBackground": 11, 278 + "extensionBadge.remoteForeground": 16, 279 + "extensionButton.prominentBackground": 37, 280 + "extensionButton.prominentForeground": 24, 281 + "extensionButton.prominentHoverBackground": 36, 282 + "extensionIcon.preReleaseForeground": 9, 283 + "extensionIcon.starForeground": 10, 284 + "extensionIcon.verifiedForeground": 9, 285 + "fenced_code.block.language": 10, 286 + "focusBorder": 60, 287 + "foreground": 60, 288 + "gitDecoration.addedResourceForeground": 32, 289 + "gitDecoration.conflictingResourceForeground": 40, 290 + "gitDecoration.deletedResourceForeground": 44, 291 + "gitDecoration.ignoredResourceForeground": 51, 292 + "gitDecoration.modifiedResourceForeground": 45, 293 + "gitDecoration.stageDeletedResourceForeground": 13, 294 + "gitDecoration.stageModifiedResourceForeground": 13, 295 + "gitDecoration.submoduleResourceForeground": 23, 296 + "gitDecoration.untrackedResourceForeground": 45, 297 + "gitlens.closedAutolinkedIssueIconColor": 10, 298 + "gitlens.closedPullRequestIconColor": 12, 299 + "gitlens.decorations.branchAheadForegroundColor": 12, 300 + "gitlens.decorations.branchBehindForegroundColor": 12, 301 + "gitlens.decorations.branchDivergedForegroundColor": 12, 302 + "gitlens.decorations.branchMissingUpstreamForegroundColor": 12, 303 + "gitlens.decorations.statusMergingOrRebasingConflictForegroundColor": 10, 304 + "gitlens.decorations.statusMergingOrRebasingForegroundColor": 10, 305 + "gitlens.decorations.workspaceCurrentForegroundColor": 10, 306 + "gitlens.decorations.workspaceRepoMissingForegroundColor": 10, 307 + "gitlens.decorations.workspaceRepoOpenForegroundColor": 10, 308 + "gitlens.decorations.worktreeHasUncommittedChangesForegroundColor": 10, 309 + "gitlens.decorations.worktreeMissingForegroundColor": 10, 310 + "gitlens.graphChangesColumnAddedColor": 10, 311 + "gitlens.graphChangesColumnDeletedColor": 10, 312 + "gitlens.graphLane10Color": 10, 313 + "gitlens.graphLane1Color": 10, 314 + "gitlens.graphLane2Color": 10, 315 + "gitlens.graphLane3Color": 10, 316 + "gitlens.graphLane4Color": 10, 317 + "gitlens.graphLane5Color": 10, 318 + "gitlens.graphLane6Color": 10, 319 + "gitlens.graphLane7Color": 10, 320 + "gitlens.graphLane8Color": 10, 321 + "gitlens.graphLane9Color": 10, 322 + "gitlens.graphMinimapMarkerHeadColor": 10, 323 + "gitlens.graphMinimapMarkerHighlightsColor": 10, 324 + "gitlens.graphMinimapMarkerLocalBranchesColor": 10, 325 + "gitlens.graphMinimapMarkerRemoteBranchesColor": 10, 326 + "gitlens.graphMinimapMarkerStashesColor": 10, 327 + "gitlens.graphMinimapMarkerTagsColor": 10, 328 + "gitlens.graphMinimapMarkerUpstreamColor": 10, 329 + "gitlens.graphScrollMarkerHeadColor": 10, 330 + "gitlens.graphScrollMarkerHighlightsColor": 10, 331 + "gitlens.graphScrollMarkerLocalBranchesColor": 10, 332 + "gitlens.graphScrollMarkerRemoteBranchesColor": 10, 333 + "gitlens.graphScrollMarkerStashesColor": 10, 334 + "gitlens.graphScrollMarkerTagsColor": 10, 335 + "gitlens.graphScrollMarkerUpstreamColor": 10, 336 + "gitlens.gutterBackgroundColor": 13, 337 + "gitlens.gutterForegroundColor": 13, 338 + "gitlens.gutterUncommittedForegroundColor": 13, 339 + "gitlens.lineHighlightBackgroundColor": 12, 340 + "gitlens.lineHighlightOverviewRulerColor": 12, 341 + "gitlens.mergedPullRequestIconColor": 12, 342 + "gitlens.openAutolinkedIssueIconColor": 10, 343 + "gitlens.openPullRequestIconColor": 12, 344 + "gitlens.trailingLineBackgroundColor": 10, 345 + "gitlens.trailingLineForegroundColor": 13, 346 + "gitlens.unpublishedChangesIconColor": 10, 347 + "gitlens.unpublishedCommitIconColor": 12, 348 + "gitlens.unpulledChangesIconColor": 12, 349 + "header": 10, 350 + "icon.foreground": 60, 351 + "input.background": 60, 352 + "input.border": 43, 353 + "input.foreground": 60, 354 + "input.placeholderForeground": 60, 355 + "inputOption.activeBackground": 60, 356 + "inputOption.activeBorder": 60, 357 + "inputOption.activeForeground": 60, 358 + "inputOption.hoverBackground": 60, 359 + "inputValidation.errorBackground": 60, 360 + "inputValidation.errorBorder": 60, 361 + "inputValidation.errorForeground": 13, 362 + "inputValidation.infoBackground": 60, 363 + "inputValidation.infoBorder": 60, 364 + "inputValidation.infoForeground": 12, 365 + "inputValidation.warningBackground": 60, 366 + "inputValidation.warningBorder": 60, 367 + "inputValidation.warningForeground": 12, 368 + "invalid": 28, 369 + "invalid.broken": 13, 370 + "invalid.deprecated": 30, 371 + "invalid.illegal": 29, 372 + "invalid.unimplemented": 13, 373 + "keybindingLabel.background": 60, 374 + "keybindingLabel.border": 60, 375 + "keybindingLabel.bottomBorder": 60, 376 + "keybindingLabel.foreground": 60, 377 + "keyword": 56, 378 + "keyword.control": 27, 379 + "keyword.control.anchor.regexp": 7, 380 + "keyword.control.directive": 12, 381 + "keyword.control.import": 7, 382 + "keyword.control.module": 9, 383 + "keyword.control.preamble.latex": 8, 384 + "keyword.operator": 33, 385 + "keyword.operator.assignment": 8, 386 + "keyword.operator.logical": 12, 387 + "keyword.operator.logical.python": 10, 388 + "keyword.operator.new": 20, 389 + "keyword.operator.quantifier.regexp": 14, 390 + "keyword.operator.relational": 7, 391 + "keyword.other": 13, 392 + "keyword.other.definition.ini": 14, 393 + "keyword.other.import.java": 9, 394 + "keyword.other.package.java": 9, 395 + "keyword.other.special-method": 10, 396 + "keyword.other.substitution": 7, 397 + "keyword.other.template": 9, 398 + "keyword.other.unit": 28, 399 + "keyword.other.using.cs": 8, 400 + "list.activeSelectionBackground": 60, 401 + "list.activeSelectionForeground": 60, 402 + "list.dropBackground": 36, 403 + "list.errorForeground": 17, 404 + "list.focusBackground": 53, 405 + "list.focusForeground": 41, 406 + "list.focusOutline": 9, 407 + "list.highlightForeground": 52, 408 + "list.hoverBackground": 58, 409 + "list.hoverForeground": 45, 410 + "list.inactiveFocusBackground": 19, 411 + "list.inactiveSelectionBackground": 57, 412 + "list.inactiveSelectionForeground": 49, 413 + "list.invalidItemForeground": 11, 414 + "list.warningForeground": 22, 415 + "listFilterWidget.background": 18, 416 + "listFilterWidget.noMatchesOutline": 18, 417 + "listFilterWidget.outline": 18, 418 + "markup.bold": 47, 419 + "markup.bold markup.italic": 12, 420 + "markup.changed": 38, 421 + "markup.changed.diff": 8, 422 + "markup.deleted": 46, 423 + "markup.deleted.diff": 13, 424 + "markup.fenced_code.block": 11, 425 + "markup.fenced_code.block.markdown punctuation.definition.markdown": 7, 426 + "markup.heading": 46, 427 + "markup.heading entity.name": 11, 428 + "markup.heading.setext": 7, 429 + "markup.heading.setext.1.markdown": 9, 430 + "markup.heading.setext.2.markdown": 9, 431 + "markup.ignored": 10, 432 + "markup.inline.raw": 25, 433 + "markup.inline.raw.string.markdown": 18, 434 + "markup.inserted": 46, 435 + "markup.inserted.diff": 13, 436 + "markup.italic": 41, 437 + "markup.italic markup.bold": 11, 438 + "markup.quote": 31, 439 + "markup.quote punctuation.definition.blockquote.markdown": 7, 440 + "markup.quote.markdown": 7, 441 + "markup.table": 8, 442 + "markup.underline.link": 18, 443 + "markup.underline.link.image.markdown": 10, 444 + "markup.underline.link.markdown": 12, 445 + "markup.untracked": 10, 446 + "menu.background": 60, 447 + "menu.border": 20, 448 + "menu.foreground": 60, 449 + "menu.selectionBackground": 60, 450 + "menu.selectionBorder": 13, 451 + "menu.selectionForeground": 60, 452 + "menu.separatorBackground": 60, 453 + "menubar.selectionBackground": 21, 454 + "menubar.selectionBorder": 11, 455 + "menubar.selectionForeground": 19, 456 + "merge.border": 12, 457 + "merge.commonContentBackground": 9, 458 + "merge.commonHeaderBackground": 9, 459 + "merge.currentContentBackground": 22, 460 + "merge.currentHeaderBackground": 25, 461 + "merge.incomingContentBackground": 22, 462 + "merge.incomingHeaderBackground": 25, 463 + "message.error": 11, 464 + "meta.attribute.rust": 7, 465 + "meta.block": 11, 466 + "meta.brace": 16, 467 + "meta.class-method.js entity.name.function.js": 7, 468 + "meta.definition.variable": 12, 469 + "meta.diff": 9, 470 + "meta.diff.header": 24, 471 + "meta.diff.header.from-file": 22, 472 + "meta.diff.header.to-file": 19, 473 + "meta.diff.range": 15, 474 + "meta.embedded": 14, 475 + "meta.function-call": 11, 476 + "meta.function-call.arguments": 14, 477 + "meta.function-call.arguments.python": 7, 478 + "meta.function-call.generic": 7, 479 + "meta.group.braces.curly constant.other.object.key.js string.unquoted.label.js": 7, 480 + "meta.import": 7, 481 + "meta.jsx.children": 16, 482 + "meta.module-reference": 10, 483 + "meta.object-literal.key": 18, 484 + "meta.output": 10, 485 + "meta.preprocessor": 13, 486 + "meta.preprocessor.numeric": 9, 487 + "meta.preprocessor.string": 9, 488 + "meta.property-name": 13, 489 + "meta.return-type": 7, 490 + "meta.selector": 13, 491 + "meta.separator": 20, 492 + "meta.separator.markdown": 9, 493 + "meta.tag": 20, 494 + "meta.tag.sgml": 8, 495 + "meta.template.expression": 13, 496 + "meta.type.annotation": 9, 497 + "meta.use.php": 7, 498 + "minimap.background": 10, 499 + "minimap.errorHighlight": 13, 500 + "minimap.findMatchHighlight": 14, 501 + "minimap.selectionHighlight": 18, 502 + "minimap.warningHighlight": 12, 503 + "minimapGutter.addedBackground": 20, 504 + "minimapGutter.deletedBackground": 20, 505 + "minimapGutter.modifiedBackground": 20, 506 + "minimapSlider.activeBackground": 15, 507 + "minimapSlider.background": 15, 508 + "minimapSlider.hoverBackground": 15, 509 + "modifier": 7, 510 + "notebook.cellBorderColor": 14, 511 + "notebook.cellEditorBackground": 12, 512 + "notebook.focusedCellBorder": 18, 513 + "notebook.focusedEditorBorder": 9, 514 + "notebook.inactiveFocusedCellBorder": 8, 515 + "notificationCenter.border": 12, 516 + "notificationCenterHeader.background": 25, 517 + "notificationCenterHeader.foreground": 22, 518 + "notificationLink.foreground": 20, 519 + "notifications.background": 33, 520 + "notifications.border": 23, 521 + "notifications.foreground": 29, 522 + "notificationsErrorIcon.foreground": 22, 523 + "notificationsInfoIcon.foreground": 22, 524 + "notificationsWarningIcon.foreground": 22, 525 + "notificationToast.border": 12, 526 + "object": 7, 527 + "panel.background": 60, 528 + "panel.border": 60, 529 + "panelInput.border": 16, 530 + "panelSection.border": 8, 531 + "panelSection.dropBackground": 8, 532 + "panelSectionHeader.background": 60, 533 + "panelTitle.activeBorder": 60, 534 + "panelTitle.activeForeground": 60, 535 + "panelTitle.inactiveForeground": 60, 536 + "peekView.border": 43, 537 + "peekViewEditor.background": 51, 538 + "peekViewEditor.matchHighlightBackground": 46, 539 + "peekViewEditor.matchHighlightBorder": 7, 540 + "peekViewEditorGutter.background": 20, 541 + "peekViewResult.background": 47, 542 + "peekViewResult.fileForeground": 23, 543 + "peekViewResult.lineForeground": 23, 544 + "peekViewResult.matchHighlightBackground": 40, 545 + "peekViewResult.selectionBackground": 35, 546 + "peekViewResult.selectionForeground": 24, 547 + "peekViewTitle.background": 38, 548 + "peekViewTitleDescription.foreground": 29, 549 + "peekViewTitleLabel.foreground": 20, 550 + "pickerGroup.border": 60, 551 + "pickerGroup.foreground": 60, 552 + "ports.iconRunningProcessForeground": 11, 553 + "problemsErrorIcon.foreground": 60, 554 + "problemsInfoIcon.foreground": 60, 555 + "problemsWarningIcon.foreground": 60, 556 + "progressBar.background": 47, 557 + "punctuation": 33, 558 + "punctuation.accessor": 9, 559 + "punctuation.definition.bold.markdown": 7, 560 + "punctuation.definition.changed": 10, 561 + "punctuation.definition.character-class.regexp": 10, 562 + "punctuation.definition.comment": 39, 563 + "punctuation.definition.constant.markdown": 7, 564 + "punctuation.definition.deleted": 11, 565 + "punctuation.definition.from-file.diff": 11, 566 + "punctuation.definition.group.regexp": 9, 567 + "punctuation.definition.heading.markdown": 7, 568 + "punctuation.definition.inserted": 11, 569 + "punctuation.definition.keyword": 8, 570 + "punctuation.definition.list_item.markdown": 7, 571 + "punctuation.definition.list.begin.markdown": 23, 572 + "punctuation.definition.metadata.markdown": 10, 573 + "punctuation.definition.raw.markdown": 8, 574 + "punctuation.definition.string": 20, 575 + "punctuation.definition.string.begin.markdown": 13, 576 + "punctuation.definition.string.end.markdown": 13, 577 + "punctuation.definition.tag": 35, 578 + "punctuation.definition.tag.begin.html": 9, 579 + "punctuation.definition.tag.end.html": 9, 580 + "punctuation.definition.tag.html": 9, 581 + "punctuation.definition.template-expression": 11, 582 + "punctuation.definition.template-expression.begin": 14, 583 + "punctuation.definition.template-expression.end": 14, 584 + "punctuation.definition.to-file.diff": 8, 585 + "punctuation.definition.variable": 7, 586 + "punctuation.section.embedded": 26, 587 + "punctuation.section.embedded.begin": 7, 588 + "punctuation.section.embedded.end": 7, 589 + "punctuation.separator.inheritance.php": 7, 590 + "punctuation.separator.key-value": 11, 591 + "quickInput.background": 60, 592 + "quickInput.foreground": 60, 593 + "quickInputList.focusBackground": 12, 594 + "quickInputTitle.background": 60, 595 + "sash.hoverBorder": 15, 596 + "scmGraph.historyItemHoverDefaultLabelForeground": 7, 597 + "scmGraph.historyItemHoverLabelForeground": 7, 598 + "scrollbar.shadow": 60, 599 + "scrollbarSlider.activeBackground": 60, 600 + "scrollbarSlider.background": 60, 601 + "scrollbarSlider.hoverBackground": 60, 602 + "selection.background": 37, 603 + "settings.checkboxBackground": 10, 604 + "settings.checkboxForeground": 10, 605 + "settings.dropdownBackground": 14, 606 + "settings.dropdownForeground": 11, 607 + "settings.focusedRowBackground": 16, 608 + "settings.headerForeground": 35, 609 + "settings.modifiedItemIndicator": 30, 610 + "settings.numberInputBackground": 15, 611 + "settings.numberInputBorder": 10, 612 + "settings.numberInputForeground": 10, 613 + "settings.textInputBackground": 15, 614 + "settings.textInputBorder": 10, 615 + "settings.textInputForeground": 10, 616 + "sideBar.background": 57, 617 + "sideBar.border": 37, 618 + "sideBar.dropBackground": 11, 619 + "sideBar.foreground": 44, 620 + "sideBarSectionHeader.background": 57, 621 + "sideBarSectionHeader.border": 26, 622 + "sideBarSectionHeader.foreground": 36, 623 + "sideBarTitle.foreground": 45, 624 + "sideBySideEditor.horizontalBorder": 60, 625 + "sideBySideEditor.verticalBorder": 60, 626 + "source.cpp meta.block variable.other": 7, 627 + "source.css entity.name.tag": 7, 628 + "source.css support.type.property-name": 9, 629 + "source.go storage.type": 11, 630 + "source.groovy.embedded": 12, 631 + "source.js constant.other.object.key.js string.unquoted.label.js": 7, 632 + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json": 7, 633 + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json": 7, 634 + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json": 7, 635 + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json": 7, 636 + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json": 7, 637 + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json": 7, 638 + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json": 7, 639 + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json": 7, 640 + "source.json meta.structure.dictionary.json support.type.property-name.json": 7, 641 + "source.less support.type.property-name": 7, 642 + "source.postcss support.type.property-name": 7, 643 + "source.reason keyword.control.less": 7, 644 + "source.reason string.regexp": 7, 645 + "source.reason support.property-value": 7, 646 + "source.regexp": 10, 647 + "source.sass keyword.control": 7, 648 + "source.sass support.type.property-name": 7, 649 + "source.scss support.type.property-name": 7, 650 + "source.stylus support.type.property-name": 8, 651 + "statusBar.background": 58, 652 + "statusBar.border": 33, 653 + "statusBar.debuggingBackground": 56, 654 + "statusBar.debuggingBorder": 17, 655 + "statusBar.debuggingForeground": 45, 656 + "statusBar.foreground": 53, 657 + "statusBar.noFolderBackground": 56, 658 + "statusBar.noFolderBorder": 13, 659 + "statusBar.noFolderForeground": 14, 660 + "statusBarItem.activeBackground": 27, 661 + "statusBarItem.errorBackground": 13, 662 + "statusBarItem.errorForeground": 12, 663 + "statusBarItem.hoverBackground": 31, 664 + "statusBarItem.prominentBackground": 32, 665 + "statusBarItem.prominentForeground": 10, 666 + "statusBarItem.prominentHoverBackground": 20, 667 + "statusBarItem.remoteBackground": 41, 668 + "statusBarItem.remoteForeground": 36, 669 + "statusBarItem.warningBackground": 8, 670 + "statusBarItem.warningForeground": 8, 671 + "storage": 37, 672 + "storage.modifier": 33, 673 + "storage.modifier.import": 13, 674 + "storage.modifier.import.java": 17, 675 + "storage.modifier.lifetime.rust": 7, 676 + "storage.modifier.package": 11, 677 + "storage.modifier.package.java": 11, 678 + "storage.type": 47, 679 + "storage.type.annotation": 16, 680 + "storage.type.annotation.java": 7, 681 + "storage.type.cs": 18, 682 + "storage.type.function.arrow.ts": 7, 683 + "storage.type.function.python": 11, 684 + "storage.type.generic.java": 7, 685 + "storage.type.haskell": 7, 686 + "storage.type.java": 21, 687 + "storage.type.php": 8, 688 + "storage.type.string.python": 10, 689 + "string": 59, 690 + "string punctuation.section.embedded source": 10, 691 + "string variable": 15, 692 + "string.comment": 12, 693 + "string.other.link": 19, 694 + "string.other.link.description.markdown": 8, 695 + "string.other.link.description.title.markdown": 8, 696 + "string.other.link.title.markdown": 28, 697 + "string.quoted.double.json": 8, 698 + "string.regexp": 42, 699 + "string.regexp constant.character.escape": 11, 700 + "string.regexp source.ruby.embedded": 11, 701 + "string.regexp string.regexp.arbitrary-repitition": 10, 702 + "string.regexp.character-class": 10, 703 + "string.tag": 8, 704 + "string.unquoted.alias.graphql": 7, 705 + "string.value": 8, 706 + "support": 19, 707 + "support.class": 34, 708 + "support.class.component": 16, 709 + "support.class.component.tsx": 7, 710 + "support.class.latex": 8, 711 + "support.class.math.block.environment.latex": 7, 712 + "support.constant": 45, 713 + "support.constant.font-name": 7, 714 + "support.constant.json": 7, 715 + "support.constant.math": 7, 716 + "support.constant.property-value": 7, 717 + "support.function": 41, 718 + "support.function.be.latex": 8, 719 + "support.function.builtin": 10, 720 + "support.function.git-rebase": 9, 721 + "support.function.section.latex": 8, 722 + "support.module": 7, 723 + "support.node": 7, 724 + "support.other.namespace.php": 11, 725 + "support.other.variable": 8, 726 + "support.type": 37, 727 + "support.type.primitive": 9, 728 + "support.type.property-name": 17, 729 + "support.type.property-name.css": 21, 730 + "support.type.property-name.json": 25, 731 + "support.type.sys-types": 7, 732 + "support.type.vendored.property-name": 8, 733 + "support.variable": 31, 734 + "support.variable.magic.python": 7, 735 + "support.variable.property": 9, 736 + "symbolIcon.arrayForeground": 15, 737 + "symbolIcon.booleanForeground": 12, 738 + "symbolIcon.classForeground": 17, 739 + "symbolIcon.colorForeground": 15, 740 + "symbolIcon.constantForeground": 12, 741 + "symbolIcon.constructorForeground": 17, 742 + "symbolIcon.enumeratorForeground": 17, 743 + "symbolIcon.enumeratorMemberForeground": 17, 744 + "symbolIcon.eventForeground": 17, 745 + "symbolIcon.fieldForeground": 17, 746 + "symbolIcon.fileForeground": 15, 747 + "symbolIcon.folderForeground": 15, 748 + "symbolIcon.functionForeground": 17, 749 + "symbolIcon.interfaceForeground": 17, 750 + "symbolIcon.keyForeground": 15, 751 + "symbolIcon.keywordForeground": 15, 752 + "symbolIcon.methodForeground": 17, 753 + "symbolIcon.moduleForeground": 15, 754 + "symbolIcon.namespaceForeground": 15, 755 + "symbolIcon.nullForeground": 15, 756 + "symbolIcon.numberForeground": 15, 757 + "symbolIcon.objectForeground": 15, 758 + "symbolIcon.operatorForeground": 15, 759 + "symbolIcon.packageForeground": 15, 760 + "symbolIcon.propertyForeground": 15, 761 + "symbolIcon.referenceForeground": 15, 762 + "symbolIcon.snippetForeground": 15, 763 + "symbolIcon.stringForeground": 15, 764 + "symbolIcon.structForeground": 15, 765 + "symbolIcon.textForeground": 15, 766 + "symbolIcon.typeParameterForeground": 15, 767 + "symbolIcon.unitForeground": 15, 768 + "symbolIcon.variableForeground": 17, 769 + "tab.activeBackground": 60, 770 + "tab.activeBorder": 60, 771 + "tab.activeBorderTop": 60, 772 + "tab.activeForeground": 60, 773 + "tab.activeModifiedBorder": 60, 774 + "tab.border": 60, 775 + "tab.hoverBackground": 60, 776 + "tab.hoverBorder": 60, 777 + "tab.hoverForeground": 60, 778 + "tab.inactiveBackground": 60, 779 + "tab.inactiveForeground": 60, 780 + "tab.inactiveModifiedBorder": 60, 781 + "tab.lastPinnedBorder": 60, 782 + "tab.unfocusedActiveBackground": 60, 783 + "tab.unfocusedActiveBorder": 60, 784 + "tab.unfocusedActiveBorderTop": 60, 785 + "tab.unfocusedActiveForeground": 60, 786 + "tab.unfocusedActiveModifiedBorder": 60, 787 + "tab.unfocusedHoverBackground": 60, 788 + "tab.unfocusedHoverBorder": 60, 789 + "tab.unfocusedHoverForeground": 60, 790 + "tab.unfocusedInactiveBackground": 60, 791 + "tab.unfocusedInactiveForeground": 60, 792 + "tab.unfocusedInactiveModifiedBorder": 60, 793 + "tag.decorator.js entity.name.tag.js": 7, 794 + "tag.decorator.js punctuation.definition.tag.js": 7, 795 + "terminal.ansiBlack": 60, 796 + "terminal.ansiBlue": 60, 797 + "terminal.ansiBrightBlack": 60, 798 + "terminal.ansiBrightBlue": 60, 799 + "terminal.ansiBrightCyan": 60, 800 + "terminal.ansiBrightGreen": 60, 801 + "terminal.ansiBrightMagenta": 60, 802 + "terminal.ansiBrightRed": 60, 803 + "terminal.ansiBrightWhite": 60, 804 + "terminal.ansiBrightYellow": 60, 805 + "terminal.ansiCyan": 60, 806 + "terminal.ansiGreen": 60, 807 + "terminal.ansiMagenta": 60, 808 + "terminal.ansiRed": 60, 809 + "terminal.ansiWhite": 60, 810 + "terminal.ansiYellow": 60, 811 + "terminal.background": 60, 812 + "terminal.border": 11, 813 + "terminal.dropBackground": 7, 814 + "terminal.foreground": 40, 815 + "terminal.selectionBackground": 20, 816 + "terminal.tab.activeBorder": 10, 817 + "terminalCursor.background": 18, 818 + "terminalCursor.foreground": 19, 819 + "testing.iconErrored": 7, 820 + "testing.iconFailed": 7, 821 + "testing.iconPassed": 7, 822 + "testing.iconQueued": 7, 823 + "testing.iconSkipped": 7, 824 + "testing.iconUnset": 7, 825 + "testing.runAction": 7, 826 + "text.html.markdown markup.inline.raw.markdown": 7, 827 + "text.html.markdown markup.inline.raw.markdown punctuation.definition.raw.markdown": 7, 828 + "textBlockQuote.background": 60, 829 + "textBlockQuote.border": 60, 830 + "textCodeBlock.background": 60, 831 + "textLink.activeForeground": 60, 832 + "textLink.foreground": 60, 833 + "textPreformat.foreground": 60, 834 + "textSeparator.foreground": 60, 835 + "titleBar.activeBackground": 60, 836 + "titleBar.activeForeground": 60, 837 + "titleBar.border": 60, 838 + "titleBar.inactiveBackground": 60, 839 + "titleBar.inactiveForeground": 60, 840 + "token.debug-token": 9, 841 + "token.error-token": 9, 842 + "token.info-token": 9, 843 + "token.warn-token": 9, 844 + "toolbar.activeBackground": 60, 845 + "toolbar.hoverBackground": 60, 846 + "tree.indentGuidesStroke": 60, 847 + "variable": 49, 848 + "variable.function": 19, 849 + "variable.function.constructor": 7, 850 + "variable.import.parameter.js": 7, 851 + "variable.language": 41, 852 + "variable.language.fenced.markdown": 7, 853 + "variable.language.super": 8, 854 + "variable.language.this": 20, 855 + "variable.object.property": 11, 856 + "variable.other": 21, 857 + "variable.other.alias.yaml": 7, 858 + "variable.other.class.js": 10, 859 + "variable.other.constant": 21, 860 + "variable.other.constant.js": 8, 861 + "variable.other.constant.ts": 7, 862 + "variable.other.enummember": 20, 863 + "variable.other.property": 9, 864 + "variable.other.readwrite.cs": 8, 865 + "variable.parameter": 29, 866 + "variable.parameter.function": 15, 867 + "variable.parameter.function.language.special.self.python": 11, 868 + "walkThrough.embeddedEditorBackground": 23, 869 + "welcomePage.buttonBackground": 16, 870 + "welcomePage.buttonHoverBackground": 16, 871 + "welcomePage.progress.foreground": 7, 872 + "widget.border": 8, 873 + "widget.shadow": 60, 874 + "window.activeBorder": 8, 875 + "window.inactiveBorder": 8 876 + }, 877 + "commonKeys": [ 878 + "badge.background", 879 + "badge.foreground", 880 + "button.background", 881 + "button.border", 882 + "button.foreground", 883 + "button.hoverBackground", 884 + "button.secondaryBackground", 885 + "button.secondaryForeground", 886 + "button.secondaryHoverBackground", 887 + "button.separator", 888 + "comment", 889 + "contrastActiveBorder", 890 + "contrastBorder", 891 + "descriptionForeground", 892 + "diffEditor.insertedLineBackground", 893 + "diffEditor.insertedTextBackground", 894 + "diffEditor.insertedTextBorder", 895 + "diffEditor.removedLineBackground", 896 + "diffEditor.removedTextBackground", 897 + "diffEditor.removedTextBorder", 898 + "disabledForeground", 899 + "dropdown.background", 900 + "dropdown.border", 901 + "dropdown.foreground", 902 + "editor.background", 903 + "editor.findMatchBackground", 904 + "editor.findMatchHighlightBackground", 905 + "editor.findRangeHighlightBackground", 906 + "editor.foreground", 907 + "editor.hoverHighlightBackground", 908 + "editor.inactiveSelectionBackground", 909 + "editor.selectionBackground", 910 + "editor.selectionHighlightBackground", 911 + "editor.snippetFinalTabstopHighlightBorder", 912 + "editor.snippetTabstopHighlightBackground", 913 + "editorActiveLineNumber.foreground", 914 + "editorError.foreground", 915 + "editorGroup.border", 916 + "editorGroup.dropBackground", 917 + "editorGroup.dropIntoPromptBackground", 918 + "editorGroup.dropIntoPromptBorder", 919 + "editorGroup.dropIntoPromptForeground", 920 + "editorGroup.emptyBackground", 921 + "editorGroup.focusedEmptyBorder", 922 + "editorGroupHeader.border", 923 + "editorGroupHeader.noTabsBackground", 924 + "editorGroupHeader.tabsBackground", 925 + "editorGroupHeader.tabsBorder", 926 + "editorHint.foreground", 927 + "editorHoverWidget.background", 928 + "editorHoverWidget.border", 929 + "editorHoverWidget.foreground", 930 + "editorHoverWidget.statusBarBackground", 931 + "editorInfo.foreground", 932 + "editorInlayHint.background", 933 + "editorInlayHint.foreground", 934 + "editorInlayHint.parameterBackground", 935 + "editorInlayHint.parameterForeground", 936 + "editorInlayHint.typeBackground", 937 + "editorInlayHint.typeForeground", 938 + "editorLightBulb.foreground", 939 + "editorLightBulbAutoFix.foreground", 940 + "editorLineNumber.activeForeground", 941 + "editorLineNumber.foreground", 942 + "editorLink.activeForeground", 943 + "editorPane.background", 944 + "editorStickyScroll.background", 945 + "editorStickyScrollHover.background", 946 + "editorWarning.foreground", 947 + "editorWidget.background", 948 + "editorWidget.border", 949 + "editorWidget.foreground", 950 + "errorForeground", 951 + "focusBorder", 952 + "foreground", 953 + "icon.foreground", 954 + "input.background", 955 + "input.foreground", 956 + "input.placeholderForeground", 957 + "inputOption.activeBackground", 958 + "inputOption.activeBorder", 959 + "inputOption.activeForeground", 960 + "inputOption.hoverBackground", 961 + "inputValidation.errorBackground", 962 + "inputValidation.errorBorder", 963 + "inputValidation.infoBackground", 964 + "inputValidation.infoBorder", 965 + "inputValidation.warningBackground", 966 + "inputValidation.warningBorder", 967 + "keybindingLabel.background", 968 + "keybindingLabel.border", 969 + "keybindingLabel.bottomBorder", 970 + "keybindingLabel.foreground", 971 + "list.activeSelectionBackground", 972 + "list.activeSelectionForeground", 973 + "menu.background", 974 + "menu.foreground", 975 + "menu.selectionBackground", 976 + "menu.selectionForeground", 977 + "menu.separatorBackground", 978 + "panel.background", 979 + "panel.border", 980 + "panelSectionHeader.background", 981 + "panelTitle.activeBorder", 982 + "panelTitle.activeForeground", 983 + "panelTitle.inactiveForeground", 984 + "pickerGroup.border", 985 + "pickerGroup.foreground", 986 + "problemsErrorIcon.foreground", 987 + "problemsInfoIcon.foreground", 988 + "problemsWarningIcon.foreground", 989 + "quickInput.background", 990 + "quickInput.foreground", 991 + "quickInputTitle.background", 992 + "scrollbar.shadow", 993 + "scrollbarSlider.activeBackground", 994 + "scrollbarSlider.background", 995 + "scrollbarSlider.hoverBackground", 996 + "sideBySideEditor.horizontalBorder", 997 + "sideBySideEditor.verticalBorder", 998 + "tab.activeBackground", 999 + "tab.activeBorder", 1000 + "tab.activeBorderTop", 1001 + "tab.activeForeground", 1002 + "tab.activeModifiedBorder", 1003 + "tab.border", 1004 + "tab.hoverBackground", 1005 + "tab.hoverBorder", 1006 + "tab.hoverForeground", 1007 + "tab.inactiveBackground", 1008 + "tab.inactiveForeground", 1009 + "tab.inactiveModifiedBorder", 1010 + "tab.lastPinnedBorder", 1011 + "tab.unfocusedActiveBackground", 1012 + "tab.unfocusedActiveBorder", 1013 + "tab.unfocusedActiveBorderTop", 1014 + "tab.unfocusedActiveForeground", 1015 + "tab.unfocusedActiveModifiedBorder", 1016 + "tab.unfocusedHoverBackground", 1017 + "tab.unfocusedHoverBorder", 1018 + "tab.unfocusedHoverForeground", 1019 + "tab.unfocusedInactiveBackground", 1020 + "tab.unfocusedInactiveForeground", 1021 + "tab.unfocusedInactiveModifiedBorder", 1022 + "terminal.ansiBlack", 1023 + "terminal.ansiBlue", 1024 + "terminal.ansiBrightBlack", 1025 + "terminal.ansiBrightBlue", 1026 + "terminal.ansiBrightCyan", 1027 + "terminal.ansiBrightGreen", 1028 + "terminal.ansiBrightMagenta", 1029 + "terminal.ansiBrightRed", 1030 + "terminal.ansiBrightWhite", 1031 + "terminal.ansiBrightYellow", 1032 + "terminal.ansiCyan", 1033 + "terminal.ansiGreen", 1034 + "terminal.ansiMagenta", 1035 + "terminal.ansiRed", 1036 + "terminal.ansiWhite", 1037 + "terminal.ansiYellow", 1038 + "terminal.background", 1039 + "textBlockQuote.background", 1040 + "textBlockQuote.border", 1041 + "textCodeBlock.background", 1042 + "textLink.activeForeground", 1043 + "textLink.foreground", 1044 + "textPreformat.foreground", 1045 + "textSeparator.foreground", 1046 + "titleBar.activeBackground", 1047 + "titleBar.activeForeground", 1048 + "titleBar.border", 1049 + "titleBar.inactiveBackground", 1050 + "titleBar.inactiveForeground", 1051 + "toolbar.activeBackground", 1052 + "toolbar.hoverBackground", 1053 + "tree.indentGuidesStroke", 1054 + "widget.shadow" 1055 + ], 1056 + "bundledThemes": [ 1057 + "andromeeda", 1058 + "aurora-x", 1059 + "ayu-dark", 1060 + "catppuccin-frappe", 1061 + "catppuccin-latte", 1062 + "catppuccin-macchiato", 1063 + "catppuccin-mocha", 1064 + "dark-plus", 1065 + "dracula", 1066 + "dracula-soft", 1067 + "everforest-dark", 1068 + "everforest-light", 1069 + "github-dark", 1070 + "github-dark-default", 1071 + "github-dark-dimmed", 1072 + "github-dark-high-contrast", 1073 + "github-light", 1074 + "github-light-default", 1075 + "github-light-high-contrast", 1076 + "gruvbox-dark-hard", 1077 + "gruvbox-dark-medium", 1078 + "gruvbox-dark-soft", 1079 + "gruvbox-light-hard", 1080 + "gruvbox-light-medium", 1081 + "gruvbox-light-soft", 1082 + "houston", 1083 + "kanagawa-dragon", 1084 + "kanagawa-lotus", 1085 + "kanagawa-wave", 1086 + "laserwave", 1087 + "light-plus", 1088 + "material-theme", 1089 + "material-theme-darker", 1090 + "material-theme-lighter", 1091 + "material-theme-ocean", 1092 + "material-theme-palenight", 1093 + "min-dark", 1094 + "min-light", 1095 + "monokai", 1096 + "night-owl", 1097 + "nord", 1098 + "one-dark-pro", 1099 + "one-light", 1100 + "plastic", 1101 + "poimandres", 1102 + "red", 1103 + "rose-pine", 1104 + "rose-pine-dawn", 1105 + "rose-pine-moon", 1106 + "slack-dark", 1107 + "slack-ochin", 1108 + "snazzy-light", 1109 + "solarized-dark", 1110 + "solarized-light", 1111 + "synthwave-84", 1112 + "tokyo-night", 1113 + "vesper", 1114 + "vitesse-black", 1115 + "vitesse-dark", 1116 + "vitesse-light" 1117 + ] 1118 + }
+44
dev/themeData.ts
··· 1 + import { loadShikiTheme, type BundledShikiTheme } from 'astro-expressive-code' 2 + import { bundledThemes } from 'shiki' 3 + import { flattenThemeColors } from '~/utils' 4 + 5 + // Use this function to export theme data for analysis 6 + const exportThemeData = async () => { 7 + const keyArrays = await Promise.all( 8 + Object.keys(bundledThemes).map(async (theme) => { 9 + const exTheme = await loadShikiTheme(theme as BundledShikiTheme) 10 + const flatTheme = flattenThemeColors(exTheme) 11 + return Object.keys(flatTheme) 12 + }), 13 + ) 14 + // Find intersection of all key arrays 15 + const commonKeys = keyArrays.reduce((acc, keys) => 16 + acc.filter((key) => keys.includes(key)), 17 + ) 18 + const allKeys = keyArrays.flat() 19 + const keyCount = allKeys.reduce((acc: Record<string, number>, key) => { 20 + acc[key] = (acc[key] || 0) + 1 21 + return acc 22 + }, {}) 23 + // Filter keys that appear in less than 10% of themes 24 + // and sort them alphabetically 25 + const sortedEntries = Object.entries(keyCount) 26 + .filter(([_, count]) => count > Math.ceil(Object.keys(bundledThemes).length / 10)) 27 + .sort((a, b) => a[0].localeCompare(b[0])) 28 + const jsonData = JSON.stringify( 29 + { 30 + allKeys: Object.fromEntries(sortedEntries), 31 + commonKeys: commonKeys.sort(), 32 + bundledThemes: Object.keys(bundledThemes).sort(), 33 + }, 34 + null, 35 + 2, 36 + ) 37 + const outputPath = './data/theme-data.json' 38 + // Write to file 39 + const fs = await import('fs/promises') 40 + await fs.writeFile(outputPath, jsonData, 'utf-8') 41 + console.log(`Theme data written to ${outputPath}`) 42 + } 43 + 44 + await exportThemeData()
+3
giscus.json
··· 1 + { 2 + "origins": ["https://multiterm.stelclementine.com"] 3 + }
+8962
package-lock.json
··· 1 + { 2 + "name": "multiterm-astro", 3 + "version": "1.0.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "multiterm-astro", 9 + "version": "1.0.0", 10 + "dependencies": { 11 + "@astrojs/markdown-remark": "^6.3.6", 12 + "@astrojs/mdx": "^4.3.9", 13 + "@astrojs/rss": "^4.0.12", 14 + "@astrojs/sitemap": "^3.5.1", 15 + "@astrojs/ts-plugin": "^1.10.4", 16 + "@expo-google-fonts/jetbrains-mono": "^0.4.0", 17 + "@expressive-code/plugin-line-numbers": "^0.41.3", 18 + "@fontsource-variable/jetbrains-mono": "^5.2.6", 19 + "@pagefind/default-ui": "^1.4.0", 20 + "@resvg/resvg-js": "^2.6.2", 21 + "@tailwindcss/vite": "^4.1.13", 22 + "@types/hast": "^3.0.4", 23 + "@types/react": "^19.1.12", 24 + "@types/react-dom": "^19.1.9", 25 + "astro": "^5.13.5", 26 + "astro-expressive-code": "^0.41.3", 27 + "color": "^5.0.0", 28 + "date-fns": "^4.1.0", 29 + "emoji-regex": "^10.5.0", 30 + "gemoji": "^8.1.0", 31 + "hast-util-from-html-isomorphic": "^2.0.0", 32 + "hastscript": "^9.0.1", 33 + "katex": "^0.16.22", 34 + "markdown-it": "^14.1.0", 35 + "mdast-util-directive": "^3.1.0", 36 + "mdast-util-to-string": "^4.0.0", 37 + "reading-time": "^1.5.0", 38 + "rehype-autolink-headings": "^7.1.0", 39 + "rehype-external-links": "^3.0.0", 40 + "rehype-katex": "^7.0.1", 41 + "rehype-unwrap-images": "^1.0.0", 42 + "remark-directive": "^4.0.0", 43 + "remark-math": "^6.0.0", 44 + "sanitize-html": "^2.17.0", 45 + "satori": "^0.18.2", 46 + "satori-html": "^0.3.2", 47 + "tailwindcss": "^4.1.13", 48 + "typescript": "^5.9.2", 49 + "unified": "^11.0.5" 50 + }, 51 + "devDependencies": { 52 + "@types/markdown-it": "^14.1.2", 53 + "@types/sanitize-html": "^2.16.0", 54 + "pagefind": "^1.4.0", 55 + "prettier": "3.6.2", 56 + "prettier-plugin-astro": "0.14.1", 57 + "sass-embedded": "^1.92.1" 58 + } 59 + }, 60 + "node_modules/@astrojs/compiler": { 61 + "version": "2.12.2", 62 + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.12.2.tgz", 63 + "integrity": "sha512-w2zfvhjNCkNMmMMOn5b0J8+OmUaBL1o40ipMvqcG6NRpdC+lKxmTi48DT8Xw0SzJ3AfmeFLB45zXZXtmbsjcgw==", 64 + "license": "MIT" 65 + }, 66 + "node_modules/@astrojs/internal-helpers": { 67 + "version": "0.7.2", 68 + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.2.tgz", 69 + "integrity": "sha512-KCkCqR3Goym79soqEtbtLzJfqhTWMyVaizUi35FLzgGSzBotSw8DB1qwsu7U96ihOJgYhDk2nVPz+3LnXPeX6g==", 70 + "license": "MIT" 71 + }, 72 + "node_modules/@astrojs/markdown-remark": { 73 + "version": "6.3.6", 74 + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.6.tgz", 75 + "integrity": "sha512-bwylYktCTsLMVoCOEHbn2GSUA3c5KT/qilekBKA3CBng0bo1TYjNZPr761vxumRk9kJGqTOtU+fgCAp5Vwokug==", 76 + "license": "MIT", 77 + "dependencies": { 78 + "@astrojs/internal-helpers": "0.7.2", 79 + "@astrojs/prism": "3.3.0", 80 + "github-slugger": "^2.0.0", 81 + "hast-util-from-html": "^2.0.3", 82 + "hast-util-to-text": "^4.0.2", 83 + "import-meta-resolve": "^4.1.0", 84 + "js-yaml": "^4.1.0", 85 + "mdast-util-definitions": "^6.0.0", 86 + "rehype-raw": "^7.0.0", 87 + "rehype-stringify": "^10.0.1", 88 + "remark-gfm": "^4.0.1", 89 + "remark-parse": "^11.0.0", 90 + "remark-rehype": "^11.1.2", 91 + "remark-smartypants": "^3.0.2", 92 + "shiki": "^3.2.1", 93 + "smol-toml": "^1.3.4", 94 + "unified": "^11.0.5", 95 + "unist-util-remove-position": "^5.0.0", 96 + "unist-util-visit": "^5.0.0", 97 + "unist-util-visit-parents": "^6.0.1", 98 + "vfile": "^6.0.3" 99 + } 100 + }, 101 + "node_modules/@astrojs/mdx": { 102 + "version": "4.3.9", 103 + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.9.tgz", 104 + "integrity": "sha512-80LHiM4z3FxAjATHNgFpa8nlTNSprAWB4UUKnr/QG56Pwk7uRnJWrXlok4wSCi/3fg8kTZ98A408Q91M+iqJdw==", 105 + "license": "MIT", 106 + "dependencies": { 107 + "@astrojs/markdown-remark": "6.3.8", 108 + "@mdx-js/mdx": "^3.1.1", 109 + "acorn": "^8.15.0", 110 + "es-module-lexer": "^1.7.0", 111 + "estree-util-visit": "^2.0.0", 112 + "hast-util-to-html": "^9.0.5", 113 + "picocolors": "^1.1.1", 114 + "rehype-raw": "^7.0.0", 115 + "remark-gfm": "^4.0.1", 116 + "remark-smartypants": "^3.0.2", 117 + "source-map": "^0.7.6", 118 + "unist-util-visit": "^5.0.0", 119 + "vfile": "^6.0.3" 120 + }, 121 + "engines": { 122 + "node": "18.20.8 || ^20.3.0 || >=22.0.0" 123 + }, 124 + "peerDependencies": { 125 + "astro": "^5.0.0" 126 + } 127 + }, 128 + "node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers": { 129 + "version": "0.7.4", 130 + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.4.tgz", 131 + "integrity": "sha512-lDA9MqE8WGi7T/t2BMi+EAXhs4Vcvr94Gqx3q15cFEz8oFZMO4/SFBqYr/UcmNlvW+35alowkVj+w9VhLvs5Cw==", 132 + "license": "MIT" 133 + }, 134 + "node_modules/@astrojs/mdx/node_modules/@astrojs/markdown-remark": { 135 + "version": "6.3.8", 136 + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.8.tgz", 137 + "integrity": "sha512-uFNyFWadnULWK2cOw4n0hLKeu+xaVWeuECdP10cQ3K2fkybtTlhb7J7TcScdjmS8Yps7oje9S/ehYMfZrhrgCg==", 138 + "license": "MIT", 139 + "dependencies": { 140 + "@astrojs/internal-helpers": "0.7.4", 141 + "@astrojs/prism": "3.3.0", 142 + "github-slugger": "^2.0.0", 143 + "hast-util-from-html": "^2.0.3", 144 + "hast-util-to-text": "^4.0.2", 145 + "import-meta-resolve": "^4.2.0", 146 + "js-yaml": "^4.1.0", 147 + "mdast-util-definitions": "^6.0.0", 148 + "rehype-raw": "^7.0.0", 149 + "rehype-stringify": "^10.0.1", 150 + "remark-gfm": "^4.0.1", 151 + "remark-parse": "^11.0.0", 152 + "remark-rehype": "^11.1.2", 153 + "remark-smartypants": "^3.0.2", 154 + "shiki": "^3.13.0", 155 + "smol-toml": "^1.4.2", 156 + "unified": "^11.0.5", 157 + "unist-util-remove-position": "^5.0.0", 158 + "unist-util-visit": "^5.0.0", 159 + "unist-util-visit-parents": "^6.0.1", 160 + "vfile": "^6.0.3" 161 + } 162 + }, 163 + "node_modules/@astrojs/prism": { 164 + "version": "3.3.0", 165 + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", 166 + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", 167 + "license": "MIT", 168 + "dependencies": { 169 + "prismjs": "^1.30.0" 170 + }, 171 + "engines": { 172 + "node": "18.20.8 || ^20.3.0 || >=22.0.0" 173 + } 174 + }, 175 + "node_modules/@astrojs/rss": { 176 + "version": "4.0.12", 177 + "resolved": "https://registry.npmjs.org/@astrojs/rss/-/rss-4.0.12.tgz", 178 + "integrity": "sha512-O5yyxHuDVb6DQ6VLOrbUVFSm+NpObulPxjs6XT9q3tC+RoKbN4HXMZLpv0LvXd1qdAjzVgJ1NFD+zKHJNDXikw==", 179 + "license": "MIT", 180 + "dependencies": { 181 + "fast-xml-parser": "^5.2.0", 182 + "kleur": "^4.1.5" 183 + } 184 + }, 185 + "node_modules/@astrojs/sitemap": { 186 + "version": "3.5.1", 187 + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.5.1.tgz", 188 + "integrity": "sha512-uX5z52GLtQTgOe8r3jeGmFRYrFe52mdpLYJzqjvL1cdy5Kg3MLOZEvaZ/OCH0fSq0t7e50uJQ6oBMZG0ffszBg==", 189 + "license": "MIT", 190 + "dependencies": { 191 + "sitemap": "^8.0.0", 192 + "stream-replace-string": "^2.0.0", 193 + "zod": "^3.24.4" 194 + } 195 + }, 196 + "node_modules/@astrojs/telemetry": { 197 + "version": "3.3.0", 198 + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", 199 + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", 200 + "license": "MIT", 201 + "dependencies": { 202 + "ci-info": "^4.2.0", 203 + "debug": "^4.4.0", 204 + "dlv": "^1.1.3", 205 + "dset": "^3.1.4", 206 + "is-docker": "^3.0.0", 207 + "is-wsl": "^3.1.0", 208 + "which-pm-runs": "^1.1.0" 209 + }, 210 + "engines": { 211 + "node": "18.20.8 || ^20.3.0 || >=22.0.0" 212 + } 213 + }, 214 + "node_modules/@astrojs/ts-plugin": { 215 + "version": "1.10.4", 216 + "resolved": "https://registry.npmjs.org/@astrojs/ts-plugin/-/ts-plugin-1.10.4.tgz", 217 + "integrity": "sha512-rapryQINgv5VLZF884R/wmgX3mM9eH1PC/I3kkPV9rP6lEWrRN1YClF3bGcDHFrf8EtTLc0Wqxne1Uetpevozg==", 218 + "license": "MIT", 219 + "dependencies": { 220 + "@astrojs/compiler": "^2.10.3", 221 + "@astrojs/yaml2ts": "^0.2.2", 222 + "@jridgewell/sourcemap-codec": "^1.4.15", 223 + "@volar/language-core": "~2.4.7", 224 + "@volar/typescript": "~2.4.7", 225 + "semver": "^7.3.8", 226 + "vscode-languageserver-textdocument": "^1.0.11" 227 + } 228 + }, 229 + "node_modules/@astrojs/yaml2ts": { 230 + "version": "0.2.2", 231 + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.2.tgz", 232 + "integrity": "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==", 233 + "license": "MIT", 234 + "dependencies": { 235 + "yaml": "^2.5.0" 236 + } 237 + }, 238 + "node_modules/@babel/helper-string-parser": { 239 + "version": "7.27.1", 240 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 241 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 242 + "license": "MIT", 243 + "engines": { 244 + "node": ">=6.9.0" 245 + } 246 + }, 247 + "node_modules/@babel/helper-validator-identifier": { 248 + "version": "7.27.1", 249 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", 250 + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", 251 + "license": "MIT", 252 + "engines": { 253 + "node": ">=6.9.0" 254 + } 255 + }, 256 + "node_modules/@babel/parser": { 257 + "version": "7.28.0", 258 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", 259 + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", 260 + "license": "MIT", 261 + "dependencies": { 262 + "@babel/types": "^7.28.0" 263 + }, 264 + "bin": { 265 + "parser": "bin/babel-parser.js" 266 + }, 267 + "engines": { 268 + "node": ">=6.0.0" 269 + } 270 + }, 271 + "node_modules/@babel/types": { 272 + "version": "7.28.1", 273 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", 274 + "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", 275 + "license": "MIT", 276 + "dependencies": { 277 + "@babel/helper-string-parser": "^7.27.1", 278 + "@babel/helper-validator-identifier": "^7.27.1" 279 + }, 280 + "engines": { 281 + "node": ">=6.9.0" 282 + } 283 + }, 284 + "node_modules/@bufbuild/protobuf": { 285 + "version": "2.6.0", 286 + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.6.0.tgz", 287 + "integrity": "sha512-6cuonJVNOIL7lTj5zgo/Rc2bKAo4/GvN+rKCrUj7GdEHRzCk8zKOfFwUsL9nAVk5rSIsRmlgcpLzTRysopEeeg==", 288 + "devOptional": true, 289 + "license": "(Apache-2.0 AND BSD-3-Clause)" 290 + }, 291 + "node_modules/@capsizecss/unpack": { 292 + "version": "2.4.0", 293 + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-2.4.0.tgz", 294 + "integrity": "sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==", 295 + "license": "MIT", 296 + "dependencies": { 297 + "blob-to-buffer": "^1.2.8", 298 + "cross-fetch": "^3.0.4", 299 + "fontkit": "^2.0.2" 300 + } 301 + }, 302 + "node_modules/@ctrl/tinycolor": { 303 + "version": "4.1.0", 304 + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", 305 + "integrity": "sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==", 306 + "license": "MIT", 307 + "engines": { 308 + "node": ">=14" 309 + } 310 + }, 311 + "node_modules/@emnapi/runtime": { 312 + "version": "1.4.4", 313 + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.4.tgz", 314 + "integrity": "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==", 315 + "license": "MIT", 316 + "optional": true, 317 + "dependencies": { 318 + "tslib": "^2.4.0" 319 + } 320 + }, 321 + "node_modules/@esbuild/aix-ppc64": { 322 + "version": "0.25.6", 323 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", 324 + "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", 325 + "cpu": [ 326 + "ppc64" 327 + ], 328 + "license": "MIT", 329 + "optional": true, 330 + "os": [ 331 + "aix" 332 + ], 333 + "engines": { 334 + "node": ">=18" 335 + } 336 + }, 337 + "node_modules/@esbuild/android-arm": { 338 + "version": "0.25.6", 339 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", 340 + "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", 341 + "cpu": [ 342 + "arm" 343 + ], 344 + "license": "MIT", 345 + "optional": true, 346 + "os": [ 347 + "android" 348 + ], 349 + "engines": { 350 + "node": ">=18" 351 + } 352 + }, 353 + "node_modules/@esbuild/android-arm64": { 354 + "version": "0.25.6", 355 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", 356 + "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", 357 + "cpu": [ 358 + "arm64" 359 + ], 360 + "license": "MIT", 361 + "optional": true, 362 + "os": [ 363 + "android" 364 + ], 365 + "engines": { 366 + "node": ">=18" 367 + } 368 + }, 369 + "node_modules/@esbuild/android-x64": { 370 + "version": "0.25.6", 371 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", 372 + "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", 373 + "cpu": [ 374 + "x64" 375 + ], 376 + "license": "MIT", 377 + "optional": true, 378 + "os": [ 379 + "android" 380 + ], 381 + "engines": { 382 + "node": ">=18" 383 + } 384 + }, 385 + "node_modules/@esbuild/darwin-arm64": { 386 + "version": "0.25.6", 387 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", 388 + "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", 389 + "cpu": [ 390 + "arm64" 391 + ], 392 + "license": "MIT", 393 + "optional": true, 394 + "os": [ 395 + "darwin" 396 + ], 397 + "engines": { 398 + "node": ">=18" 399 + } 400 + }, 401 + "node_modules/@esbuild/darwin-x64": { 402 + "version": "0.25.6", 403 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", 404 + "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", 405 + "cpu": [ 406 + "x64" 407 + ], 408 + "license": "MIT", 409 + "optional": true, 410 + "os": [ 411 + "darwin" 412 + ], 413 + "engines": { 414 + "node": ">=18" 415 + } 416 + }, 417 + "node_modules/@esbuild/freebsd-arm64": { 418 + "version": "0.25.6", 419 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", 420 + "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", 421 + "cpu": [ 422 + "arm64" 423 + ], 424 + "license": "MIT", 425 + "optional": true, 426 + "os": [ 427 + "freebsd" 428 + ], 429 + "engines": { 430 + "node": ">=18" 431 + } 432 + }, 433 + "node_modules/@esbuild/freebsd-x64": { 434 + "version": "0.25.6", 435 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", 436 + "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", 437 + "cpu": [ 438 + "x64" 439 + ], 440 + "license": "MIT", 441 + "optional": true, 442 + "os": [ 443 + "freebsd" 444 + ], 445 + "engines": { 446 + "node": ">=18" 447 + } 448 + }, 449 + "node_modules/@esbuild/linux-arm": { 450 + "version": "0.25.6", 451 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", 452 + "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", 453 + "cpu": [ 454 + "arm" 455 + ], 456 + "license": "MIT", 457 + "optional": true, 458 + "os": [ 459 + "linux" 460 + ], 461 + "engines": { 462 + "node": ">=18" 463 + } 464 + }, 465 + "node_modules/@esbuild/linux-arm64": { 466 + "version": "0.25.6", 467 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", 468 + "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", 469 + "cpu": [ 470 + "arm64" 471 + ], 472 + "license": "MIT", 473 + "optional": true, 474 + "os": [ 475 + "linux" 476 + ], 477 + "engines": { 478 + "node": ">=18" 479 + } 480 + }, 481 + "node_modules/@esbuild/linux-ia32": { 482 + "version": "0.25.6", 483 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", 484 + "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", 485 + "cpu": [ 486 + "ia32" 487 + ], 488 + "license": "MIT", 489 + "optional": true, 490 + "os": [ 491 + "linux" 492 + ], 493 + "engines": { 494 + "node": ">=18" 495 + } 496 + }, 497 + "node_modules/@esbuild/linux-loong64": { 498 + "version": "0.25.6", 499 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", 500 + "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", 501 + "cpu": [ 502 + "loong64" 503 + ], 504 + "license": "MIT", 505 + "optional": true, 506 + "os": [ 507 + "linux" 508 + ], 509 + "engines": { 510 + "node": ">=18" 511 + } 512 + }, 513 + "node_modules/@esbuild/linux-mips64el": { 514 + "version": "0.25.6", 515 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", 516 + "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", 517 + "cpu": [ 518 + "mips64el" 519 + ], 520 + "license": "MIT", 521 + "optional": true, 522 + "os": [ 523 + "linux" 524 + ], 525 + "engines": { 526 + "node": ">=18" 527 + } 528 + }, 529 + "node_modules/@esbuild/linux-ppc64": { 530 + "version": "0.25.6", 531 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", 532 + "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", 533 + "cpu": [ 534 + "ppc64" 535 + ], 536 + "license": "MIT", 537 + "optional": true, 538 + "os": [ 539 + "linux" 540 + ], 541 + "engines": { 542 + "node": ">=18" 543 + } 544 + }, 545 + "node_modules/@esbuild/linux-riscv64": { 546 + "version": "0.25.6", 547 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", 548 + "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", 549 + "cpu": [ 550 + "riscv64" 551 + ], 552 + "license": "MIT", 553 + "optional": true, 554 + "os": [ 555 + "linux" 556 + ], 557 + "engines": { 558 + "node": ">=18" 559 + } 560 + }, 561 + "node_modules/@esbuild/linux-s390x": { 562 + "version": "0.25.6", 563 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", 564 + "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", 565 + "cpu": [ 566 + "s390x" 567 + ], 568 + "license": "MIT", 569 + "optional": true, 570 + "os": [ 571 + "linux" 572 + ], 573 + "engines": { 574 + "node": ">=18" 575 + } 576 + }, 577 + "node_modules/@esbuild/linux-x64": { 578 + "version": "0.25.6", 579 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", 580 + "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", 581 + "cpu": [ 582 + "x64" 583 + ], 584 + "license": "MIT", 585 + "optional": true, 586 + "os": [ 587 + "linux" 588 + ], 589 + "engines": { 590 + "node": ">=18" 591 + } 592 + }, 593 + "node_modules/@esbuild/netbsd-arm64": { 594 + "version": "0.25.6", 595 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", 596 + "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", 597 + "cpu": [ 598 + "arm64" 599 + ], 600 + "license": "MIT", 601 + "optional": true, 602 + "os": [ 603 + "netbsd" 604 + ], 605 + "engines": { 606 + "node": ">=18" 607 + } 608 + }, 609 + "node_modules/@esbuild/netbsd-x64": { 610 + "version": "0.25.6", 611 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", 612 + "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", 613 + "cpu": [ 614 + "x64" 615 + ], 616 + "license": "MIT", 617 + "optional": true, 618 + "os": [ 619 + "netbsd" 620 + ], 621 + "engines": { 622 + "node": ">=18" 623 + } 624 + }, 625 + "node_modules/@esbuild/openbsd-arm64": { 626 + "version": "0.25.6", 627 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", 628 + "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", 629 + "cpu": [ 630 + "arm64" 631 + ], 632 + "license": "MIT", 633 + "optional": true, 634 + "os": [ 635 + "openbsd" 636 + ], 637 + "engines": { 638 + "node": ">=18" 639 + } 640 + }, 641 + "node_modules/@esbuild/openbsd-x64": { 642 + "version": "0.25.6", 643 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", 644 + "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", 645 + "cpu": [ 646 + "x64" 647 + ], 648 + "license": "MIT", 649 + "optional": true, 650 + "os": [ 651 + "openbsd" 652 + ], 653 + "engines": { 654 + "node": ">=18" 655 + } 656 + }, 657 + "node_modules/@esbuild/openharmony-arm64": { 658 + "version": "0.25.6", 659 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", 660 + "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", 661 + "cpu": [ 662 + "arm64" 663 + ], 664 + "license": "MIT", 665 + "optional": true, 666 + "os": [ 667 + "openharmony" 668 + ], 669 + "engines": { 670 + "node": ">=18" 671 + } 672 + }, 673 + "node_modules/@esbuild/sunos-x64": { 674 + "version": "0.25.6", 675 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", 676 + "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", 677 + "cpu": [ 678 + "x64" 679 + ], 680 + "license": "MIT", 681 + "optional": true, 682 + "os": [ 683 + "sunos" 684 + ], 685 + "engines": { 686 + "node": ">=18" 687 + } 688 + }, 689 + "node_modules/@esbuild/win32-arm64": { 690 + "version": "0.25.6", 691 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", 692 + "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", 693 + "cpu": [ 694 + "arm64" 695 + ], 696 + "license": "MIT", 697 + "optional": true, 698 + "os": [ 699 + "win32" 700 + ], 701 + "engines": { 702 + "node": ">=18" 703 + } 704 + }, 705 + "node_modules/@esbuild/win32-ia32": { 706 + "version": "0.25.6", 707 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", 708 + "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", 709 + "cpu": [ 710 + "ia32" 711 + ], 712 + "license": "MIT", 713 + "optional": true, 714 + "os": [ 715 + "win32" 716 + ], 717 + "engines": { 718 + "node": ">=18" 719 + } 720 + }, 721 + "node_modules/@esbuild/win32-x64": { 722 + "version": "0.25.6", 723 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", 724 + "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", 725 + "cpu": [ 726 + "x64" 727 + ], 728 + "license": "MIT", 729 + "optional": true, 730 + "os": [ 731 + "win32" 732 + ], 733 + "engines": { 734 + "node": ">=18" 735 + } 736 + }, 737 + "node_modules/@expo-google-fonts/jetbrains-mono": { 738 + "version": "0.4.0", 739 + "resolved": "https://registry.npmjs.org/@expo-google-fonts/jetbrains-mono/-/jetbrains-mono-0.4.0.tgz", 740 + "integrity": "sha512-nPF2HgDayw9V9lublqdlNXbfyKXGuJN91kAeGy9TGsQaJWsrMuvIIsJlyElvBV9bGOe/TY+oKgKLJGSltVsVjg==", 741 + "license": "MIT AND OFL-1.1" 742 + }, 743 + "node_modules/@expressive-code/core": { 744 + "version": "0.41.3", 745 + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.3.tgz", 746 + "integrity": "sha512-9qzohqU7O0+JwMEEgQhnBPOw5DtsQRBXhW++5fvEywsuX44vCGGof1SL5OvPElvNgaWZ4pFZAFSlkNOkGyLwSQ==", 747 + "license": "MIT", 748 + "dependencies": { 749 + "@ctrl/tinycolor": "^4.0.4", 750 + "hast-util-select": "^6.0.2", 751 + "hast-util-to-html": "^9.0.1", 752 + "hast-util-to-text": "^4.0.1", 753 + "hastscript": "^9.0.0", 754 + "postcss": "^8.4.38", 755 + "postcss-nested": "^6.0.1", 756 + "unist-util-visit": "^5.0.0", 757 + "unist-util-visit-parents": "^6.0.1" 758 + } 759 + }, 760 + "node_modules/@expressive-code/plugin-frames": { 761 + "version": "0.41.3", 762 + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.3.tgz", 763 + "integrity": "sha512-rFQtmf/3N2CK3Cq/uERweMTYZnBu+CwxBdHuOftEmfA9iBE7gTVvwpbh82P9ZxkPLvc40UMhYt7uNuAZexycRQ==", 764 + "license": "MIT", 765 + "dependencies": { 766 + "@expressive-code/core": "^0.41.3" 767 + } 768 + }, 769 + "node_modules/@expressive-code/plugin-line-numbers": { 770 + "version": "0.41.3", 771 + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-line-numbers/-/plugin-line-numbers-0.41.3.tgz", 772 + "integrity": "sha512-eig82a4CRC3XgVPQ2S/TMDcLiHJokOCD/mAdNVImpD3segVewxfjGgtj5DXQRo0E0q6f0R0EH34YzTFl5CEPqg==", 773 + "license": "MIT", 774 + "dependencies": { 775 + "@expressive-code/core": "^0.41.3" 776 + } 777 + }, 778 + "node_modules/@expressive-code/plugin-shiki": { 779 + "version": "0.41.3", 780 + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.3.tgz", 781 + "integrity": "sha512-RlTARoopzhFJIOVHLGvuXJ8DCEme/hjV+ZnRJBIxzxsKVpGPW4Oshqg9xGhWTYdHstTsxO663s0cdBLzZj9TQA==", 782 + "license": "MIT", 783 + "dependencies": { 784 + "@expressive-code/core": "^0.41.3", 785 + "shiki": "^3.2.2" 786 + } 787 + }, 788 + "node_modules/@expressive-code/plugin-text-markers": { 789 + "version": "0.41.3", 790 + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.3.tgz", 791 + "integrity": "sha512-SN8tkIzDpA0HLAscEYD2IVrfLiid6qEdE9QLlGVSxO1KEw7qYvjpbNBQjUjMr5/jvTJ7ys6zysU2vLPHE0sb2g==", 792 + "license": "MIT", 793 + "dependencies": { 794 + "@expressive-code/core": "^0.41.3" 795 + } 796 + }, 797 + "node_modules/@fontsource-variable/jetbrains-mono": { 798 + "version": "5.2.6", 799 + "resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.2.6.tgz", 800 + "integrity": "sha512-1pvtyK6H1paBOixbtZ9xfQgArVQ4SJMW3WSGZPOd5PiW3yg0t8umwKnjDMzW2ofb7qSdiXnsnIaHPT36vEOdlg==", 801 + "license": "OFL-1.1", 802 + "funding": { 803 + "url": "https://github.com/sponsors/ayuhito" 804 + } 805 + }, 806 + "node_modules/@img/sharp-darwin-arm64": { 807 + "version": "0.33.5", 808 + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", 809 + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", 810 + "cpu": [ 811 + "arm64" 812 + ], 813 + "license": "Apache-2.0", 814 + "optional": true, 815 + "os": [ 816 + "darwin" 817 + ], 818 + "engines": { 819 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 820 + }, 821 + "funding": { 822 + "url": "https://opencollective.com/libvips" 823 + }, 824 + "optionalDependencies": { 825 + "@img/sharp-libvips-darwin-arm64": "1.0.4" 826 + } 827 + }, 828 + "node_modules/@img/sharp-darwin-x64": { 829 + "version": "0.33.5", 830 + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", 831 + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", 832 + "cpu": [ 833 + "x64" 834 + ], 835 + "license": "Apache-2.0", 836 + "optional": true, 837 + "os": [ 838 + "darwin" 839 + ], 840 + "engines": { 841 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 842 + }, 843 + "funding": { 844 + "url": "https://opencollective.com/libvips" 845 + }, 846 + "optionalDependencies": { 847 + "@img/sharp-libvips-darwin-x64": "1.0.4" 848 + } 849 + }, 850 + "node_modules/@img/sharp-libvips-darwin-arm64": { 851 + "version": "1.0.4", 852 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", 853 + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", 854 + "cpu": [ 855 + "arm64" 856 + ], 857 + "license": "LGPL-3.0-or-later", 858 + "optional": true, 859 + "os": [ 860 + "darwin" 861 + ], 862 + "funding": { 863 + "url": "https://opencollective.com/libvips" 864 + } 865 + }, 866 + "node_modules/@img/sharp-libvips-darwin-x64": { 867 + "version": "1.0.4", 868 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", 869 + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", 870 + "cpu": [ 871 + "x64" 872 + ], 873 + "license": "LGPL-3.0-or-later", 874 + "optional": true, 875 + "os": [ 876 + "darwin" 877 + ], 878 + "funding": { 879 + "url": "https://opencollective.com/libvips" 880 + } 881 + }, 882 + "node_modules/@img/sharp-libvips-linux-arm": { 883 + "version": "1.0.5", 884 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", 885 + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", 886 + "cpu": [ 887 + "arm" 888 + ], 889 + "license": "LGPL-3.0-or-later", 890 + "optional": true, 891 + "os": [ 892 + "linux" 893 + ], 894 + "funding": { 895 + "url": "https://opencollective.com/libvips" 896 + } 897 + }, 898 + "node_modules/@img/sharp-libvips-linux-arm64": { 899 + "version": "1.0.4", 900 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", 901 + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", 902 + "cpu": [ 903 + "arm64" 904 + ], 905 + "license": "LGPL-3.0-or-later", 906 + "optional": true, 907 + "os": [ 908 + "linux" 909 + ], 910 + "funding": { 911 + "url": "https://opencollective.com/libvips" 912 + } 913 + }, 914 + "node_modules/@img/sharp-libvips-linux-s390x": { 915 + "version": "1.0.4", 916 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", 917 + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", 918 + "cpu": [ 919 + "s390x" 920 + ], 921 + "license": "LGPL-3.0-or-later", 922 + "optional": true, 923 + "os": [ 924 + "linux" 925 + ], 926 + "funding": { 927 + "url": "https://opencollective.com/libvips" 928 + } 929 + }, 930 + "node_modules/@img/sharp-libvips-linux-x64": { 931 + "version": "1.0.4", 932 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", 933 + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", 934 + "cpu": [ 935 + "x64" 936 + ], 937 + "license": "LGPL-3.0-or-later", 938 + "optional": true, 939 + "os": [ 940 + "linux" 941 + ], 942 + "funding": { 943 + "url": "https://opencollective.com/libvips" 944 + } 945 + }, 946 + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 947 + "version": "1.0.4", 948 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", 949 + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", 950 + "cpu": [ 951 + "arm64" 952 + ], 953 + "license": "LGPL-3.0-or-later", 954 + "optional": true, 955 + "os": [ 956 + "linux" 957 + ], 958 + "funding": { 959 + "url": "https://opencollective.com/libvips" 960 + } 961 + }, 962 + "node_modules/@img/sharp-libvips-linuxmusl-x64": { 963 + "version": "1.0.4", 964 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", 965 + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", 966 + "cpu": [ 967 + "x64" 968 + ], 969 + "license": "LGPL-3.0-or-later", 970 + "optional": true, 971 + "os": [ 972 + "linux" 973 + ], 974 + "funding": { 975 + "url": "https://opencollective.com/libvips" 976 + } 977 + }, 978 + "node_modules/@img/sharp-linux-arm": { 979 + "version": "0.33.5", 980 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", 981 + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", 982 + "cpu": [ 983 + "arm" 984 + ], 985 + "license": "Apache-2.0", 986 + "optional": true, 987 + "os": [ 988 + "linux" 989 + ], 990 + "engines": { 991 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 992 + }, 993 + "funding": { 994 + "url": "https://opencollective.com/libvips" 995 + }, 996 + "optionalDependencies": { 997 + "@img/sharp-libvips-linux-arm": "1.0.5" 998 + } 999 + }, 1000 + "node_modules/@img/sharp-linux-arm64": { 1001 + "version": "0.33.5", 1002 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", 1003 + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", 1004 + "cpu": [ 1005 + "arm64" 1006 + ], 1007 + "license": "Apache-2.0", 1008 + "optional": true, 1009 + "os": [ 1010 + "linux" 1011 + ], 1012 + "engines": { 1013 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1014 + }, 1015 + "funding": { 1016 + "url": "https://opencollective.com/libvips" 1017 + }, 1018 + "optionalDependencies": { 1019 + "@img/sharp-libvips-linux-arm64": "1.0.4" 1020 + } 1021 + }, 1022 + "node_modules/@img/sharp-linux-s390x": { 1023 + "version": "0.33.5", 1024 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", 1025 + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", 1026 + "cpu": [ 1027 + "s390x" 1028 + ], 1029 + "license": "Apache-2.0", 1030 + "optional": true, 1031 + "os": [ 1032 + "linux" 1033 + ], 1034 + "engines": { 1035 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1036 + }, 1037 + "funding": { 1038 + "url": "https://opencollective.com/libvips" 1039 + }, 1040 + "optionalDependencies": { 1041 + "@img/sharp-libvips-linux-s390x": "1.0.4" 1042 + } 1043 + }, 1044 + "node_modules/@img/sharp-linux-x64": { 1045 + "version": "0.33.5", 1046 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", 1047 + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", 1048 + "cpu": [ 1049 + "x64" 1050 + ], 1051 + "license": "Apache-2.0", 1052 + "optional": true, 1053 + "os": [ 1054 + "linux" 1055 + ], 1056 + "engines": { 1057 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1058 + }, 1059 + "funding": { 1060 + "url": "https://opencollective.com/libvips" 1061 + }, 1062 + "optionalDependencies": { 1063 + "@img/sharp-libvips-linux-x64": "1.0.4" 1064 + } 1065 + }, 1066 + "node_modules/@img/sharp-linuxmusl-arm64": { 1067 + "version": "0.33.5", 1068 + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", 1069 + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", 1070 + "cpu": [ 1071 + "arm64" 1072 + ], 1073 + "license": "Apache-2.0", 1074 + "optional": true, 1075 + "os": [ 1076 + "linux" 1077 + ], 1078 + "engines": { 1079 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1080 + }, 1081 + "funding": { 1082 + "url": "https://opencollective.com/libvips" 1083 + }, 1084 + "optionalDependencies": { 1085 + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" 1086 + } 1087 + }, 1088 + "node_modules/@img/sharp-linuxmusl-x64": { 1089 + "version": "0.33.5", 1090 + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", 1091 + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", 1092 + "cpu": [ 1093 + "x64" 1094 + ], 1095 + "license": "Apache-2.0", 1096 + "optional": true, 1097 + "os": [ 1098 + "linux" 1099 + ], 1100 + "engines": { 1101 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1102 + }, 1103 + "funding": { 1104 + "url": "https://opencollective.com/libvips" 1105 + }, 1106 + "optionalDependencies": { 1107 + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" 1108 + } 1109 + }, 1110 + "node_modules/@img/sharp-wasm32": { 1111 + "version": "0.33.5", 1112 + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", 1113 + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", 1114 + "cpu": [ 1115 + "wasm32" 1116 + ], 1117 + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", 1118 + "optional": true, 1119 + "dependencies": { 1120 + "@emnapi/runtime": "^1.2.0" 1121 + }, 1122 + "engines": { 1123 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1124 + }, 1125 + "funding": { 1126 + "url": "https://opencollective.com/libvips" 1127 + } 1128 + }, 1129 + "node_modules/@img/sharp-win32-ia32": { 1130 + "version": "0.33.5", 1131 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", 1132 + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", 1133 + "cpu": [ 1134 + "ia32" 1135 + ], 1136 + "license": "Apache-2.0 AND LGPL-3.0-or-later", 1137 + "optional": true, 1138 + "os": [ 1139 + "win32" 1140 + ], 1141 + "engines": { 1142 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1143 + }, 1144 + "funding": { 1145 + "url": "https://opencollective.com/libvips" 1146 + } 1147 + }, 1148 + "node_modules/@img/sharp-win32-x64": { 1149 + "version": "0.33.5", 1150 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", 1151 + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", 1152 + "cpu": [ 1153 + "x64" 1154 + ], 1155 + "license": "Apache-2.0 AND LGPL-3.0-or-later", 1156 + "optional": true, 1157 + "os": [ 1158 + "win32" 1159 + ], 1160 + "engines": { 1161 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1162 + }, 1163 + "funding": { 1164 + "url": "https://opencollective.com/libvips" 1165 + } 1166 + }, 1167 + "node_modules/@isaacs/fs-minipass": { 1168 + "version": "4.0.1", 1169 + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", 1170 + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", 1171 + "license": "ISC", 1172 + "dependencies": { 1173 + "minipass": "^7.0.4" 1174 + }, 1175 + "engines": { 1176 + "node": ">=18.0.0" 1177 + } 1178 + }, 1179 + "node_modules/@jridgewell/gen-mapping": { 1180 + "version": "0.3.13", 1181 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 1182 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 1183 + "license": "MIT", 1184 + "dependencies": { 1185 + "@jridgewell/sourcemap-codec": "^1.5.0", 1186 + "@jridgewell/trace-mapping": "^0.3.24" 1187 + } 1188 + }, 1189 + "node_modules/@jridgewell/remapping": { 1190 + "version": "2.3.5", 1191 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 1192 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 1193 + "license": "MIT", 1194 + "dependencies": { 1195 + "@jridgewell/gen-mapping": "^0.3.5", 1196 + "@jridgewell/trace-mapping": "^0.3.24" 1197 + } 1198 + }, 1199 + "node_modules/@jridgewell/resolve-uri": { 1200 + "version": "3.1.2", 1201 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1202 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1203 + "license": "MIT", 1204 + "engines": { 1205 + "node": ">=6.0.0" 1206 + } 1207 + }, 1208 + "node_modules/@jridgewell/sourcemap-codec": { 1209 + "version": "1.5.5", 1210 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 1211 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 1212 + "license": "MIT" 1213 + }, 1214 + "node_modules/@jridgewell/trace-mapping": { 1215 + "version": "0.3.30", 1216 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", 1217 + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", 1218 + "license": "MIT", 1219 + "dependencies": { 1220 + "@jridgewell/resolve-uri": "^3.1.0", 1221 + "@jridgewell/sourcemap-codec": "^1.4.14" 1222 + } 1223 + }, 1224 + "node_modules/@mdx-js/mdx": { 1225 + "version": "3.1.1", 1226 + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", 1227 + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", 1228 + "license": "MIT", 1229 + "dependencies": { 1230 + "@types/estree": "^1.0.0", 1231 + "@types/estree-jsx": "^1.0.0", 1232 + "@types/hast": "^3.0.0", 1233 + "@types/mdx": "^2.0.0", 1234 + "acorn": "^8.0.0", 1235 + "collapse-white-space": "^2.0.0", 1236 + "devlop": "^1.0.0", 1237 + "estree-util-is-identifier-name": "^3.0.0", 1238 + "estree-util-scope": "^1.0.0", 1239 + "estree-walker": "^3.0.0", 1240 + "hast-util-to-jsx-runtime": "^2.0.0", 1241 + "markdown-extensions": "^2.0.0", 1242 + "recma-build-jsx": "^1.0.0", 1243 + "recma-jsx": "^1.0.0", 1244 + "recma-stringify": "^1.0.0", 1245 + "rehype-recma": "^1.0.0", 1246 + "remark-mdx": "^3.0.0", 1247 + "remark-parse": "^11.0.0", 1248 + "remark-rehype": "^11.0.0", 1249 + "source-map": "^0.7.0", 1250 + "unified": "^11.0.0", 1251 + "unist-util-position-from-estree": "^2.0.0", 1252 + "unist-util-stringify-position": "^4.0.0", 1253 + "unist-util-visit": "^5.0.0", 1254 + "vfile": "^6.0.0" 1255 + }, 1256 + "funding": { 1257 + "type": "opencollective", 1258 + "url": "https://opencollective.com/unified" 1259 + } 1260 + }, 1261 + "node_modules/@oslojs/encoding": { 1262 + "version": "1.1.0", 1263 + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", 1264 + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", 1265 + "license": "MIT" 1266 + }, 1267 + "node_modules/@pagefind/darwin-arm64": { 1268 + "version": "1.4.0", 1269 + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz", 1270 + "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==", 1271 + "cpu": [ 1272 + "arm64" 1273 + ], 1274 + "dev": true, 1275 + "license": "MIT", 1276 + "optional": true, 1277 + "os": [ 1278 + "darwin" 1279 + ] 1280 + }, 1281 + "node_modules/@pagefind/darwin-x64": { 1282 + "version": "1.4.0", 1283 + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz", 1284 + "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==", 1285 + "cpu": [ 1286 + "x64" 1287 + ], 1288 + "dev": true, 1289 + "license": "MIT", 1290 + "optional": true, 1291 + "os": [ 1292 + "darwin" 1293 + ] 1294 + }, 1295 + "node_modules/@pagefind/default-ui": { 1296 + "version": "1.4.0", 1297 + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.4.0.tgz", 1298 + "integrity": "sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==", 1299 + "license": "MIT" 1300 + }, 1301 + "node_modules/@pagefind/freebsd-x64": { 1302 + "version": "1.4.0", 1303 + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz", 1304 + "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==", 1305 + "cpu": [ 1306 + "x64" 1307 + ], 1308 + "dev": true, 1309 + "license": "MIT", 1310 + "optional": true, 1311 + "os": [ 1312 + "freebsd" 1313 + ] 1314 + }, 1315 + "node_modules/@pagefind/linux-arm64": { 1316 + "version": "1.4.0", 1317 + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz", 1318 + "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==", 1319 + "cpu": [ 1320 + "arm64" 1321 + ], 1322 + "dev": true, 1323 + "license": "MIT", 1324 + "optional": true, 1325 + "os": [ 1326 + "linux" 1327 + ] 1328 + }, 1329 + "node_modules/@pagefind/linux-x64": { 1330 + "version": "1.4.0", 1331 + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz", 1332 + "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==", 1333 + "cpu": [ 1334 + "x64" 1335 + ], 1336 + "dev": true, 1337 + "license": "MIT", 1338 + "optional": true, 1339 + "os": [ 1340 + "linux" 1341 + ] 1342 + }, 1343 + "node_modules/@pagefind/windows-x64": { 1344 + "version": "1.4.0", 1345 + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz", 1346 + "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==", 1347 + "cpu": [ 1348 + "x64" 1349 + ], 1350 + "dev": true, 1351 + "license": "MIT", 1352 + "optional": true, 1353 + "os": [ 1354 + "win32" 1355 + ] 1356 + }, 1357 + "node_modules/@parcel/watcher": { 1358 + "version": "2.5.1", 1359 + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", 1360 + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", 1361 + "dev": true, 1362 + "hasInstallScript": true, 1363 + "license": "MIT", 1364 + "optional": true, 1365 + "dependencies": { 1366 + "detect-libc": "^1.0.3", 1367 + "is-glob": "^4.0.3", 1368 + "micromatch": "^4.0.5", 1369 + "node-addon-api": "^7.0.0" 1370 + }, 1371 + "engines": { 1372 + "node": ">= 10.0.0" 1373 + }, 1374 + "funding": { 1375 + "type": "opencollective", 1376 + "url": "https://opencollective.com/parcel" 1377 + }, 1378 + "optionalDependencies": { 1379 + "@parcel/watcher-android-arm64": "2.5.1", 1380 + "@parcel/watcher-darwin-arm64": "2.5.1", 1381 + "@parcel/watcher-darwin-x64": "2.5.1", 1382 + "@parcel/watcher-freebsd-x64": "2.5.1", 1383 + "@parcel/watcher-linux-arm-glibc": "2.5.1", 1384 + "@parcel/watcher-linux-arm-musl": "2.5.1", 1385 + "@parcel/watcher-linux-arm64-glibc": "2.5.1", 1386 + "@parcel/watcher-linux-arm64-musl": "2.5.1", 1387 + "@parcel/watcher-linux-x64-glibc": "2.5.1", 1388 + "@parcel/watcher-linux-x64-musl": "2.5.1", 1389 + "@parcel/watcher-win32-arm64": "2.5.1", 1390 + "@parcel/watcher-win32-ia32": "2.5.1", 1391 + "@parcel/watcher-win32-x64": "2.5.1" 1392 + } 1393 + }, 1394 + "node_modules/@parcel/watcher-android-arm64": { 1395 + "version": "2.5.1", 1396 + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", 1397 + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", 1398 + "cpu": [ 1399 + "arm64" 1400 + ], 1401 + "dev": true, 1402 + "license": "MIT", 1403 + "optional": true, 1404 + "os": [ 1405 + "android" 1406 + ], 1407 + "engines": { 1408 + "node": ">= 10.0.0" 1409 + }, 1410 + "funding": { 1411 + "type": "opencollective", 1412 + "url": "https://opencollective.com/parcel" 1413 + } 1414 + }, 1415 + "node_modules/@parcel/watcher-darwin-arm64": { 1416 + "version": "2.5.1", 1417 + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", 1418 + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", 1419 + "cpu": [ 1420 + "arm64" 1421 + ], 1422 + "dev": true, 1423 + "license": "MIT", 1424 + "optional": true, 1425 + "os": [ 1426 + "darwin" 1427 + ], 1428 + "engines": { 1429 + "node": ">= 10.0.0" 1430 + }, 1431 + "funding": { 1432 + "type": "opencollective", 1433 + "url": "https://opencollective.com/parcel" 1434 + } 1435 + }, 1436 + "node_modules/@parcel/watcher-darwin-x64": { 1437 + "version": "2.5.1", 1438 + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", 1439 + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", 1440 + "cpu": [ 1441 + "x64" 1442 + ], 1443 + "dev": true, 1444 + "license": "MIT", 1445 + "optional": true, 1446 + "os": [ 1447 + "darwin" 1448 + ], 1449 + "engines": { 1450 + "node": ">= 10.0.0" 1451 + }, 1452 + "funding": { 1453 + "type": "opencollective", 1454 + "url": "https://opencollective.com/parcel" 1455 + } 1456 + }, 1457 + "node_modules/@parcel/watcher-freebsd-x64": { 1458 + "version": "2.5.1", 1459 + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", 1460 + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", 1461 + "cpu": [ 1462 + "x64" 1463 + ], 1464 + "dev": true, 1465 + "license": "MIT", 1466 + "optional": true, 1467 + "os": [ 1468 + "freebsd" 1469 + ], 1470 + "engines": { 1471 + "node": ">= 10.0.0" 1472 + }, 1473 + "funding": { 1474 + "type": "opencollective", 1475 + "url": "https://opencollective.com/parcel" 1476 + } 1477 + }, 1478 + "node_modules/@parcel/watcher-linux-arm-glibc": { 1479 + "version": "2.5.1", 1480 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", 1481 + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", 1482 + "cpu": [ 1483 + "arm" 1484 + ], 1485 + "dev": true, 1486 + "license": "MIT", 1487 + "optional": true, 1488 + "os": [ 1489 + "linux" 1490 + ], 1491 + "engines": { 1492 + "node": ">= 10.0.0" 1493 + }, 1494 + "funding": { 1495 + "type": "opencollective", 1496 + "url": "https://opencollective.com/parcel" 1497 + } 1498 + }, 1499 + "node_modules/@parcel/watcher-linux-arm-musl": { 1500 + "version": "2.5.1", 1501 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", 1502 + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", 1503 + "cpu": [ 1504 + "arm" 1505 + ], 1506 + "dev": true, 1507 + "license": "MIT", 1508 + "optional": true, 1509 + "os": [ 1510 + "linux" 1511 + ], 1512 + "engines": { 1513 + "node": ">= 10.0.0" 1514 + }, 1515 + "funding": { 1516 + "type": "opencollective", 1517 + "url": "https://opencollective.com/parcel" 1518 + } 1519 + }, 1520 + "node_modules/@parcel/watcher-linux-arm64-glibc": { 1521 + "version": "2.5.1", 1522 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", 1523 + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", 1524 + "cpu": [ 1525 + "arm64" 1526 + ], 1527 + "dev": true, 1528 + "license": "MIT", 1529 + "optional": true, 1530 + "os": [ 1531 + "linux" 1532 + ], 1533 + "engines": { 1534 + "node": ">= 10.0.0" 1535 + }, 1536 + "funding": { 1537 + "type": "opencollective", 1538 + "url": "https://opencollective.com/parcel" 1539 + } 1540 + }, 1541 + "node_modules/@parcel/watcher-linux-arm64-musl": { 1542 + "version": "2.5.1", 1543 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", 1544 + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", 1545 + "cpu": [ 1546 + "arm64" 1547 + ], 1548 + "dev": true, 1549 + "license": "MIT", 1550 + "optional": true, 1551 + "os": [ 1552 + "linux" 1553 + ], 1554 + "engines": { 1555 + "node": ">= 10.0.0" 1556 + }, 1557 + "funding": { 1558 + "type": "opencollective", 1559 + "url": "https://opencollective.com/parcel" 1560 + } 1561 + }, 1562 + "node_modules/@parcel/watcher-linux-x64-glibc": { 1563 + "version": "2.5.1", 1564 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", 1565 + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", 1566 + "cpu": [ 1567 + "x64" 1568 + ], 1569 + "dev": true, 1570 + "license": "MIT", 1571 + "optional": true, 1572 + "os": [ 1573 + "linux" 1574 + ], 1575 + "engines": { 1576 + "node": ">= 10.0.0" 1577 + }, 1578 + "funding": { 1579 + "type": "opencollective", 1580 + "url": "https://opencollective.com/parcel" 1581 + } 1582 + }, 1583 + "node_modules/@parcel/watcher-linux-x64-musl": { 1584 + "version": "2.5.1", 1585 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", 1586 + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", 1587 + "cpu": [ 1588 + "x64" 1589 + ], 1590 + "dev": true, 1591 + "license": "MIT", 1592 + "optional": true, 1593 + "os": [ 1594 + "linux" 1595 + ], 1596 + "engines": { 1597 + "node": ">= 10.0.0" 1598 + }, 1599 + "funding": { 1600 + "type": "opencollective", 1601 + "url": "https://opencollective.com/parcel" 1602 + } 1603 + }, 1604 + "node_modules/@parcel/watcher-win32-arm64": { 1605 + "version": "2.5.1", 1606 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", 1607 + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", 1608 + "cpu": [ 1609 + "arm64" 1610 + ], 1611 + "dev": true, 1612 + "license": "MIT", 1613 + "optional": true, 1614 + "os": [ 1615 + "win32" 1616 + ], 1617 + "engines": { 1618 + "node": ">= 10.0.0" 1619 + }, 1620 + "funding": { 1621 + "type": "opencollective", 1622 + "url": "https://opencollective.com/parcel" 1623 + } 1624 + }, 1625 + "node_modules/@parcel/watcher-win32-ia32": { 1626 + "version": "2.5.1", 1627 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", 1628 + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", 1629 + "cpu": [ 1630 + "ia32" 1631 + ], 1632 + "dev": true, 1633 + "license": "MIT", 1634 + "optional": true, 1635 + "os": [ 1636 + "win32" 1637 + ], 1638 + "engines": { 1639 + "node": ">= 10.0.0" 1640 + }, 1641 + "funding": { 1642 + "type": "opencollective", 1643 + "url": "https://opencollective.com/parcel" 1644 + } 1645 + }, 1646 + "node_modules/@parcel/watcher-win32-x64": { 1647 + "version": "2.5.1", 1648 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", 1649 + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", 1650 + "cpu": [ 1651 + "x64" 1652 + ], 1653 + "dev": true, 1654 + "license": "MIT", 1655 + "optional": true, 1656 + "os": [ 1657 + "win32" 1658 + ], 1659 + "engines": { 1660 + "node": ">= 10.0.0" 1661 + }, 1662 + "funding": { 1663 + "type": "opencollective", 1664 + "url": "https://opencollective.com/parcel" 1665 + } 1666 + }, 1667 + "node_modules/@parcel/watcher/node_modules/detect-libc": { 1668 + "version": "1.0.3", 1669 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 1670 + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", 1671 + "dev": true, 1672 + "license": "Apache-2.0", 1673 + "optional": true, 1674 + "bin": { 1675 + "detect-libc": "bin/detect-libc.js" 1676 + }, 1677 + "engines": { 1678 + "node": ">=0.10" 1679 + } 1680 + }, 1681 + "node_modules/@resvg/resvg-js": { 1682 + "version": "2.6.2", 1683 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz", 1684 + "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==", 1685 + "license": "MPL-2.0", 1686 + "engines": { 1687 + "node": ">= 10" 1688 + }, 1689 + "optionalDependencies": { 1690 + "@resvg/resvg-js-android-arm-eabi": "2.6.2", 1691 + "@resvg/resvg-js-android-arm64": "2.6.2", 1692 + "@resvg/resvg-js-darwin-arm64": "2.6.2", 1693 + "@resvg/resvg-js-darwin-x64": "2.6.2", 1694 + "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", 1695 + "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", 1696 + "@resvg/resvg-js-linux-arm64-musl": "2.6.2", 1697 + "@resvg/resvg-js-linux-x64-gnu": "2.6.2", 1698 + "@resvg/resvg-js-linux-x64-musl": "2.6.2", 1699 + "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", 1700 + "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", 1701 + "@resvg/resvg-js-win32-x64-msvc": "2.6.2" 1702 + } 1703 + }, 1704 + "node_modules/@resvg/resvg-js-android-arm-eabi": { 1705 + "version": "2.6.2", 1706 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.2.tgz", 1707 + "integrity": "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==", 1708 + "cpu": [ 1709 + "arm" 1710 + ], 1711 + "license": "MPL-2.0", 1712 + "optional": true, 1713 + "os": [ 1714 + "android" 1715 + ], 1716 + "engines": { 1717 + "node": ">= 10" 1718 + } 1719 + }, 1720 + "node_modules/@resvg/resvg-js-android-arm64": { 1721 + "version": "2.6.2", 1722 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.2.tgz", 1723 + "integrity": "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==", 1724 + "cpu": [ 1725 + "arm64" 1726 + ], 1727 + "license": "MPL-2.0", 1728 + "optional": true, 1729 + "os": [ 1730 + "android" 1731 + ], 1732 + "engines": { 1733 + "node": ">= 10" 1734 + } 1735 + }, 1736 + "node_modules/@resvg/resvg-js-darwin-arm64": { 1737 + "version": "2.6.2", 1738 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.2.tgz", 1739 + "integrity": "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==", 1740 + "cpu": [ 1741 + "arm64" 1742 + ], 1743 + "license": "MPL-2.0", 1744 + "optional": true, 1745 + "os": [ 1746 + "darwin" 1747 + ], 1748 + "engines": { 1749 + "node": ">= 10" 1750 + } 1751 + }, 1752 + "node_modules/@resvg/resvg-js-darwin-x64": { 1753 + "version": "2.6.2", 1754 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.2.tgz", 1755 + "integrity": "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==", 1756 + "cpu": [ 1757 + "x64" 1758 + ], 1759 + "license": "MPL-2.0", 1760 + "optional": true, 1761 + "os": [ 1762 + "darwin" 1763 + ], 1764 + "engines": { 1765 + "node": ">= 10" 1766 + } 1767 + }, 1768 + "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { 1769 + "version": "2.6.2", 1770 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.2.tgz", 1771 + "integrity": "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==", 1772 + "cpu": [ 1773 + "arm" 1774 + ], 1775 + "license": "MPL-2.0", 1776 + "optional": true, 1777 + "os": [ 1778 + "linux" 1779 + ], 1780 + "engines": { 1781 + "node": ">= 10" 1782 + } 1783 + }, 1784 + "node_modules/@resvg/resvg-js-linux-arm64-gnu": { 1785 + "version": "2.6.2", 1786 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.2.tgz", 1787 + "integrity": "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==", 1788 + "cpu": [ 1789 + "arm64" 1790 + ], 1791 + "license": "MPL-2.0", 1792 + "optional": true, 1793 + "os": [ 1794 + "linux" 1795 + ], 1796 + "engines": { 1797 + "node": ">= 10" 1798 + } 1799 + }, 1800 + "node_modules/@resvg/resvg-js-linux-arm64-musl": { 1801 + "version": "2.6.2", 1802 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.2.tgz", 1803 + "integrity": "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==", 1804 + "cpu": [ 1805 + "arm64" 1806 + ], 1807 + "license": "MPL-2.0", 1808 + "optional": true, 1809 + "os": [ 1810 + "linux" 1811 + ], 1812 + "engines": { 1813 + "node": ">= 10" 1814 + } 1815 + }, 1816 + "node_modules/@resvg/resvg-js-linux-x64-gnu": { 1817 + "version": "2.6.2", 1818 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz", 1819 + "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==", 1820 + "cpu": [ 1821 + "x64" 1822 + ], 1823 + "license": "MPL-2.0", 1824 + "optional": true, 1825 + "os": [ 1826 + "linux" 1827 + ], 1828 + "engines": { 1829 + "node": ">= 10" 1830 + } 1831 + }, 1832 + "node_modules/@resvg/resvg-js-linux-x64-musl": { 1833 + "version": "2.6.2", 1834 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz", 1835 + "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==", 1836 + "cpu": [ 1837 + "x64" 1838 + ], 1839 + "license": "MPL-2.0", 1840 + "optional": true, 1841 + "os": [ 1842 + "linux" 1843 + ], 1844 + "engines": { 1845 + "node": ">= 10" 1846 + } 1847 + }, 1848 + "node_modules/@resvg/resvg-js-win32-arm64-msvc": { 1849 + "version": "2.6.2", 1850 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.2.tgz", 1851 + "integrity": "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==", 1852 + "cpu": [ 1853 + "arm64" 1854 + ], 1855 + "license": "MPL-2.0", 1856 + "optional": true, 1857 + "os": [ 1858 + "win32" 1859 + ], 1860 + "engines": { 1861 + "node": ">= 10" 1862 + } 1863 + }, 1864 + "node_modules/@resvg/resvg-js-win32-ia32-msvc": { 1865 + "version": "2.6.2", 1866 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.2.tgz", 1867 + "integrity": "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==", 1868 + "cpu": [ 1869 + "ia32" 1870 + ], 1871 + "license": "MPL-2.0", 1872 + "optional": true, 1873 + "os": [ 1874 + "win32" 1875 + ], 1876 + "engines": { 1877 + "node": ">= 10" 1878 + } 1879 + }, 1880 + "node_modules/@resvg/resvg-js-win32-x64-msvc": { 1881 + "version": "2.6.2", 1882 + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.2.tgz", 1883 + "integrity": "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==", 1884 + "cpu": [ 1885 + "x64" 1886 + ], 1887 + "license": "MPL-2.0", 1888 + "optional": true, 1889 + "os": [ 1890 + "win32" 1891 + ], 1892 + "engines": { 1893 + "node": ">= 10" 1894 + } 1895 + }, 1896 + "node_modules/@rollup/pluginutils": { 1897 + "version": "5.2.0", 1898 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", 1899 + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", 1900 + "license": "MIT", 1901 + "dependencies": { 1902 + "@types/estree": "^1.0.0", 1903 + "estree-walker": "^2.0.2", 1904 + "picomatch": "^4.0.2" 1905 + }, 1906 + "engines": { 1907 + "node": ">=14.0.0" 1908 + }, 1909 + "peerDependencies": { 1910 + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 1911 + }, 1912 + "peerDependenciesMeta": { 1913 + "rollup": { 1914 + "optional": true 1915 + } 1916 + } 1917 + }, 1918 + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { 1919 + "version": "2.0.2", 1920 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1921 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1922 + "license": "MIT" 1923 + }, 1924 + "node_modules/@rollup/rollup-android-arm-eabi": { 1925 + "version": "4.45.0", 1926 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz", 1927 + "integrity": "sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==", 1928 + "cpu": [ 1929 + "arm" 1930 + ], 1931 + "license": "MIT", 1932 + "optional": true, 1933 + "os": [ 1934 + "android" 1935 + ] 1936 + }, 1937 + "node_modules/@rollup/rollup-android-arm64": { 1938 + "version": "4.45.0", 1939 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz", 1940 + "integrity": "sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==", 1941 + "cpu": [ 1942 + "arm64" 1943 + ], 1944 + "license": "MIT", 1945 + "optional": true, 1946 + "os": [ 1947 + "android" 1948 + ] 1949 + }, 1950 + "node_modules/@rollup/rollup-darwin-arm64": { 1951 + "version": "4.45.0", 1952 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz", 1953 + "integrity": "sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==", 1954 + "cpu": [ 1955 + "arm64" 1956 + ], 1957 + "license": "MIT", 1958 + "optional": true, 1959 + "os": [ 1960 + "darwin" 1961 + ] 1962 + }, 1963 + "node_modules/@rollup/rollup-darwin-x64": { 1964 + "version": "4.45.0", 1965 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz", 1966 + "integrity": "sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==", 1967 + "cpu": [ 1968 + "x64" 1969 + ], 1970 + "license": "MIT", 1971 + "optional": true, 1972 + "os": [ 1973 + "darwin" 1974 + ] 1975 + }, 1976 + "node_modules/@rollup/rollup-freebsd-arm64": { 1977 + "version": "4.45.0", 1978 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz", 1979 + "integrity": "sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==", 1980 + "cpu": [ 1981 + "arm64" 1982 + ], 1983 + "license": "MIT", 1984 + "optional": true, 1985 + "os": [ 1986 + "freebsd" 1987 + ] 1988 + }, 1989 + "node_modules/@rollup/rollup-freebsd-x64": { 1990 + "version": "4.45.0", 1991 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz", 1992 + "integrity": "sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==", 1993 + "cpu": [ 1994 + "x64" 1995 + ], 1996 + "license": "MIT", 1997 + "optional": true, 1998 + "os": [ 1999 + "freebsd" 2000 + ] 2001 + }, 2002 + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 2003 + "version": "4.45.0", 2004 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz", 2005 + "integrity": "sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==", 2006 + "cpu": [ 2007 + "arm" 2008 + ], 2009 + "license": "MIT", 2010 + "optional": true, 2011 + "os": [ 2012 + "linux" 2013 + ] 2014 + }, 2015 + "node_modules/@rollup/rollup-linux-arm-musleabihf": { 2016 + "version": "4.45.0", 2017 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz", 2018 + "integrity": "sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==", 2019 + "cpu": [ 2020 + "arm" 2021 + ], 2022 + "license": "MIT", 2023 + "optional": true, 2024 + "os": [ 2025 + "linux" 2026 + ] 2027 + }, 2028 + "node_modules/@rollup/rollup-linux-arm64-gnu": { 2029 + "version": "4.45.0", 2030 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz", 2031 + "integrity": "sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==", 2032 + "cpu": [ 2033 + "arm64" 2034 + ], 2035 + "license": "MIT", 2036 + "optional": true, 2037 + "os": [ 2038 + "linux" 2039 + ] 2040 + }, 2041 + "node_modules/@rollup/rollup-linux-arm64-musl": { 2042 + "version": "4.45.0", 2043 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz", 2044 + "integrity": "sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==", 2045 + "cpu": [ 2046 + "arm64" 2047 + ], 2048 + "license": "MIT", 2049 + "optional": true, 2050 + "os": [ 2051 + "linux" 2052 + ] 2053 + }, 2054 + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 2055 + "version": "4.45.0", 2056 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz", 2057 + "integrity": "sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==", 2058 + "cpu": [ 2059 + "loong64" 2060 + ], 2061 + "license": "MIT", 2062 + "optional": true, 2063 + "os": [ 2064 + "linux" 2065 + ] 2066 + }, 2067 + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 2068 + "version": "4.45.0", 2069 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz", 2070 + "integrity": "sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==", 2071 + "cpu": [ 2072 + "ppc64" 2073 + ], 2074 + "license": "MIT", 2075 + "optional": true, 2076 + "os": [ 2077 + "linux" 2078 + ] 2079 + }, 2080 + "node_modules/@rollup/rollup-linux-riscv64-gnu": { 2081 + "version": "4.45.0", 2082 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz", 2083 + "integrity": "sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==", 2084 + "cpu": [ 2085 + "riscv64" 2086 + ], 2087 + "license": "MIT", 2088 + "optional": true, 2089 + "os": [ 2090 + "linux" 2091 + ] 2092 + }, 2093 + "node_modules/@rollup/rollup-linux-riscv64-musl": { 2094 + "version": "4.45.0", 2095 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz", 2096 + "integrity": "sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==", 2097 + "cpu": [ 2098 + "riscv64" 2099 + ], 2100 + "license": "MIT", 2101 + "optional": true, 2102 + "os": [ 2103 + "linux" 2104 + ] 2105 + }, 2106 + "node_modules/@rollup/rollup-linux-s390x-gnu": { 2107 + "version": "4.45.0", 2108 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz", 2109 + "integrity": "sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==", 2110 + "cpu": [ 2111 + "s390x" 2112 + ], 2113 + "license": "MIT", 2114 + "optional": true, 2115 + "os": [ 2116 + "linux" 2117 + ] 2118 + }, 2119 + "node_modules/@rollup/rollup-linux-x64-gnu": { 2120 + "version": "4.45.0", 2121 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz", 2122 + "integrity": "sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==", 2123 + "cpu": [ 2124 + "x64" 2125 + ], 2126 + "license": "MIT", 2127 + "optional": true, 2128 + "os": [ 2129 + "linux" 2130 + ] 2131 + }, 2132 + "node_modules/@rollup/rollup-linux-x64-musl": { 2133 + "version": "4.45.0", 2134 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz", 2135 + "integrity": "sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==", 2136 + "cpu": [ 2137 + "x64" 2138 + ], 2139 + "license": "MIT", 2140 + "optional": true, 2141 + "os": [ 2142 + "linux" 2143 + ] 2144 + }, 2145 + "node_modules/@rollup/rollup-win32-arm64-msvc": { 2146 + "version": "4.45.0", 2147 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz", 2148 + "integrity": "sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==", 2149 + "cpu": [ 2150 + "arm64" 2151 + ], 2152 + "license": "MIT", 2153 + "optional": true, 2154 + "os": [ 2155 + "win32" 2156 + ] 2157 + }, 2158 + "node_modules/@rollup/rollup-win32-ia32-msvc": { 2159 + "version": "4.45.0", 2160 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz", 2161 + "integrity": "sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==", 2162 + "cpu": [ 2163 + "ia32" 2164 + ], 2165 + "license": "MIT", 2166 + "optional": true, 2167 + "os": [ 2168 + "win32" 2169 + ] 2170 + }, 2171 + "node_modules/@rollup/rollup-win32-x64-msvc": { 2172 + "version": "4.45.0", 2173 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz", 2174 + "integrity": "sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==", 2175 + "cpu": [ 2176 + "x64" 2177 + ], 2178 + "license": "MIT", 2179 + "optional": true, 2180 + "os": [ 2181 + "win32" 2182 + ] 2183 + }, 2184 + "node_modules/@shikijs/core": { 2185 + "version": "3.14.0", 2186 + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.14.0.tgz", 2187 + "integrity": "sha512-qRSeuP5vlYHCNUIrpEBQFO7vSkR7jn7Kv+5X3FO/zBKVDGQbcnlScD3XhkrHi/R8Ltz0kEjvFR9Szp/XMRbFMw==", 2188 + "license": "MIT", 2189 + "dependencies": { 2190 + "@shikijs/types": "3.14.0", 2191 + "@shikijs/vscode-textmate": "^10.0.2", 2192 + "@types/hast": "^3.0.4", 2193 + "hast-util-to-html": "^9.0.5" 2194 + } 2195 + }, 2196 + "node_modules/@shikijs/engine-javascript": { 2197 + "version": "3.14.0", 2198 + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.14.0.tgz", 2199 + "integrity": "sha512-3v1kAXI2TsWQuwv86cREH/+FK9Pjw3dorVEykzQDhwrZj0lwsHYlfyARaKmn6vr5Gasf8aeVpb8JkzeWspxOLQ==", 2200 + "license": "MIT", 2201 + "dependencies": { 2202 + "@shikijs/types": "3.14.0", 2203 + "@shikijs/vscode-textmate": "^10.0.2", 2204 + "oniguruma-to-es": "^4.3.3" 2205 + } 2206 + }, 2207 + "node_modules/@shikijs/engine-oniguruma": { 2208 + "version": "3.14.0", 2209 + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.14.0.tgz", 2210 + "integrity": "sha512-TNcYTYMbJyy+ZjzWtt0bG5y4YyMIWC2nyePz+CFMWqm+HnZZyy9SWMgo8Z6KBJVIZnx8XUXS8U2afO6Y0g1Oug==", 2211 + "license": "MIT", 2212 + "dependencies": { 2213 + "@shikijs/types": "3.14.0", 2214 + "@shikijs/vscode-textmate": "^10.0.2" 2215 + } 2216 + }, 2217 + "node_modules/@shikijs/langs": { 2218 + "version": "3.14.0", 2219 + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.14.0.tgz", 2220 + "integrity": "sha512-DIB2EQY7yPX1/ZH7lMcwrK5pl+ZkP/xoSpUzg9YC8R+evRCCiSQ7yyrvEyBsMnfZq4eBzLzBlugMyTAf13+pzg==", 2221 + "license": "MIT", 2222 + "dependencies": { 2223 + "@shikijs/types": "3.14.0" 2224 + } 2225 + }, 2226 + "node_modules/@shikijs/themes": { 2227 + "version": "3.14.0", 2228 + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.14.0.tgz", 2229 + "integrity": "sha512-fAo/OnfWckNmv4uBoUu6dSlkcBc+SA1xzj5oUSaz5z3KqHtEbUypg/9xxgJARtM6+7RVm0Q6Xnty41xA1ma1IA==", 2230 + "license": "MIT", 2231 + "dependencies": { 2232 + "@shikijs/types": "3.14.0" 2233 + } 2234 + }, 2235 + "node_modules/@shikijs/types": { 2236 + "version": "3.14.0", 2237 + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.14.0.tgz", 2238 + "integrity": "sha512-bQGgC6vrY8U/9ObG1Z/vTro+uclbjjD/uG58RvfxKZVD5p9Yc1ka3tVyEFy7BNJLzxuWyHH5NWynP9zZZS59eQ==", 2239 + "license": "MIT", 2240 + "dependencies": { 2241 + "@shikijs/vscode-textmate": "^10.0.2", 2242 + "@types/hast": "^3.0.4" 2243 + } 2244 + }, 2245 + "node_modules/@shikijs/vscode-textmate": { 2246 + "version": "10.0.2", 2247 + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", 2248 + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", 2249 + "license": "MIT" 2250 + }, 2251 + "node_modules/@shuding/opentype.js": { 2252 + "version": "1.4.0-beta.0", 2253 + "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", 2254 + "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", 2255 + "license": "MIT", 2256 + "dependencies": { 2257 + "fflate": "^0.7.3", 2258 + "string.prototype.codepointat": "^0.2.1" 2259 + }, 2260 + "bin": { 2261 + "ot": "bin/ot" 2262 + }, 2263 + "engines": { 2264 + "node": ">= 8.0.0" 2265 + } 2266 + }, 2267 + "node_modules/@swc/helpers": { 2268 + "version": "0.5.17", 2269 + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", 2270 + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", 2271 + "license": "Apache-2.0", 2272 + "dependencies": { 2273 + "tslib": "^2.8.0" 2274 + } 2275 + }, 2276 + "node_modules/@tailwindcss/node": { 2277 + "version": "4.1.13", 2278 + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz", 2279 + "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==", 2280 + "license": "MIT", 2281 + "dependencies": { 2282 + "@jridgewell/remapping": "^2.3.4", 2283 + "enhanced-resolve": "^5.18.3", 2284 + "jiti": "^2.5.1", 2285 + "lightningcss": "1.30.1", 2286 + "magic-string": "^0.30.18", 2287 + "source-map-js": "^1.2.1", 2288 + "tailwindcss": "4.1.13" 2289 + } 2290 + }, 2291 + "node_modules/@tailwindcss/oxide": { 2292 + "version": "4.1.13", 2293 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz", 2294 + "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", 2295 + "hasInstallScript": true, 2296 + "license": "MIT", 2297 + "dependencies": { 2298 + "detect-libc": "^2.0.4", 2299 + "tar": "^7.4.3" 2300 + }, 2301 + "engines": { 2302 + "node": ">= 10" 2303 + }, 2304 + "optionalDependencies": { 2305 + "@tailwindcss/oxide-android-arm64": "4.1.13", 2306 + "@tailwindcss/oxide-darwin-arm64": "4.1.13", 2307 + "@tailwindcss/oxide-darwin-x64": "4.1.13", 2308 + "@tailwindcss/oxide-freebsd-x64": "4.1.13", 2309 + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", 2310 + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", 2311 + "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", 2312 + "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", 2313 + "@tailwindcss/oxide-linux-x64-musl": "4.1.13", 2314 + "@tailwindcss/oxide-wasm32-wasi": "4.1.13", 2315 + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", 2316 + "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" 2317 + } 2318 + }, 2319 + "node_modules/@tailwindcss/oxide-android-arm64": { 2320 + "version": "4.1.13", 2321 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz", 2322 + "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==", 2323 + "cpu": [ 2324 + "arm64" 2325 + ], 2326 + "license": "MIT", 2327 + "optional": true, 2328 + "os": [ 2329 + "android" 2330 + ], 2331 + "engines": { 2332 + "node": ">= 10" 2333 + } 2334 + }, 2335 + "node_modules/@tailwindcss/oxide-darwin-arm64": { 2336 + "version": "4.1.13", 2337 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz", 2338 + "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==", 2339 + "cpu": [ 2340 + "arm64" 2341 + ], 2342 + "license": "MIT", 2343 + "optional": true, 2344 + "os": [ 2345 + "darwin" 2346 + ], 2347 + "engines": { 2348 + "node": ">= 10" 2349 + } 2350 + }, 2351 + "node_modules/@tailwindcss/oxide-darwin-x64": { 2352 + "version": "4.1.13", 2353 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz", 2354 + "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==", 2355 + "cpu": [ 2356 + "x64" 2357 + ], 2358 + "license": "MIT", 2359 + "optional": true, 2360 + "os": [ 2361 + "darwin" 2362 + ], 2363 + "engines": { 2364 + "node": ">= 10" 2365 + } 2366 + }, 2367 + "node_modules/@tailwindcss/oxide-freebsd-x64": { 2368 + "version": "4.1.13", 2369 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz", 2370 + "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==", 2371 + "cpu": [ 2372 + "x64" 2373 + ], 2374 + "license": "MIT", 2375 + "optional": true, 2376 + "os": [ 2377 + "freebsd" 2378 + ], 2379 + "engines": { 2380 + "node": ">= 10" 2381 + } 2382 + }, 2383 + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 2384 + "version": "4.1.13", 2385 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz", 2386 + "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==", 2387 + "cpu": [ 2388 + "arm" 2389 + ], 2390 + "license": "MIT", 2391 + "optional": true, 2392 + "os": [ 2393 + "linux" 2394 + ], 2395 + "engines": { 2396 + "node": ">= 10" 2397 + } 2398 + }, 2399 + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 2400 + "version": "4.1.13", 2401 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz", 2402 + "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==", 2403 + "cpu": [ 2404 + "arm64" 2405 + ], 2406 + "license": "MIT", 2407 + "optional": true, 2408 + "os": [ 2409 + "linux" 2410 + ], 2411 + "engines": { 2412 + "node": ">= 10" 2413 + } 2414 + }, 2415 + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 2416 + "version": "4.1.13", 2417 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz", 2418 + "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==", 2419 + "cpu": [ 2420 + "arm64" 2421 + ], 2422 + "license": "MIT", 2423 + "optional": true, 2424 + "os": [ 2425 + "linux" 2426 + ], 2427 + "engines": { 2428 + "node": ">= 10" 2429 + } 2430 + }, 2431 + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 2432 + "version": "4.1.13", 2433 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz", 2434 + "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==", 2435 + "cpu": [ 2436 + "x64" 2437 + ], 2438 + "license": "MIT", 2439 + "optional": true, 2440 + "os": [ 2441 + "linux" 2442 + ], 2443 + "engines": { 2444 + "node": ">= 10" 2445 + } 2446 + }, 2447 + "node_modules/@tailwindcss/oxide-linux-x64-musl": { 2448 + "version": "4.1.13", 2449 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz", 2450 + "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==", 2451 + "cpu": [ 2452 + "x64" 2453 + ], 2454 + "license": "MIT", 2455 + "optional": true, 2456 + "os": [ 2457 + "linux" 2458 + ], 2459 + "engines": { 2460 + "node": ">= 10" 2461 + } 2462 + }, 2463 + "node_modules/@tailwindcss/oxide-wasm32-wasi": { 2464 + "version": "4.1.13", 2465 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz", 2466 + "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==", 2467 + "bundleDependencies": [ 2468 + "@napi-rs/wasm-runtime", 2469 + "@emnapi/core", 2470 + "@emnapi/runtime", 2471 + "@tybys/wasm-util", 2472 + "@emnapi/wasi-threads", 2473 + "tslib" 2474 + ], 2475 + "cpu": [ 2476 + "wasm32" 2477 + ], 2478 + "license": "MIT", 2479 + "optional": true, 2480 + "dependencies": { 2481 + "@emnapi/core": "^1.4.5", 2482 + "@emnapi/runtime": "^1.4.5", 2483 + "@emnapi/wasi-threads": "^1.0.4", 2484 + "@napi-rs/wasm-runtime": "^0.2.12", 2485 + "@tybys/wasm-util": "^0.10.0", 2486 + "tslib": "^2.8.0" 2487 + }, 2488 + "engines": { 2489 + "node": ">=14.0.0" 2490 + } 2491 + }, 2492 + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 2493 + "version": "4.1.13", 2494 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz", 2495 + "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==", 2496 + "cpu": [ 2497 + "arm64" 2498 + ], 2499 + "license": "MIT", 2500 + "optional": true, 2501 + "os": [ 2502 + "win32" 2503 + ], 2504 + "engines": { 2505 + "node": ">= 10" 2506 + } 2507 + }, 2508 + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 2509 + "version": "4.1.13", 2510 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz", 2511 + "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", 2512 + "cpu": [ 2513 + "x64" 2514 + ], 2515 + "license": "MIT", 2516 + "optional": true, 2517 + "os": [ 2518 + "win32" 2519 + ], 2520 + "engines": { 2521 + "node": ">= 10" 2522 + } 2523 + }, 2524 + "node_modules/@tailwindcss/vite": { 2525 + "version": "4.1.13", 2526 + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.13.tgz", 2527 + "integrity": "sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==", 2528 + "license": "MIT", 2529 + "dependencies": { 2530 + "@tailwindcss/node": "4.1.13", 2531 + "@tailwindcss/oxide": "4.1.13", 2532 + "tailwindcss": "4.1.13" 2533 + }, 2534 + "peerDependencies": { 2535 + "vite": "^5.2.0 || ^6 || ^7" 2536 + } 2537 + }, 2538 + "node_modules/@types/debug": { 2539 + "version": "4.1.12", 2540 + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", 2541 + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", 2542 + "license": "MIT", 2543 + "dependencies": { 2544 + "@types/ms": "*" 2545 + } 2546 + }, 2547 + "node_modules/@types/estree": { 2548 + "version": "1.0.8", 2549 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 2550 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 2551 + "license": "MIT" 2552 + }, 2553 + "node_modules/@types/estree-jsx": { 2554 + "version": "1.0.5", 2555 + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", 2556 + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", 2557 + "license": "MIT", 2558 + "dependencies": { 2559 + "@types/estree": "*" 2560 + } 2561 + }, 2562 + "node_modules/@types/fontkit": { 2563 + "version": "2.0.8", 2564 + "resolved": "https://registry.npmjs.org/@types/fontkit/-/fontkit-2.0.8.tgz", 2565 + "integrity": "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==", 2566 + "license": "MIT", 2567 + "dependencies": { 2568 + "@types/node": "*" 2569 + } 2570 + }, 2571 + "node_modules/@types/hast": { 2572 + "version": "3.0.4", 2573 + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", 2574 + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", 2575 + "license": "MIT", 2576 + "dependencies": { 2577 + "@types/unist": "*" 2578 + } 2579 + }, 2580 + "node_modules/@types/katex": { 2581 + "version": "0.16.7", 2582 + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", 2583 + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", 2584 + "license": "MIT" 2585 + }, 2586 + "node_modules/@types/linkify-it": { 2587 + "version": "5.0.0", 2588 + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", 2589 + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", 2590 + "dev": true, 2591 + "license": "MIT" 2592 + }, 2593 + "node_modules/@types/markdown-it": { 2594 + "version": "14.1.2", 2595 + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", 2596 + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", 2597 + "dev": true, 2598 + "license": "MIT", 2599 + "dependencies": { 2600 + "@types/linkify-it": "^5", 2601 + "@types/mdurl": "^2" 2602 + } 2603 + }, 2604 + "node_modules/@types/mdast": { 2605 + "version": "4.0.4", 2606 + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", 2607 + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", 2608 + "license": "MIT", 2609 + "dependencies": { 2610 + "@types/unist": "*" 2611 + } 2612 + }, 2613 + "node_modules/@types/mdurl": { 2614 + "version": "2.0.0", 2615 + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", 2616 + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", 2617 + "dev": true, 2618 + "license": "MIT" 2619 + }, 2620 + "node_modules/@types/mdx": { 2621 + "version": "2.0.13", 2622 + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", 2623 + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", 2624 + "license": "MIT" 2625 + }, 2626 + "node_modules/@types/ms": { 2627 + "version": "2.1.0", 2628 + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", 2629 + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", 2630 + "license": "MIT" 2631 + }, 2632 + "node_modules/@types/nlcst": { 2633 + "version": "2.0.3", 2634 + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", 2635 + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", 2636 + "license": "MIT", 2637 + "dependencies": { 2638 + "@types/unist": "*" 2639 + } 2640 + }, 2641 + "node_modules/@types/node": { 2642 + "version": "24.0.13", 2643 + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.13.tgz", 2644 + "integrity": "sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==", 2645 + "license": "MIT", 2646 + "dependencies": { 2647 + "undici-types": "~7.8.0" 2648 + } 2649 + }, 2650 + "node_modules/@types/react": { 2651 + "version": "19.1.12", 2652 + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", 2653 + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", 2654 + "license": "MIT", 2655 + "dependencies": { 2656 + "csstype": "^3.0.2" 2657 + } 2658 + }, 2659 + "node_modules/@types/react-dom": { 2660 + "version": "19.1.9", 2661 + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", 2662 + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", 2663 + "license": "MIT", 2664 + "peerDependencies": { 2665 + "@types/react": "^19.0.0" 2666 + } 2667 + }, 2668 + "node_modules/@types/sanitize-html": { 2669 + "version": "2.16.0", 2670 + "resolved": "https://registry.npmjs.org/@types/sanitize-html/-/sanitize-html-2.16.0.tgz", 2671 + "integrity": "sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==", 2672 + "dev": true, 2673 + "license": "MIT", 2674 + "dependencies": { 2675 + "htmlparser2": "^8.0.0" 2676 + } 2677 + }, 2678 + "node_modules/@types/sanitize-html/node_modules/htmlparser2": { 2679 + "version": "8.0.2", 2680 + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", 2681 + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 2682 + "dev": true, 2683 + "funding": [ 2684 + "https://github.com/fb55/htmlparser2?sponsor=1", 2685 + { 2686 + "type": "github", 2687 + "url": "https://github.com/sponsors/fb55" 2688 + } 2689 + ], 2690 + "license": "MIT", 2691 + "dependencies": { 2692 + "domelementtype": "^2.3.0", 2693 + "domhandler": "^5.0.3", 2694 + "domutils": "^3.0.1", 2695 + "entities": "^4.4.0" 2696 + } 2697 + }, 2698 + "node_modules/@types/sax": { 2699 + "version": "1.2.7", 2700 + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", 2701 + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", 2702 + "license": "MIT", 2703 + "dependencies": { 2704 + "@types/node": "*" 2705 + } 2706 + }, 2707 + "node_modules/@types/unist": { 2708 + "version": "3.0.3", 2709 + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", 2710 + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", 2711 + "license": "MIT" 2712 + }, 2713 + "node_modules/@ungap/structured-clone": { 2714 + "version": "1.3.0", 2715 + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", 2716 + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", 2717 + "license": "ISC" 2718 + }, 2719 + "node_modules/@volar/language-core": { 2720 + "version": "2.4.18", 2721 + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.18.tgz", 2722 + "integrity": "sha512-G3yYV85ekH4TV0EDS6DsS/dUJWrz675H9UgsxFz5pQbmas51a0Q2fF6Lb2q4RKgytuLZ4E0MBdT5PlVsJXNalw==", 2723 + "license": "MIT", 2724 + "dependencies": { 2725 + "@volar/source-map": "2.4.18" 2726 + } 2727 + }, 2728 + "node_modules/@volar/source-map": { 2729 + "version": "2.4.18", 2730 + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.18.tgz", 2731 + "integrity": "sha512-zaj2V/zo/CHQ/xA75h60jBPgrz+Ou9s6aPl7dX0rT46/uill9aB/ZaDk92ROpJsa/9e2xftCeNAU9ZwVyB/egQ==", 2732 + "license": "MIT" 2733 + }, 2734 + "node_modules/@volar/typescript": { 2735 + "version": "2.4.18", 2736 + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.18.tgz", 2737 + "integrity": "sha512-xcbsMG8m/yhvO1VIKnTtc+llZxw3YtWkZiV7/F1qNpTORdPExkZRcBxJ5d19MXLpkeiQ+DG5JURHh1SV0bcWRA==", 2738 + "license": "MIT", 2739 + "dependencies": { 2740 + "@volar/language-core": "2.4.18", 2741 + "path-browserify": "^1.0.1", 2742 + "vscode-uri": "^3.0.8" 2743 + } 2744 + }, 2745 + "node_modules/acorn": { 2746 + "version": "8.15.0", 2747 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 2748 + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 2749 + "license": "MIT", 2750 + "bin": { 2751 + "acorn": "bin/acorn" 2752 + }, 2753 + "engines": { 2754 + "node": ">=0.4.0" 2755 + } 2756 + }, 2757 + "node_modules/acorn-jsx": { 2758 + "version": "5.3.2", 2759 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 2760 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 2761 + "license": "MIT", 2762 + "peerDependencies": { 2763 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 2764 + } 2765 + }, 2766 + "node_modules/ansi-align": { 2767 + "version": "3.0.1", 2768 + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", 2769 + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", 2770 + "license": "ISC", 2771 + "dependencies": { 2772 + "string-width": "^4.1.0" 2773 + } 2774 + }, 2775 + "node_modules/ansi-align/node_modules/ansi-regex": { 2776 + "version": "5.0.1", 2777 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2778 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2779 + "license": "MIT", 2780 + "engines": { 2781 + "node": ">=8" 2782 + } 2783 + }, 2784 + "node_modules/ansi-align/node_modules/emoji-regex": { 2785 + "version": "8.0.0", 2786 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2787 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2788 + "license": "MIT" 2789 + }, 2790 + "node_modules/ansi-align/node_modules/string-width": { 2791 + "version": "4.2.3", 2792 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2793 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2794 + "license": "MIT", 2795 + "dependencies": { 2796 + "emoji-regex": "^8.0.0", 2797 + "is-fullwidth-code-point": "^3.0.0", 2798 + "strip-ansi": "^6.0.1" 2799 + }, 2800 + "engines": { 2801 + "node": ">=8" 2802 + } 2803 + }, 2804 + "node_modules/ansi-align/node_modules/strip-ansi": { 2805 + "version": "6.0.1", 2806 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2807 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2808 + "license": "MIT", 2809 + "dependencies": { 2810 + "ansi-regex": "^5.0.1" 2811 + }, 2812 + "engines": { 2813 + "node": ">=8" 2814 + } 2815 + }, 2816 + "node_modules/ansi-regex": { 2817 + "version": "6.1.0", 2818 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 2819 + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 2820 + "license": "MIT", 2821 + "engines": { 2822 + "node": ">=12" 2823 + }, 2824 + "funding": { 2825 + "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2826 + } 2827 + }, 2828 + "node_modules/ansi-styles": { 2829 + "version": "6.2.1", 2830 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 2831 + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 2832 + "license": "MIT", 2833 + "engines": { 2834 + "node": ">=12" 2835 + }, 2836 + "funding": { 2837 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2838 + } 2839 + }, 2840 + "node_modules/anymatch": { 2841 + "version": "3.1.3", 2842 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 2843 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 2844 + "license": "ISC", 2845 + "dependencies": { 2846 + "normalize-path": "^3.0.0", 2847 + "picomatch": "^2.0.4" 2848 + }, 2849 + "engines": { 2850 + "node": ">= 8" 2851 + } 2852 + }, 2853 + "node_modules/anymatch/node_modules/picomatch": { 2854 + "version": "2.3.1", 2855 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2856 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2857 + "license": "MIT", 2858 + "engines": { 2859 + "node": ">=8.6" 2860 + }, 2861 + "funding": { 2862 + "url": "https://github.com/sponsors/jonschlinkert" 2863 + } 2864 + }, 2865 + "node_modules/arg": { 2866 + "version": "5.0.2", 2867 + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 2868 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 2869 + "license": "MIT" 2870 + }, 2871 + "node_modules/argparse": { 2872 + "version": "2.0.1", 2873 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2874 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 2875 + "license": "Python-2.0" 2876 + }, 2877 + "node_modules/aria-query": { 2878 + "version": "5.3.2", 2879 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", 2880 + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", 2881 + "license": "Apache-2.0", 2882 + "engines": { 2883 + "node": ">= 0.4" 2884 + } 2885 + }, 2886 + "node_modules/array-iterate": { 2887 + "version": "2.0.1", 2888 + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", 2889 + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", 2890 + "license": "MIT", 2891 + "funding": { 2892 + "type": "github", 2893 + "url": "https://github.com/sponsors/wooorm" 2894 + } 2895 + }, 2896 + "node_modules/astring": { 2897 + "version": "1.9.0", 2898 + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", 2899 + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", 2900 + "license": "MIT", 2901 + "bin": { 2902 + "astring": "bin/astring" 2903 + } 2904 + }, 2905 + "node_modules/astro": { 2906 + "version": "5.13.5", 2907 + "resolved": "https://registry.npmjs.org/astro/-/astro-5.13.5.tgz", 2908 + "integrity": "sha512-XmBzkl13XU97+n/QiOM5uXQdAVe0yKt5gO+Wlgc8dHRwHR499qhMQ5sMFckLJweUINLzcNGjP3F5nG4wV8a2XA==", 2909 + "license": "MIT", 2910 + "dependencies": { 2911 + "@astrojs/compiler": "^2.12.2", 2912 + "@astrojs/internal-helpers": "0.7.2", 2913 + "@astrojs/markdown-remark": "6.3.6", 2914 + "@astrojs/telemetry": "3.3.0", 2915 + "@capsizecss/unpack": "^2.4.0", 2916 + "@oslojs/encoding": "^1.1.0", 2917 + "@rollup/pluginutils": "^5.1.4", 2918 + "acorn": "^8.14.1", 2919 + "aria-query": "^5.3.2", 2920 + "axobject-query": "^4.1.0", 2921 + "boxen": "8.0.1", 2922 + "ci-info": "^4.2.0", 2923 + "clsx": "^2.1.1", 2924 + "common-ancestor-path": "^1.0.1", 2925 + "cookie": "^1.0.2", 2926 + "cssesc": "^3.0.0", 2927 + "debug": "^4.4.0", 2928 + "deterministic-object-hash": "^2.0.2", 2929 + "devalue": "^5.1.1", 2930 + "diff": "^5.2.0", 2931 + "dlv": "^1.1.3", 2932 + "dset": "^3.1.4", 2933 + "es-module-lexer": "^1.6.0", 2934 + "esbuild": "^0.25.0", 2935 + "estree-walker": "^3.0.3", 2936 + "flattie": "^1.1.1", 2937 + "fontace": "~0.3.0", 2938 + "github-slugger": "^2.0.0", 2939 + "html-escaper": "3.0.3", 2940 + "http-cache-semantics": "^4.1.1", 2941 + "import-meta-resolve": "^4.1.0", 2942 + "js-yaml": "^4.1.0", 2943 + "kleur": "^4.1.5", 2944 + "magic-string": "^0.30.17", 2945 + "magicast": "^0.3.5", 2946 + "mrmime": "^2.0.1", 2947 + "neotraverse": "^0.6.18", 2948 + "p-limit": "^6.2.0", 2949 + "p-queue": "^8.1.0", 2950 + "package-manager-detector": "^1.1.0", 2951 + "picomatch": "^4.0.2", 2952 + "prompts": "^2.4.2", 2953 + "rehype": "^13.0.2", 2954 + "semver": "^7.7.1", 2955 + "shiki": "^3.2.1", 2956 + "smol-toml": "^1.3.4", 2957 + "tinyexec": "^0.3.2", 2958 + "tinyglobby": "^0.2.12", 2959 + "tsconfck": "^3.1.5", 2960 + "ultrahtml": "^1.6.0", 2961 + "unifont": "~0.5.0", 2962 + "unist-util-visit": "^5.0.0", 2963 + "unstorage": "^1.15.0", 2964 + "vfile": "^6.0.3", 2965 + "vite": "^6.3.4", 2966 + "vitefu": "^1.0.6", 2967 + "xxhash-wasm": "^1.1.0", 2968 + "yargs-parser": "^21.1.1", 2969 + "yocto-spinner": "^0.2.1", 2970 + "zod": "^3.24.4", 2971 + "zod-to-json-schema": "^3.24.5", 2972 + "zod-to-ts": "^1.2.0" 2973 + }, 2974 + "bin": { 2975 + "astro": "astro.js" 2976 + }, 2977 + "engines": { 2978 + "node": "18.20.8 || ^20.3.0 || >=22.0.0", 2979 + "npm": ">=9.6.5", 2980 + "pnpm": ">=7.1.0" 2981 + }, 2982 + "funding": { 2983 + "type": "opencollective", 2984 + "url": "https://opencollective.com/astrodotbuild" 2985 + }, 2986 + "optionalDependencies": { 2987 + "sharp": "^0.33.3" 2988 + } 2989 + }, 2990 + "node_modules/astro-expressive-code": { 2991 + "version": "0.41.3", 2992 + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.3.tgz", 2993 + "integrity": "sha512-u+zHMqo/QNLE2eqYRCrK3+XMlKakv33Bzuz+56V1gs8H0y6TZ0hIi3VNbIxeTn51NLn+mJfUV/A0kMNfE4rANw==", 2994 + "license": "MIT", 2995 + "dependencies": { 2996 + "rehype-expressive-code": "^0.41.3" 2997 + }, 2998 + "peerDependencies": { 2999 + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0" 3000 + } 3001 + }, 3002 + "node_modules/astro/node_modules/vite": { 3003 + "version": "6.3.5", 3004 + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", 3005 + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", 3006 + "license": "MIT", 3007 + "dependencies": { 3008 + "esbuild": "^0.25.0", 3009 + "fdir": "^6.4.4", 3010 + "picomatch": "^4.0.2", 3011 + "postcss": "^8.5.3", 3012 + "rollup": "^4.34.9", 3013 + "tinyglobby": "^0.2.13" 3014 + }, 3015 + "bin": { 3016 + "vite": "bin/vite.js" 3017 + }, 3018 + "engines": { 3019 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3020 + }, 3021 + "funding": { 3022 + "url": "https://github.com/vitejs/vite?sponsor=1" 3023 + }, 3024 + "optionalDependencies": { 3025 + "fsevents": "~2.3.3" 3026 + }, 3027 + "peerDependencies": { 3028 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 3029 + "jiti": ">=1.21.0", 3030 + "less": "*", 3031 + "lightningcss": "^1.21.0", 3032 + "sass": "*", 3033 + "sass-embedded": "*", 3034 + "stylus": "*", 3035 + "sugarss": "*", 3036 + "terser": "^5.16.0", 3037 + "tsx": "^4.8.1", 3038 + "yaml": "^2.4.2" 3039 + }, 3040 + "peerDependenciesMeta": { 3041 + "@types/node": { 3042 + "optional": true 3043 + }, 3044 + "jiti": { 3045 + "optional": true 3046 + }, 3047 + "less": { 3048 + "optional": true 3049 + }, 3050 + "lightningcss": { 3051 + "optional": true 3052 + }, 3053 + "sass": { 3054 + "optional": true 3055 + }, 3056 + "sass-embedded": { 3057 + "optional": true 3058 + }, 3059 + "stylus": { 3060 + "optional": true 3061 + }, 3062 + "sugarss": { 3063 + "optional": true 3064 + }, 3065 + "terser": { 3066 + "optional": true 3067 + }, 3068 + "tsx": { 3069 + "optional": true 3070 + }, 3071 + "yaml": { 3072 + "optional": true 3073 + } 3074 + } 3075 + }, 3076 + "node_modules/axobject-query": { 3077 + "version": "4.1.0", 3078 + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", 3079 + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", 3080 + "license": "Apache-2.0", 3081 + "engines": { 3082 + "node": ">= 0.4" 3083 + } 3084 + }, 3085 + "node_modules/bail": { 3086 + "version": "2.0.2", 3087 + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", 3088 + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", 3089 + "license": "MIT", 3090 + "funding": { 3091 + "type": "github", 3092 + "url": "https://github.com/sponsors/wooorm" 3093 + } 3094 + }, 3095 + "node_modules/base-64": { 3096 + "version": "1.0.0", 3097 + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", 3098 + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", 3099 + "license": "MIT" 3100 + }, 3101 + "node_modules/base64-js": { 3102 + "version": "1.5.1", 3103 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 3104 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 3105 + "funding": [ 3106 + { 3107 + "type": "github", 3108 + "url": "https://github.com/sponsors/feross" 3109 + }, 3110 + { 3111 + "type": "patreon", 3112 + "url": "https://www.patreon.com/feross" 3113 + }, 3114 + { 3115 + "type": "consulting", 3116 + "url": "https://feross.org/support" 3117 + } 3118 + ], 3119 + "license": "MIT" 3120 + }, 3121 + "node_modules/bcp-47-match": { 3122 + "version": "2.0.3", 3123 + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", 3124 + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", 3125 + "license": "MIT", 3126 + "funding": { 3127 + "type": "github", 3128 + "url": "https://github.com/sponsors/wooorm" 3129 + } 3130 + }, 3131 + "node_modules/blob-to-buffer": { 3132 + "version": "1.2.9", 3133 + "resolved": "https://registry.npmjs.org/blob-to-buffer/-/blob-to-buffer-1.2.9.tgz", 3134 + "integrity": "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==", 3135 + "funding": [ 3136 + { 3137 + "type": "github", 3138 + "url": "https://github.com/sponsors/feross" 3139 + }, 3140 + { 3141 + "type": "patreon", 3142 + "url": "https://www.patreon.com/feross" 3143 + }, 3144 + { 3145 + "type": "consulting", 3146 + "url": "https://feross.org/support" 3147 + } 3148 + ], 3149 + "license": "MIT" 3150 + }, 3151 + "node_modules/boolbase": { 3152 + "version": "1.0.0", 3153 + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 3154 + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 3155 + "license": "ISC" 3156 + }, 3157 + "node_modules/boxen": { 3158 + "version": "8.0.1", 3159 + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", 3160 + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", 3161 + "license": "MIT", 3162 + "dependencies": { 3163 + "ansi-align": "^3.0.1", 3164 + "camelcase": "^8.0.0", 3165 + "chalk": "^5.3.0", 3166 + "cli-boxes": "^3.0.0", 3167 + "string-width": "^7.2.0", 3168 + "type-fest": "^4.21.0", 3169 + "widest-line": "^5.0.0", 3170 + "wrap-ansi": "^9.0.0" 3171 + }, 3172 + "engines": { 3173 + "node": ">=18" 3174 + }, 3175 + "funding": { 3176 + "url": "https://github.com/sponsors/sindresorhus" 3177 + } 3178 + }, 3179 + "node_modules/braces": { 3180 + "version": "3.0.3", 3181 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 3182 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 3183 + "dev": true, 3184 + "license": "MIT", 3185 + "optional": true, 3186 + "dependencies": { 3187 + "fill-range": "^7.1.1" 3188 + }, 3189 + "engines": { 3190 + "node": ">=8" 3191 + } 3192 + }, 3193 + "node_modules/brotli": { 3194 + "version": "1.3.3", 3195 + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", 3196 + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", 3197 + "license": "MIT", 3198 + "dependencies": { 3199 + "base64-js": "^1.1.2" 3200 + } 3201 + }, 3202 + "node_modules/buffer-builder": { 3203 + "version": "0.2.0", 3204 + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", 3205 + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", 3206 + "devOptional": true, 3207 + "license": "MIT/X11" 3208 + }, 3209 + "node_modules/camelcase": { 3210 + "version": "8.0.0", 3211 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", 3212 + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", 3213 + "license": "MIT", 3214 + "engines": { 3215 + "node": ">=16" 3216 + }, 3217 + "funding": { 3218 + "url": "https://github.com/sponsors/sindresorhus" 3219 + } 3220 + }, 3221 + "node_modules/camelize": { 3222 + "version": "1.0.1", 3223 + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", 3224 + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", 3225 + "license": "MIT", 3226 + "funding": { 3227 + "url": "https://github.com/sponsors/ljharb" 3228 + } 3229 + }, 3230 + "node_modules/ccount": { 3231 + "version": "2.0.1", 3232 + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", 3233 + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", 3234 + "license": "MIT", 3235 + "funding": { 3236 + "type": "github", 3237 + "url": "https://github.com/sponsors/wooorm" 3238 + } 3239 + }, 3240 + "node_modules/chalk": { 3241 + "version": "5.4.1", 3242 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", 3243 + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", 3244 + "license": "MIT", 3245 + "engines": { 3246 + "node": "^12.17.0 || ^14.13 || >=16.0.0" 3247 + }, 3248 + "funding": { 3249 + "url": "https://github.com/chalk/chalk?sponsor=1" 3250 + } 3251 + }, 3252 + "node_modules/character-entities": { 3253 + "version": "2.0.2", 3254 + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", 3255 + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", 3256 + "license": "MIT", 3257 + "funding": { 3258 + "type": "github", 3259 + "url": "https://github.com/sponsors/wooorm" 3260 + } 3261 + }, 3262 + "node_modules/character-entities-html4": { 3263 + "version": "2.1.0", 3264 + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", 3265 + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", 3266 + "license": "MIT", 3267 + "funding": { 3268 + "type": "github", 3269 + "url": "https://github.com/sponsors/wooorm" 3270 + } 3271 + }, 3272 + "node_modules/character-entities-legacy": { 3273 + "version": "3.0.0", 3274 + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", 3275 + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", 3276 + "license": "MIT", 3277 + "funding": { 3278 + "type": "github", 3279 + "url": "https://github.com/sponsors/wooorm" 3280 + } 3281 + }, 3282 + "node_modules/character-reference-invalid": { 3283 + "version": "2.0.1", 3284 + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", 3285 + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", 3286 + "license": "MIT", 3287 + "funding": { 3288 + "type": "github", 3289 + "url": "https://github.com/sponsors/wooorm" 3290 + } 3291 + }, 3292 + "node_modules/chokidar": { 3293 + "version": "4.0.3", 3294 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 3295 + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 3296 + "license": "MIT", 3297 + "dependencies": { 3298 + "readdirp": "^4.0.1" 3299 + }, 3300 + "engines": { 3301 + "node": ">= 14.16.0" 3302 + }, 3303 + "funding": { 3304 + "url": "https://paulmillr.com/funding/" 3305 + } 3306 + }, 3307 + "node_modules/chownr": { 3308 + "version": "3.0.0", 3309 + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", 3310 + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", 3311 + "license": "BlueOak-1.0.0", 3312 + "engines": { 3313 + "node": ">=18" 3314 + } 3315 + }, 3316 + "node_modules/ci-info": { 3317 + "version": "4.3.0", 3318 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", 3319 + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", 3320 + "funding": [ 3321 + { 3322 + "type": "github", 3323 + "url": "https://github.com/sponsors/sibiraj-s" 3324 + } 3325 + ], 3326 + "license": "MIT", 3327 + "engines": { 3328 + "node": ">=8" 3329 + } 3330 + }, 3331 + "node_modules/cli-boxes": { 3332 + "version": "3.0.0", 3333 + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", 3334 + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", 3335 + "license": "MIT", 3336 + "engines": { 3337 + "node": ">=10" 3338 + }, 3339 + "funding": { 3340 + "url": "https://github.com/sponsors/sindresorhus" 3341 + } 3342 + }, 3343 + "node_modules/clone": { 3344 + "version": "2.1.2", 3345 + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 3346 + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", 3347 + "license": "MIT", 3348 + "engines": { 3349 + "node": ">=0.8" 3350 + } 3351 + }, 3352 + "node_modules/clsx": { 3353 + "version": "2.1.1", 3354 + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 3355 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 3356 + "license": "MIT", 3357 + "engines": { 3358 + "node": ">=6" 3359 + } 3360 + }, 3361 + "node_modules/collapse-white-space": { 3362 + "version": "2.1.0", 3363 + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", 3364 + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", 3365 + "license": "MIT", 3366 + "funding": { 3367 + "type": "github", 3368 + "url": "https://github.com/sponsors/wooorm" 3369 + } 3370 + }, 3371 + "node_modules/color": { 3372 + "version": "5.0.0", 3373 + "resolved": "https://registry.npmjs.org/color/-/color-5.0.0.tgz", 3374 + "integrity": "sha512-16BlyiuyLq3MLxpRWyOTiWsO3ii/eLQLJUQXBSNcxMBBSnyt1ee9YUdaozQp03ifwm5woztEZGDbk9RGVuCsdw==", 3375 + "license": "MIT", 3376 + "dependencies": { 3377 + "color-convert": "^3.0.1", 3378 + "color-string": "^2.0.0" 3379 + }, 3380 + "engines": { 3381 + "node": ">=18" 3382 + } 3383 + }, 3384 + "node_modules/color-convert": { 3385 + "version": "3.1.0", 3386 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.0.tgz", 3387 + "integrity": "sha512-TVoqAq8ZDIpK5lsQY874DDnu65CSsc9vzq0wLpNQ6UMBq81GSZocVazPiBbYGzngzBOIRahpkTzCLVe2at4MfA==", 3388 + "license": "MIT", 3389 + "dependencies": { 3390 + "color-name": "^2.0.0" 3391 + }, 3392 + "engines": { 3393 + "node": ">=14.6" 3394 + } 3395 + }, 3396 + "node_modules/color-convert/node_modules/color-name": { 3397 + "version": "2.0.0", 3398 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.0.tgz", 3399 + "integrity": "sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==", 3400 + "license": "MIT", 3401 + "engines": { 3402 + "node": ">=12.20" 3403 + } 3404 + }, 3405 + "node_modules/color-name": { 3406 + "version": "1.1.4", 3407 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3408 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3409 + "license": "MIT" 3410 + }, 3411 + "node_modules/color-string": { 3412 + "version": "2.0.1", 3413 + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.0.1.tgz", 3414 + "integrity": "sha512-5z9FbYTZPAo8iKsNEqRNv+OlpBbDcoE+SY9GjLfDUHEfcNNV7tS9eSAlFHEaub/r5tBL9LtskAeq1l9SaoZ5tQ==", 3415 + "license": "MIT", 3416 + "dependencies": { 3417 + "color-name": "^2.0.0" 3418 + }, 3419 + "engines": { 3420 + "node": ">=18" 3421 + } 3422 + }, 3423 + "node_modules/color-string/node_modules/color-name": { 3424 + "version": "2.0.0", 3425 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.0.tgz", 3426 + "integrity": "sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==", 3427 + "license": "MIT", 3428 + "engines": { 3429 + "node": ">=12.20" 3430 + } 3431 + }, 3432 + "node_modules/colorjs.io": { 3433 + "version": "0.5.2", 3434 + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", 3435 + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", 3436 + "devOptional": true, 3437 + "license": "MIT" 3438 + }, 3439 + "node_modules/comma-separated-tokens": { 3440 + "version": "2.0.3", 3441 + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", 3442 + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", 3443 + "license": "MIT", 3444 + "funding": { 3445 + "type": "github", 3446 + "url": "https://github.com/sponsors/wooorm" 3447 + } 3448 + }, 3449 + "node_modules/common-ancestor-path": { 3450 + "version": "1.0.1", 3451 + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", 3452 + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", 3453 + "license": "ISC" 3454 + }, 3455 + "node_modules/cookie": { 3456 + "version": "1.0.2", 3457 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", 3458 + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", 3459 + "license": "MIT", 3460 + "engines": { 3461 + "node": ">=18" 3462 + } 3463 + }, 3464 + "node_modules/cookie-es": { 3465 + "version": "1.2.2", 3466 + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", 3467 + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", 3468 + "license": "MIT" 3469 + }, 3470 + "node_modules/cross-fetch": { 3471 + "version": "3.2.0", 3472 + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", 3473 + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", 3474 + "license": "MIT", 3475 + "dependencies": { 3476 + "node-fetch": "^2.7.0" 3477 + } 3478 + }, 3479 + "node_modules/crossws": { 3480 + "version": "0.3.5", 3481 + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", 3482 + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", 3483 + "license": "MIT", 3484 + "dependencies": { 3485 + "uncrypto": "^0.1.3" 3486 + } 3487 + }, 3488 + "node_modules/css-background-parser": { 3489 + "version": "0.1.0", 3490 + "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", 3491 + "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", 3492 + "license": "MIT" 3493 + }, 3494 + "node_modules/css-box-shadow": { 3495 + "version": "1.0.0-3", 3496 + "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", 3497 + "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", 3498 + "license": "MIT" 3499 + }, 3500 + "node_modules/css-color-keywords": { 3501 + "version": "1.0.0", 3502 + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", 3503 + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", 3504 + "license": "ISC", 3505 + "engines": { 3506 + "node": ">=4" 3507 + } 3508 + }, 3509 + "node_modules/css-gradient-parser": { 3510 + "version": "0.0.17", 3511 + "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.17.tgz", 3512 + "integrity": "sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==", 3513 + "license": "MIT", 3514 + "engines": { 3515 + "node": ">=16" 3516 + } 3517 + }, 3518 + "node_modules/css-selector-parser": { 3519 + "version": "3.1.3", 3520 + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.3.tgz", 3521 + "integrity": "sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg==", 3522 + "funding": [ 3523 + { 3524 + "type": "github", 3525 + "url": "https://github.com/sponsors/mdevils" 3526 + }, 3527 + { 3528 + "type": "patreon", 3529 + "url": "https://patreon.com/mdevils" 3530 + } 3531 + ], 3532 + "license": "MIT" 3533 + }, 3534 + "node_modules/css-to-react-native": { 3535 + "version": "3.2.0", 3536 + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", 3537 + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", 3538 + "license": "MIT", 3539 + "dependencies": { 3540 + "camelize": "^1.0.0", 3541 + "css-color-keywords": "^1.0.0", 3542 + "postcss-value-parser": "^4.0.2" 3543 + } 3544 + }, 3545 + "node_modules/cssesc": { 3546 + "version": "3.0.0", 3547 + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 3548 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 3549 + "license": "MIT", 3550 + "bin": { 3551 + "cssesc": "bin/cssesc" 3552 + }, 3553 + "engines": { 3554 + "node": ">=4" 3555 + } 3556 + }, 3557 + "node_modules/csstype": { 3558 + "version": "3.1.3", 3559 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 3560 + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 3561 + "license": "MIT" 3562 + }, 3563 + "node_modules/date-fns": { 3564 + "version": "4.1.0", 3565 + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", 3566 + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", 3567 + "license": "MIT", 3568 + "funding": { 3569 + "type": "github", 3570 + "url": "https://github.com/sponsors/kossnocorp" 3571 + } 3572 + }, 3573 + "node_modules/debug": { 3574 + "version": "4.4.1", 3575 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 3576 + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 3577 + "license": "MIT", 3578 + "dependencies": { 3579 + "ms": "^2.1.3" 3580 + }, 3581 + "engines": { 3582 + "node": ">=6.0" 3583 + }, 3584 + "peerDependenciesMeta": { 3585 + "supports-color": { 3586 + "optional": true 3587 + } 3588 + } 3589 + }, 3590 + "node_modules/decode-named-character-reference": { 3591 + "version": "1.2.0", 3592 + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", 3593 + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", 3594 + "license": "MIT", 3595 + "dependencies": { 3596 + "character-entities": "^2.0.0" 3597 + }, 3598 + "funding": { 3599 + "type": "github", 3600 + "url": "https://github.com/sponsors/wooorm" 3601 + } 3602 + }, 3603 + "node_modules/deepmerge": { 3604 + "version": "4.3.1", 3605 + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 3606 + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 3607 + "license": "MIT", 3608 + "engines": { 3609 + "node": ">=0.10.0" 3610 + } 3611 + }, 3612 + "node_modules/defu": { 3613 + "version": "6.1.4", 3614 + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 3615 + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 3616 + "license": "MIT" 3617 + }, 3618 + "node_modules/dequal": { 3619 + "version": "2.0.3", 3620 + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 3621 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 3622 + "license": "MIT", 3623 + "engines": { 3624 + "node": ">=6" 3625 + } 3626 + }, 3627 + "node_modules/destr": { 3628 + "version": "2.0.5", 3629 + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", 3630 + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", 3631 + "license": "MIT" 3632 + }, 3633 + "node_modules/detect-libc": { 3634 + "version": "2.0.4", 3635 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", 3636 + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", 3637 + "license": "Apache-2.0", 3638 + "engines": { 3639 + "node": ">=8" 3640 + } 3641 + }, 3642 + "node_modules/deterministic-object-hash": { 3643 + "version": "2.0.2", 3644 + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", 3645 + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", 3646 + "license": "MIT", 3647 + "dependencies": { 3648 + "base-64": "^1.0.0" 3649 + }, 3650 + "engines": { 3651 + "node": ">=18" 3652 + } 3653 + }, 3654 + "node_modules/devalue": { 3655 + "version": "5.3.2", 3656 + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", 3657 + "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", 3658 + "license": "MIT" 3659 + }, 3660 + "node_modules/devlop": { 3661 + "version": "1.1.0", 3662 + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", 3663 + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", 3664 + "license": "MIT", 3665 + "dependencies": { 3666 + "dequal": "^2.0.0" 3667 + }, 3668 + "funding": { 3669 + "type": "github", 3670 + "url": "https://github.com/sponsors/wooorm" 3671 + } 3672 + }, 3673 + "node_modules/dfa": { 3674 + "version": "1.2.0", 3675 + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", 3676 + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", 3677 + "license": "MIT" 3678 + }, 3679 + "node_modules/diff": { 3680 + "version": "5.2.0", 3681 + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", 3682 + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", 3683 + "license": "BSD-3-Clause", 3684 + "engines": { 3685 + "node": ">=0.3.1" 3686 + } 3687 + }, 3688 + "node_modules/direction": { 3689 + "version": "2.0.1", 3690 + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", 3691 + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", 3692 + "license": "MIT", 3693 + "bin": { 3694 + "direction": "cli.js" 3695 + }, 3696 + "funding": { 3697 + "type": "github", 3698 + "url": "https://github.com/sponsors/wooorm" 3699 + } 3700 + }, 3701 + "node_modules/dlv": { 3702 + "version": "1.1.3", 3703 + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 3704 + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 3705 + "license": "MIT" 3706 + }, 3707 + "node_modules/dom-serializer": { 3708 + "version": "2.0.0", 3709 + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 3710 + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 3711 + "license": "MIT", 3712 + "dependencies": { 3713 + "domelementtype": "^2.3.0", 3714 + "domhandler": "^5.0.2", 3715 + "entities": "^4.2.0" 3716 + }, 3717 + "funding": { 3718 + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 3719 + } 3720 + }, 3721 + "node_modules/domelementtype": { 3722 + "version": "2.3.0", 3723 + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 3724 + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 3725 + "funding": [ 3726 + { 3727 + "type": "github", 3728 + "url": "https://github.com/sponsors/fb55" 3729 + } 3730 + ], 3731 + "license": "BSD-2-Clause" 3732 + }, 3733 + "node_modules/domhandler": { 3734 + "version": "5.0.3", 3735 + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 3736 + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 3737 + "license": "BSD-2-Clause", 3738 + "dependencies": { 3739 + "domelementtype": "^2.3.0" 3740 + }, 3741 + "engines": { 3742 + "node": ">= 4" 3743 + }, 3744 + "funding": { 3745 + "url": "https://github.com/fb55/domhandler?sponsor=1" 3746 + } 3747 + }, 3748 + "node_modules/domutils": { 3749 + "version": "3.2.2", 3750 + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", 3751 + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", 3752 + "license": "BSD-2-Clause", 3753 + "dependencies": { 3754 + "dom-serializer": "^2.0.0", 3755 + "domelementtype": "^2.3.0", 3756 + "domhandler": "^5.0.3" 3757 + }, 3758 + "funding": { 3759 + "url": "https://github.com/fb55/domutils?sponsor=1" 3760 + } 3761 + }, 3762 + "node_modules/dset": { 3763 + "version": "3.1.4", 3764 + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", 3765 + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", 3766 + "license": "MIT", 3767 + "engines": { 3768 + "node": ">=4" 3769 + } 3770 + }, 3771 + "node_modules/emoji-regex": { 3772 + "version": "10.5.0", 3773 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", 3774 + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", 3775 + "license": "MIT" 3776 + }, 3777 + "node_modules/emoji-regex-xs": { 3778 + "version": "2.0.1", 3779 + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", 3780 + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", 3781 + "license": "MIT", 3782 + "engines": { 3783 + "node": ">=10.0.0" 3784 + } 3785 + }, 3786 + "node_modules/enhanced-resolve": { 3787 + "version": "5.18.3", 3788 + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", 3789 + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", 3790 + "license": "MIT", 3791 + "dependencies": { 3792 + "graceful-fs": "^4.2.4", 3793 + "tapable": "^2.2.0" 3794 + }, 3795 + "engines": { 3796 + "node": ">=10.13.0" 3797 + } 3798 + }, 3799 + "node_modules/entities": { 3800 + "version": "4.5.0", 3801 + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 3802 + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 3803 + "license": "BSD-2-Clause", 3804 + "engines": { 3805 + "node": ">=0.12" 3806 + }, 3807 + "funding": { 3808 + "url": "https://github.com/fb55/entities?sponsor=1" 3809 + } 3810 + }, 3811 + "node_modules/es-module-lexer": { 3812 + "version": "1.7.0", 3813 + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", 3814 + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", 3815 + "license": "MIT" 3816 + }, 3817 + "node_modules/esast-util-from-estree": { 3818 + "version": "2.0.0", 3819 + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", 3820 + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", 3821 + "license": "MIT", 3822 + "dependencies": { 3823 + "@types/estree-jsx": "^1.0.0", 3824 + "devlop": "^1.0.0", 3825 + "estree-util-visit": "^2.0.0", 3826 + "unist-util-position-from-estree": "^2.0.0" 3827 + }, 3828 + "funding": { 3829 + "type": "opencollective", 3830 + "url": "https://opencollective.com/unified" 3831 + } 3832 + }, 3833 + "node_modules/esast-util-from-js": { 3834 + "version": "2.0.1", 3835 + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", 3836 + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", 3837 + "license": "MIT", 3838 + "dependencies": { 3839 + "@types/estree-jsx": "^1.0.0", 3840 + "acorn": "^8.0.0", 3841 + "esast-util-from-estree": "^2.0.0", 3842 + "vfile-message": "^4.0.0" 3843 + }, 3844 + "funding": { 3845 + "type": "opencollective", 3846 + "url": "https://opencollective.com/unified" 3847 + } 3848 + }, 3849 + "node_modules/esbuild": { 3850 + "version": "0.25.6", 3851 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", 3852 + "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", 3853 + "hasInstallScript": true, 3854 + "license": "MIT", 3855 + "bin": { 3856 + "esbuild": "bin/esbuild" 3857 + }, 3858 + "engines": { 3859 + "node": ">=18" 3860 + }, 3861 + "optionalDependencies": { 3862 + "@esbuild/aix-ppc64": "0.25.6", 3863 + "@esbuild/android-arm": "0.25.6", 3864 + "@esbuild/android-arm64": "0.25.6", 3865 + "@esbuild/android-x64": "0.25.6", 3866 + "@esbuild/darwin-arm64": "0.25.6", 3867 + "@esbuild/darwin-x64": "0.25.6", 3868 + "@esbuild/freebsd-arm64": "0.25.6", 3869 + "@esbuild/freebsd-x64": "0.25.6", 3870 + "@esbuild/linux-arm": "0.25.6", 3871 + "@esbuild/linux-arm64": "0.25.6", 3872 + "@esbuild/linux-ia32": "0.25.6", 3873 + "@esbuild/linux-loong64": "0.25.6", 3874 + "@esbuild/linux-mips64el": "0.25.6", 3875 + "@esbuild/linux-ppc64": "0.25.6", 3876 + "@esbuild/linux-riscv64": "0.25.6", 3877 + "@esbuild/linux-s390x": "0.25.6", 3878 + "@esbuild/linux-x64": "0.25.6", 3879 + "@esbuild/netbsd-arm64": "0.25.6", 3880 + "@esbuild/netbsd-x64": "0.25.6", 3881 + "@esbuild/openbsd-arm64": "0.25.6", 3882 + "@esbuild/openbsd-x64": "0.25.6", 3883 + "@esbuild/openharmony-arm64": "0.25.6", 3884 + "@esbuild/sunos-x64": "0.25.6", 3885 + "@esbuild/win32-arm64": "0.25.6", 3886 + "@esbuild/win32-ia32": "0.25.6", 3887 + "@esbuild/win32-x64": "0.25.6" 3888 + } 3889 + }, 3890 + "node_modules/escape-html": { 3891 + "version": "1.0.3", 3892 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 3893 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 3894 + "license": "MIT" 3895 + }, 3896 + "node_modules/escape-string-regexp": { 3897 + "version": "5.0.0", 3898 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", 3899 + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", 3900 + "license": "MIT", 3901 + "engines": { 3902 + "node": ">=12" 3903 + }, 3904 + "funding": { 3905 + "url": "https://github.com/sponsors/sindresorhus" 3906 + } 3907 + }, 3908 + "node_modules/estree-util-attach-comments": { 3909 + "version": "3.0.0", 3910 + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", 3911 + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", 3912 + "license": "MIT", 3913 + "dependencies": { 3914 + "@types/estree": "^1.0.0" 3915 + }, 3916 + "funding": { 3917 + "type": "opencollective", 3918 + "url": "https://opencollective.com/unified" 3919 + } 3920 + }, 3921 + "node_modules/estree-util-build-jsx": { 3922 + "version": "3.0.1", 3923 + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", 3924 + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", 3925 + "license": "MIT", 3926 + "dependencies": { 3927 + "@types/estree-jsx": "^1.0.0", 3928 + "devlop": "^1.0.0", 3929 + "estree-util-is-identifier-name": "^3.0.0", 3930 + "estree-walker": "^3.0.0" 3931 + }, 3932 + "funding": { 3933 + "type": "opencollective", 3934 + "url": "https://opencollective.com/unified" 3935 + } 3936 + }, 3937 + "node_modules/estree-util-is-identifier-name": { 3938 + "version": "3.0.0", 3939 + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", 3940 + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", 3941 + "license": "MIT", 3942 + "funding": { 3943 + "type": "opencollective", 3944 + "url": "https://opencollective.com/unified" 3945 + } 3946 + }, 3947 + "node_modules/estree-util-scope": { 3948 + "version": "1.0.0", 3949 + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", 3950 + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", 3951 + "license": "MIT", 3952 + "dependencies": { 3953 + "@types/estree": "^1.0.0", 3954 + "devlop": "^1.0.0" 3955 + }, 3956 + "funding": { 3957 + "type": "opencollective", 3958 + "url": "https://opencollective.com/unified" 3959 + } 3960 + }, 3961 + "node_modules/estree-util-to-js": { 3962 + "version": "2.0.0", 3963 + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", 3964 + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", 3965 + "license": "MIT", 3966 + "dependencies": { 3967 + "@types/estree-jsx": "^1.0.0", 3968 + "astring": "^1.8.0", 3969 + "source-map": "^0.7.0" 3970 + }, 3971 + "funding": { 3972 + "type": "opencollective", 3973 + "url": "https://opencollective.com/unified" 3974 + } 3975 + }, 3976 + "node_modules/estree-util-visit": { 3977 + "version": "2.0.0", 3978 + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", 3979 + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", 3980 + "license": "MIT", 3981 + "dependencies": { 3982 + "@types/estree-jsx": "^1.0.0", 3983 + "@types/unist": "^3.0.0" 3984 + }, 3985 + "funding": { 3986 + "type": "opencollective", 3987 + "url": "https://opencollective.com/unified" 3988 + } 3989 + }, 3990 + "node_modules/estree-walker": { 3991 + "version": "3.0.3", 3992 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 3993 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 3994 + "license": "MIT", 3995 + "dependencies": { 3996 + "@types/estree": "^1.0.0" 3997 + } 3998 + }, 3999 + "node_modules/eventemitter3": { 4000 + "version": "5.0.1", 4001 + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", 4002 + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", 4003 + "license": "MIT" 4004 + }, 4005 + "node_modules/expressive-code": { 4006 + "version": "0.41.3", 4007 + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.3.tgz", 4008 + "integrity": "sha512-YLnD62jfgBZYrXIPQcJ0a51Afv9h8VlWqEGK9uU2T5nL/5rb8SnA86+7+mgCZe5D34Tff5RNEA5hjNVJYHzrFg==", 4009 + "license": "MIT", 4010 + "dependencies": { 4011 + "@expressive-code/core": "^0.41.3", 4012 + "@expressive-code/plugin-frames": "^0.41.3", 4013 + "@expressive-code/plugin-shiki": "^0.41.3", 4014 + "@expressive-code/plugin-text-markers": "^0.41.3" 4015 + } 4016 + }, 4017 + "node_modules/extend": { 4018 + "version": "3.0.2", 4019 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 4020 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 4021 + "license": "MIT" 4022 + }, 4023 + "node_modules/fast-deep-equal": { 4024 + "version": "3.1.3", 4025 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 4026 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 4027 + "license": "MIT" 4028 + }, 4029 + "node_modules/fast-xml-parser": { 4030 + "version": "5.2.5", 4031 + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", 4032 + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", 4033 + "funding": [ 4034 + { 4035 + "type": "github", 4036 + "url": "https://github.com/sponsors/NaturalIntelligence" 4037 + } 4038 + ], 4039 + "license": "MIT", 4040 + "dependencies": { 4041 + "strnum": "^2.1.0" 4042 + }, 4043 + "bin": { 4044 + "fxparser": "src/cli/cli.js" 4045 + } 4046 + }, 4047 + "node_modules/fdir": { 4048 + "version": "6.4.6", 4049 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", 4050 + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", 4051 + "license": "MIT", 4052 + "peerDependencies": { 4053 + "picomatch": "^3 || ^4" 4054 + }, 4055 + "peerDependenciesMeta": { 4056 + "picomatch": { 4057 + "optional": true 4058 + } 4059 + } 4060 + }, 4061 + "node_modules/fflate": { 4062 + "version": "0.7.4", 4063 + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", 4064 + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", 4065 + "license": "MIT" 4066 + }, 4067 + "node_modules/fill-range": { 4068 + "version": "7.1.1", 4069 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 4070 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 4071 + "dev": true, 4072 + "license": "MIT", 4073 + "optional": true, 4074 + "dependencies": { 4075 + "to-regex-range": "^5.0.1" 4076 + }, 4077 + "engines": { 4078 + "node": ">=8" 4079 + } 4080 + }, 4081 + "node_modules/flattie": { 4082 + "version": "1.1.1", 4083 + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", 4084 + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", 4085 + "license": "MIT", 4086 + "engines": { 4087 + "node": ">=8" 4088 + } 4089 + }, 4090 + "node_modules/fontace": { 4091 + "version": "0.3.0", 4092 + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.3.0.tgz", 4093 + "integrity": "sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==", 4094 + "license": "MIT", 4095 + "dependencies": { 4096 + "@types/fontkit": "^2.0.8", 4097 + "fontkit": "^2.0.4" 4098 + } 4099 + }, 4100 + "node_modules/fontkit": { 4101 + "version": "2.0.4", 4102 + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", 4103 + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", 4104 + "license": "MIT", 4105 + "dependencies": { 4106 + "@swc/helpers": "^0.5.12", 4107 + "brotli": "^1.3.2", 4108 + "clone": "^2.1.2", 4109 + "dfa": "^1.2.0", 4110 + "fast-deep-equal": "^3.1.3", 4111 + "restructure": "^3.0.0", 4112 + "tiny-inflate": "^1.0.3", 4113 + "unicode-properties": "^1.4.0", 4114 + "unicode-trie": "^2.0.0" 4115 + } 4116 + }, 4117 + "node_modules/fsevents": { 4118 + "version": "2.3.3", 4119 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 4120 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 4121 + "hasInstallScript": true, 4122 + "license": "MIT", 4123 + "optional": true, 4124 + "os": [ 4125 + "darwin" 4126 + ], 4127 + "engines": { 4128 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 4129 + } 4130 + }, 4131 + "node_modules/gemoji": { 4132 + "version": "8.1.0", 4133 + "resolved": "https://registry.npmjs.org/gemoji/-/gemoji-8.1.0.tgz", 4134 + "integrity": "sha512-HA4Gx59dw2+tn+UAa7XEV4ufUKI4fH1KgcbenVA9YKSj1QJTT0xh5Mwv5HMFNN3l2OtUe3ZIfuRwSyZS5pLIWw==", 4135 + "license": "MIT", 4136 + "funding": { 4137 + "type": "github", 4138 + "url": "https://github.com/sponsors/wooorm" 4139 + } 4140 + }, 4141 + "node_modules/get-east-asian-width": { 4142 + "version": "1.3.0", 4143 + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", 4144 + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", 4145 + "license": "MIT", 4146 + "engines": { 4147 + "node": ">=18" 4148 + }, 4149 + "funding": { 4150 + "url": "https://github.com/sponsors/sindresorhus" 4151 + } 4152 + }, 4153 + "node_modules/github-slugger": { 4154 + "version": "2.0.0", 4155 + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", 4156 + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", 4157 + "license": "ISC" 4158 + }, 4159 + "node_modules/graceful-fs": { 4160 + "version": "4.2.11", 4161 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 4162 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 4163 + "license": "ISC" 4164 + }, 4165 + "node_modules/h3": { 4166 + "version": "1.15.3", 4167 + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.3.tgz", 4168 + "integrity": "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==", 4169 + "license": "MIT", 4170 + "dependencies": { 4171 + "cookie-es": "^1.2.2", 4172 + "crossws": "^0.3.4", 4173 + "defu": "^6.1.4", 4174 + "destr": "^2.0.5", 4175 + "iron-webcrypto": "^1.2.1", 4176 + "node-mock-http": "^1.0.0", 4177 + "radix3": "^1.1.2", 4178 + "ufo": "^1.6.1", 4179 + "uncrypto": "^0.1.3" 4180 + } 4181 + }, 4182 + "node_modules/has-flag": { 4183 + "version": "4.0.0", 4184 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 4185 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 4186 + "devOptional": true, 4187 + "license": "MIT", 4188 + "engines": { 4189 + "node": ">=8" 4190 + } 4191 + }, 4192 + "node_modules/hast-util-from-dom": { 4193 + "version": "5.0.1", 4194 + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", 4195 + "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", 4196 + "license": "ISC", 4197 + "dependencies": { 4198 + "@types/hast": "^3.0.0", 4199 + "hastscript": "^9.0.0", 4200 + "web-namespaces": "^2.0.0" 4201 + }, 4202 + "funding": { 4203 + "type": "opencollective", 4204 + "url": "https://opencollective.com/unified" 4205 + } 4206 + }, 4207 + "node_modules/hast-util-from-html": { 4208 + "version": "2.0.3", 4209 + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", 4210 + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", 4211 + "license": "MIT", 4212 + "dependencies": { 4213 + "@types/hast": "^3.0.0", 4214 + "devlop": "^1.1.0", 4215 + "hast-util-from-parse5": "^8.0.0", 4216 + "parse5": "^7.0.0", 4217 + "vfile": "^6.0.0", 4218 + "vfile-message": "^4.0.0" 4219 + }, 4220 + "funding": { 4221 + "type": "opencollective", 4222 + "url": "https://opencollective.com/unified" 4223 + } 4224 + }, 4225 + "node_modules/hast-util-from-html-isomorphic": { 4226 + "version": "2.0.0", 4227 + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", 4228 + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", 4229 + "license": "MIT", 4230 + "dependencies": { 4231 + "@types/hast": "^3.0.0", 4232 + "hast-util-from-dom": "^5.0.0", 4233 + "hast-util-from-html": "^2.0.0", 4234 + "unist-util-remove-position": "^5.0.0" 4235 + }, 4236 + "funding": { 4237 + "type": "opencollective", 4238 + "url": "https://opencollective.com/unified" 4239 + } 4240 + }, 4241 + "node_modules/hast-util-from-parse5": { 4242 + "version": "8.0.3", 4243 + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", 4244 + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", 4245 + "license": "MIT", 4246 + "dependencies": { 4247 + "@types/hast": "^3.0.0", 4248 + "@types/unist": "^3.0.0", 4249 + "devlop": "^1.0.0", 4250 + "hastscript": "^9.0.0", 4251 + "property-information": "^7.0.0", 4252 + "vfile": "^6.0.0", 4253 + "vfile-location": "^5.0.0", 4254 + "web-namespaces": "^2.0.0" 4255 + }, 4256 + "funding": { 4257 + "type": "opencollective", 4258 + "url": "https://opencollective.com/unified" 4259 + } 4260 + }, 4261 + "node_modules/hast-util-has-property": { 4262 + "version": "3.0.0", 4263 + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", 4264 + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", 4265 + "license": "MIT", 4266 + "dependencies": { 4267 + "@types/hast": "^3.0.0" 4268 + }, 4269 + "funding": { 4270 + "type": "opencollective", 4271 + "url": "https://opencollective.com/unified" 4272 + } 4273 + }, 4274 + "node_modules/hast-util-heading-rank": { 4275 + "version": "3.0.0", 4276 + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", 4277 + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", 4278 + "license": "MIT", 4279 + "dependencies": { 4280 + "@types/hast": "^3.0.0" 4281 + }, 4282 + "funding": { 4283 + "type": "opencollective", 4284 + "url": "https://opencollective.com/unified" 4285 + } 4286 + }, 4287 + "node_modules/hast-util-interactive": { 4288 + "version": "3.0.0", 4289 + "resolved": "https://registry.npmjs.org/hast-util-interactive/-/hast-util-interactive-3.0.0.tgz", 4290 + "integrity": "sha512-9VFa3kP6AT40BNYcPmn3jpsG+1KPDF0rUFCrFVQDUsuUXZ3YLODm8UGV0tmYzFpcOIQXTAOi2ccS3ywlj2dQTA==", 4291 + "license": "MIT", 4292 + "dependencies": { 4293 + "@types/hast": "^3.0.0", 4294 + "hast-util-has-property": "^3.0.0" 4295 + }, 4296 + "funding": { 4297 + "type": "opencollective", 4298 + "url": "https://opencollective.com/unified" 4299 + } 4300 + }, 4301 + "node_modules/hast-util-is-element": { 4302 + "version": "3.0.0", 4303 + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", 4304 + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", 4305 + "license": "MIT", 4306 + "dependencies": { 4307 + "@types/hast": "^3.0.0" 4308 + }, 4309 + "funding": { 4310 + "type": "opencollective", 4311 + "url": "https://opencollective.com/unified" 4312 + } 4313 + }, 4314 + "node_modules/hast-util-parse-selector": { 4315 + "version": "4.0.0", 4316 + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", 4317 + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", 4318 + "license": "MIT", 4319 + "dependencies": { 4320 + "@types/hast": "^3.0.0" 4321 + }, 4322 + "funding": { 4323 + "type": "opencollective", 4324 + "url": "https://opencollective.com/unified" 4325 + } 4326 + }, 4327 + "node_modules/hast-util-raw": { 4328 + "version": "9.1.0", 4329 + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", 4330 + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", 4331 + "license": "MIT", 4332 + "dependencies": { 4333 + "@types/hast": "^3.0.0", 4334 + "@types/unist": "^3.0.0", 4335 + "@ungap/structured-clone": "^1.0.0", 4336 + "hast-util-from-parse5": "^8.0.0", 4337 + "hast-util-to-parse5": "^8.0.0", 4338 + "html-void-elements": "^3.0.0", 4339 + "mdast-util-to-hast": "^13.0.0", 4340 + "parse5": "^7.0.0", 4341 + "unist-util-position": "^5.0.0", 4342 + "unist-util-visit": "^5.0.0", 4343 + "vfile": "^6.0.0", 4344 + "web-namespaces": "^2.0.0", 4345 + "zwitch": "^2.0.0" 4346 + }, 4347 + "funding": { 4348 + "type": "opencollective", 4349 + "url": "https://opencollective.com/unified" 4350 + } 4351 + }, 4352 + "node_modules/hast-util-select": { 4353 + "version": "6.0.4", 4354 + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", 4355 + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", 4356 + "license": "MIT", 4357 + "dependencies": { 4358 + "@types/hast": "^3.0.0", 4359 + "@types/unist": "^3.0.0", 4360 + "bcp-47-match": "^2.0.0", 4361 + "comma-separated-tokens": "^2.0.0", 4362 + "css-selector-parser": "^3.0.0", 4363 + "devlop": "^1.0.0", 4364 + "direction": "^2.0.0", 4365 + "hast-util-has-property": "^3.0.0", 4366 + "hast-util-to-string": "^3.0.0", 4367 + "hast-util-whitespace": "^3.0.0", 4368 + "nth-check": "^2.0.0", 4369 + "property-information": "^7.0.0", 4370 + "space-separated-tokens": "^2.0.0", 4371 + "unist-util-visit": "^5.0.0", 4372 + "zwitch": "^2.0.0" 4373 + }, 4374 + "funding": { 4375 + "type": "opencollective", 4376 + "url": "https://opencollective.com/unified" 4377 + } 4378 + }, 4379 + "node_modules/hast-util-to-estree": { 4380 + "version": "3.1.3", 4381 + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", 4382 + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", 4383 + "license": "MIT", 4384 + "dependencies": { 4385 + "@types/estree": "^1.0.0", 4386 + "@types/estree-jsx": "^1.0.0", 4387 + "@types/hast": "^3.0.0", 4388 + "comma-separated-tokens": "^2.0.0", 4389 + "devlop": "^1.0.0", 4390 + "estree-util-attach-comments": "^3.0.0", 4391 + "estree-util-is-identifier-name": "^3.0.0", 4392 + "hast-util-whitespace": "^3.0.0", 4393 + "mdast-util-mdx-expression": "^2.0.0", 4394 + "mdast-util-mdx-jsx": "^3.0.0", 4395 + "mdast-util-mdxjs-esm": "^2.0.0", 4396 + "property-information": "^7.0.0", 4397 + "space-separated-tokens": "^2.0.0", 4398 + "style-to-js": "^1.0.0", 4399 + "unist-util-position": "^5.0.0", 4400 + "zwitch": "^2.0.0" 4401 + }, 4402 + "funding": { 4403 + "type": "opencollective", 4404 + "url": "https://opencollective.com/unified" 4405 + } 4406 + }, 4407 + "node_modules/hast-util-to-html": { 4408 + "version": "9.0.5", 4409 + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", 4410 + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", 4411 + "license": "MIT", 4412 + "dependencies": { 4413 + "@types/hast": "^3.0.0", 4414 + "@types/unist": "^3.0.0", 4415 + "ccount": "^2.0.0", 4416 + "comma-separated-tokens": "^2.0.0", 4417 + "hast-util-whitespace": "^3.0.0", 4418 + "html-void-elements": "^3.0.0", 4419 + "mdast-util-to-hast": "^13.0.0", 4420 + "property-information": "^7.0.0", 4421 + "space-separated-tokens": "^2.0.0", 4422 + "stringify-entities": "^4.0.0", 4423 + "zwitch": "^2.0.4" 4424 + }, 4425 + "funding": { 4426 + "type": "opencollective", 4427 + "url": "https://opencollective.com/unified" 4428 + } 4429 + }, 4430 + "node_modules/hast-util-to-jsx-runtime": { 4431 + "version": "2.3.6", 4432 + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", 4433 + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", 4434 + "license": "MIT", 4435 + "dependencies": { 4436 + "@types/estree": "^1.0.0", 4437 + "@types/hast": "^3.0.0", 4438 + "@types/unist": "^3.0.0", 4439 + "comma-separated-tokens": "^2.0.0", 4440 + "devlop": "^1.0.0", 4441 + "estree-util-is-identifier-name": "^3.0.0", 4442 + "hast-util-whitespace": "^3.0.0", 4443 + "mdast-util-mdx-expression": "^2.0.0", 4444 + "mdast-util-mdx-jsx": "^3.0.0", 4445 + "mdast-util-mdxjs-esm": "^2.0.0", 4446 + "property-information": "^7.0.0", 4447 + "space-separated-tokens": "^2.0.0", 4448 + "style-to-js": "^1.0.0", 4449 + "unist-util-position": "^5.0.0", 4450 + "vfile-message": "^4.0.0" 4451 + }, 4452 + "funding": { 4453 + "type": "opencollective", 4454 + "url": "https://opencollective.com/unified" 4455 + } 4456 + }, 4457 + "node_modules/hast-util-to-parse5": { 4458 + "version": "8.0.0", 4459 + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", 4460 + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", 4461 + "license": "MIT", 4462 + "dependencies": { 4463 + "@types/hast": "^3.0.0", 4464 + "comma-separated-tokens": "^2.0.0", 4465 + "devlop": "^1.0.0", 4466 + "property-information": "^6.0.0", 4467 + "space-separated-tokens": "^2.0.0", 4468 + "web-namespaces": "^2.0.0", 4469 + "zwitch": "^2.0.0" 4470 + }, 4471 + "funding": { 4472 + "type": "opencollective", 4473 + "url": "https://opencollective.com/unified" 4474 + } 4475 + }, 4476 + "node_modules/hast-util-to-parse5/node_modules/property-information": { 4477 + "version": "6.5.0", 4478 + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", 4479 + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", 4480 + "license": "MIT", 4481 + "funding": { 4482 + "type": "github", 4483 + "url": "https://github.com/sponsors/wooorm" 4484 + } 4485 + }, 4486 + "node_modules/hast-util-to-string": { 4487 + "version": "3.0.1", 4488 + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", 4489 + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", 4490 + "license": "MIT", 4491 + "dependencies": { 4492 + "@types/hast": "^3.0.0" 4493 + }, 4494 + "funding": { 4495 + "type": "opencollective", 4496 + "url": "https://opencollective.com/unified" 4497 + } 4498 + }, 4499 + "node_modules/hast-util-to-text": { 4500 + "version": "4.0.2", 4501 + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", 4502 + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", 4503 + "license": "MIT", 4504 + "dependencies": { 4505 + "@types/hast": "^3.0.0", 4506 + "@types/unist": "^3.0.0", 4507 + "hast-util-is-element": "^3.0.0", 4508 + "unist-util-find-after": "^5.0.0" 4509 + }, 4510 + "funding": { 4511 + "type": "opencollective", 4512 + "url": "https://opencollective.com/unified" 4513 + } 4514 + }, 4515 + "node_modules/hast-util-whitespace": { 4516 + "version": "3.0.0", 4517 + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", 4518 + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", 4519 + "license": "MIT", 4520 + "dependencies": { 4521 + "@types/hast": "^3.0.0" 4522 + }, 4523 + "funding": { 4524 + "type": "opencollective", 4525 + "url": "https://opencollective.com/unified" 4526 + } 4527 + }, 4528 + "node_modules/hastscript": { 4529 + "version": "9.0.1", 4530 + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", 4531 + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", 4532 + "license": "MIT", 4533 + "dependencies": { 4534 + "@types/hast": "^3.0.0", 4535 + "comma-separated-tokens": "^2.0.0", 4536 + "hast-util-parse-selector": "^4.0.0", 4537 + "property-information": "^7.0.0", 4538 + "space-separated-tokens": "^2.0.0" 4539 + }, 4540 + "funding": { 4541 + "type": "opencollective", 4542 + "url": "https://opencollective.com/unified" 4543 + } 4544 + }, 4545 + "node_modules/hex-rgb": { 4546 + "version": "4.3.0", 4547 + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", 4548 + "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", 4549 + "license": "MIT", 4550 + "engines": { 4551 + "node": ">=6" 4552 + }, 4553 + "funding": { 4554 + "url": "https://github.com/sponsors/sindresorhus" 4555 + } 4556 + }, 4557 + "node_modules/html-escaper": { 4558 + "version": "3.0.3", 4559 + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", 4560 + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", 4561 + "license": "MIT" 4562 + }, 4563 + "node_modules/html-void-elements": { 4564 + "version": "3.0.0", 4565 + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", 4566 + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", 4567 + "license": "MIT", 4568 + "funding": { 4569 + "type": "github", 4570 + "url": "https://github.com/sponsors/wooorm" 4571 + } 4572 + }, 4573 + "node_modules/http-cache-semantics": { 4574 + "version": "4.2.0", 4575 + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", 4576 + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", 4577 + "license": "BSD-2-Clause" 4578 + }, 4579 + "node_modules/immutable": { 4580 + "version": "5.1.3", 4581 + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", 4582 + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", 4583 + "devOptional": true, 4584 + "license": "MIT" 4585 + }, 4586 + "node_modules/import-meta-resolve": { 4587 + "version": "4.2.0", 4588 + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", 4589 + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", 4590 + "license": "MIT", 4591 + "funding": { 4592 + "type": "github", 4593 + "url": "https://github.com/sponsors/wooorm" 4594 + } 4595 + }, 4596 + "node_modules/inline-style-parser": { 4597 + "version": "0.2.4", 4598 + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", 4599 + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", 4600 + "license": "MIT" 4601 + }, 4602 + "node_modules/iron-webcrypto": { 4603 + "version": "1.2.1", 4604 + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", 4605 + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", 4606 + "license": "MIT", 4607 + "funding": { 4608 + "url": "https://github.com/sponsors/brc-dd" 4609 + } 4610 + }, 4611 + "node_modules/is-absolute-url": { 4612 + "version": "4.0.1", 4613 + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", 4614 + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", 4615 + "license": "MIT", 4616 + "engines": { 4617 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4618 + }, 4619 + "funding": { 4620 + "url": "https://github.com/sponsors/sindresorhus" 4621 + } 4622 + }, 4623 + "node_modules/is-alphabetical": { 4624 + "version": "2.0.1", 4625 + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", 4626 + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", 4627 + "license": "MIT", 4628 + "funding": { 4629 + "type": "github", 4630 + "url": "https://github.com/sponsors/wooorm" 4631 + } 4632 + }, 4633 + "node_modules/is-alphanumerical": { 4634 + "version": "2.0.1", 4635 + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", 4636 + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", 4637 + "license": "MIT", 4638 + "dependencies": { 4639 + "is-alphabetical": "^2.0.0", 4640 + "is-decimal": "^2.0.0" 4641 + }, 4642 + "funding": { 4643 + "type": "github", 4644 + "url": "https://github.com/sponsors/wooorm" 4645 + } 4646 + }, 4647 + "node_modules/is-arrayish": { 4648 + "version": "0.3.2", 4649 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 4650 + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", 4651 + "license": "MIT", 4652 + "optional": true 4653 + }, 4654 + "node_modules/is-decimal": { 4655 + "version": "2.0.1", 4656 + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", 4657 + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", 4658 + "license": "MIT", 4659 + "funding": { 4660 + "type": "github", 4661 + "url": "https://github.com/sponsors/wooorm" 4662 + } 4663 + }, 4664 + "node_modules/is-docker": { 4665 + "version": "3.0.0", 4666 + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 4667 + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 4668 + "license": "MIT", 4669 + "bin": { 4670 + "is-docker": "cli.js" 4671 + }, 4672 + "engines": { 4673 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4674 + }, 4675 + "funding": { 4676 + "url": "https://github.com/sponsors/sindresorhus" 4677 + } 4678 + }, 4679 + "node_modules/is-extglob": { 4680 + "version": "2.1.1", 4681 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 4682 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 4683 + "dev": true, 4684 + "license": "MIT", 4685 + "optional": true, 4686 + "engines": { 4687 + "node": ">=0.10.0" 4688 + } 4689 + }, 4690 + "node_modules/is-fullwidth-code-point": { 4691 + "version": "3.0.0", 4692 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 4693 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 4694 + "license": "MIT", 4695 + "engines": { 4696 + "node": ">=8" 4697 + } 4698 + }, 4699 + "node_modules/is-glob": { 4700 + "version": "4.0.3", 4701 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 4702 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 4703 + "dev": true, 4704 + "license": "MIT", 4705 + "optional": true, 4706 + "dependencies": { 4707 + "is-extglob": "^2.1.1" 4708 + }, 4709 + "engines": { 4710 + "node": ">=0.10.0" 4711 + } 4712 + }, 4713 + "node_modules/is-hexadecimal": { 4714 + "version": "2.0.1", 4715 + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", 4716 + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", 4717 + "license": "MIT", 4718 + "funding": { 4719 + "type": "github", 4720 + "url": "https://github.com/sponsors/wooorm" 4721 + } 4722 + }, 4723 + "node_modules/is-inside-container": { 4724 + "version": "1.0.0", 4725 + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 4726 + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 4727 + "license": "MIT", 4728 + "dependencies": { 4729 + "is-docker": "^3.0.0" 4730 + }, 4731 + "bin": { 4732 + "is-inside-container": "cli.js" 4733 + }, 4734 + "engines": { 4735 + "node": ">=14.16" 4736 + }, 4737 + "funding": { 4738 + "url": "https://github.com/sponsors/sindresorhus" 4739 + } 4740 + }, 4741 + "node_modules/is-number": { 4742 + "version": "7.0.0", 4743 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 4744 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 4745 + "dev": true, 4746 + "license": "MIT", 4747 + "optional": true, 4748 + "engines": { 4749 + "node": ">=0.12.0" 4750 + } 4751 + }, 4752 + "node_modules/is-plain-obj": { 4753 + "version": "4.1.0", 4754 + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", 4755 + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", 4756 + "license": "MIT", 4757 + "engines": { 4758 + "node": ">=12" 4759 + }, 4760 + "funding": { 4761 + "url": "https://github.com/sponsors/sindresorhus" 4762 + } 4763 + }, 4764 + "node_modules/is-plain-object": { 4765 + "version": "5.0.0", 4766 + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", 4767 + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", 4768 + "license": "MIT", 4769 + "engines": { 4770 + "node": ">=0.10.0" 4771 + } 4772 + }, 4773 + "node_modules/is-wsl": { 4774 + "version": "3.1.0", 4775 + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", 4776 + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", 4777 + "license": "MIT", 4778 + "dependencies": { 4779 + "is-inside-container": "^1.0.0" 4780 + }, 4781 + "engines": { 4782 + "node": ">=16" 4783 + }, 4784 + "funding": { 4785 + "url": "https://github.com/sponsors/sindresorhus" 4786 + } 4787 + }, 4788 + "node_modules/jiti": { 4789 + "version": "2.5.1", 4790 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", 4791 + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", 4792 + "license": "MIT", 4793 + "bin": { 4794 + "jiti": "lib/jiti-cli.mjs" 4795 + } 4796 + }, 4797 + "node_modules/js-yaml": { 4798 + "version": "4.1.0", 4799 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 4800 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 4801 + "license": "MIT", 4802 + "dependencies": { 4803 + "argparse": "^2.0.1" 4804 + }, 4805 + "bin": { 4806 + "js-yaml": "bin/js-yaml.js" 4807 + } 4808 + }, 4809 + "node_modules/katex": { 4810 + "version": "0.16.22", 4811 + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", 4812 + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", 4813 + "funding": [ 4814 + "https://opencollective.com/katex", 4815 + "https://github.com/sponsors/katex" 4816 + ], 4817 + "license": "MIT", 4818 + "dependencies": { 4819 + "commander": "^8.3.0" 4820 + }, 4821 + "bin": { 4822 + "katex": "cli.js" 4823 + } 4824 + }, 4825 + "node_modules/katex/node_modules/commander": { 4826 + "version": "8.3.0", 4827 + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", 4828 + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", 4829 + "license": "MIT", 4830 + "engines": { 4831 + "node": ">= 12" 4832 + } 4833 + }, 4834 + "node_modules/kleur": { 4835 + "version": "4.1.5", 4836 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 4837 + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 4838 + "license": "MIT", 4839 + "engines": { 4840 + "node": ">=6" 4841 + } 4842 + }, 4843 + "node_modules/lightningcss": { 4844 + "version": "1.30.1", 4845 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", 4846 + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", 4847 + "license": "MPL-2.0", 4848 + "dependencies": { 4849 + "detect-libc": "^2.0.3" 4850 + }, 4851 + "engines": { 4852 + "node": ">= 12.0.0" 4853 + }, 4854 + "funding": { 4855 + "type": "opencollective", 4856 + "url": "https://opencollective.com/parcel" 4857 + }, 4858 + "optionalDependencies": { 4859 + "lightningcss-darwin-arm64": "1.30.1", 4860 + "lightningcss-darwin-x64": "1.30.1", 4861 + "lightningcss-freebsd-x64": "1.30.1", 4862 + "lightningcss-linux-arm-gnueabihf": "1.30.1", 4863 + "lightningcss-linux-arm64-gnu": "1.30.1", 4864 + "lightningcss-linux-arm64-musl": "1.30.1", 4865 + "lightningcss-linux-x64-gnu": "1.30.1", 4866 + "lightningcss-linux-x64-musl": "1.30.1", 4867 + "lightningcss-win32-arm64-msvc": "1.30.1", 4868 + "lightningcss-win32-x64-msvc": "1.30.1" 4869 + } 4870 + }, 4871 + "node_modules/lightningcss-darwin-arm64": { 4872 + "version": "1.30.1", 4873 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", 4874 + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", 4875 + "cpu": [ 4876 + "arm64" 4877 + ], 4878 + "license": "MPL-2.0", 4879 + "optional": true, 4880 + "os": [ 4881 + "darwin" 4882 + ], 4883 + "engines": { 4884 + "node": ">= 12.0.0" 4885 + }, 4886 + "funding": { 4887 + "type": "opencollective", 4888 + "url": "https://opencollective.com/parcel" 4889 + } 4890 + }, 4891 + "node_modules/lightningcss-darwin-x64": { 4892 + "version": "1.30.1", 4893 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", 4894 + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", 4895 + "cpu": [ 4896 + "x64" 4897 + ], 4898 + "license": "MPL-2.0", 4899 + "optional": true, 4900 + "os": [ 4901 + "darwin" 4902 + ], 4903 + "engines": { 4904 + "node": ">= 12.0.0" 4905 + }, 4906 + "funding": { 4907 + "type": "opencollective", 4908 + "url": "https://opencollective.com/parcel" 4909 + } 4910 + }, 4911 + "node_modules/lightningcss-freebsd-x64": { 4912 + "version": "1.30.1", 4913 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", 4914 + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", 4915 + "cpu": [ 4916 + "x64" 4917 + ], 4918 + "license": "MPL-2.0", 4919 + "optional": true, 4920 + "os": [ 4921 + "freebsd" 4922 + ], 4923 + "engines": { 4924 + "node": ">= 12.0.0" 4925 + }, 4926 + "funding": { 4927 + "type": "opencollective", 4928 + "url": "https://opencollective.com/parcel" 4929 + } 4930 + }, 4931 + "node_modules/lightningcss-linux-arm-gnueabihf": { 4932 + "version": "1.30.1", 4933 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", 4934 + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", 4935 + "cpu": [ 4936 + "arm" 4937 + ], 4938 + "license": "MPL-2.0", 4939 + "optional": true, 4940 + "os": [ 4941 + "linux" 4942 + ], 4943 + "engines": { 4944 + "node": ">= 12.0.0" 4945 + }, 4946 + "funding": { 4947 + "type": "opencollective", 4948 + "url": "https://opencollective.com/parcel" 4949 + } 4950 + }, 4951 + "node_modules/lightningcss-linux-arm64-gnu": { 4952 + "version": "1.30.1", 4953 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", 4954 + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", 4955 + "cpu": [ 4956 + "arm64" 4957 + ], 4958 + "license": "MPL-2.0", 4959 + "optional": true, 4960 + "os": [ 4961 + "linux" 4962 + ], 4963 + "engines": { 4964 + "node": ">= 12.0.0" 4965 + }, 4966 + "funding": { 4967 + "type": "opencollective", 4968 + "url": "https://opencollective.com/parcel" 4969 + } 4970 + }, 4971 + "node_modules/lightningcss-linux-arm64-musl": { 4972 + "version": "1.30.1", 4973 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", 4974 + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", 4975 + "cpu": [ 4976 + "arm64" 4977 + ], 4978 + "license": "MPL-2.0", 4979 + "optional": true, 4980 + "os": [ 4981 + "linux" 4982 + ], 4983 + "engines": { 4984 + "node": ">= 12.0.0" 4985 + }, 4986 + "funding": { 4987 + "type": "opencollective", 4988 + "url": "https://opencollective.com/parcel" 4989 + } 4990 + }, 4991 + "node_modules/lightningcss-linux-x64-gnu": { 4992 + "version": "1.30.1", 4993 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", 4994 + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", 4995 + "cpu": [ 4996 + "x64" 4997 + ], 4998 + "license": "MPL-2.0", 4999 + "optional": true, 5000 + "os": [ 5001 + "linux" 5002 + ], 5003 + "engines": { 5004 + "node": ">= 12.0.0" 5005 + }, 5006 + "funding": { 5007 + "type": "opencollective", 5008 + "url": "https://opencollective.com/parcel" 5009 + } 5010 + }, 5011 + "node_modules/lightningcss-linux-x64-musl": { 5012 + "version": "1.30.1", 5013 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", 5014 + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", 5015 + "cpu": [ 5016 + "x64" 5017 + ], 5018 + "license": "MPL-2.0", 5019 + "optional": true, 5020 + "os": [ 5021 + "linux" 5022 + ], 5023 + "engines": { 5024 + "node": ">= 12.0.0" 5025 + }, 5026 + "funding": { 5027 + "type": "opencollective", 5028 + "url": "https://opencollective.com/parcel" 5029 + } 5030 + }, 5031 + "node_modules/lightningcss-win32-arm64-msvc": { 5032 + "version": "1.30.1", 5033 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", 5034 + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", 5035 + "cpu": [ 5036 + "arm64" 5037 + ], 5038 + "license": "MPL-2.0", 5039 + "optional": true, 5040 + "os": [ 5041 + "win32" 5042 + ], 5043 + "engines": { 5044 + "node": ">= 12.0.0" 5045 + }, 5046 + "funding": { 5047 + "type": "opencollective", 5048 + "url": "https://opencollective.com/parcel" 5049 + } 5050 + }, 5051 + "node_modules/lightningcss-win32-x64-msvc": { 5052 + "version": "1.30.1", 5053 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", 5054 + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", 5055 + "cpu": [ 5056 + "x64" 5057 + ], 5058 + "license": "MPL-2.0", 5059 + "optional": true, 5060 + "os": [ 5061 + "win32" 5062 + ], 5063 + "engines": { 5064 + "node": ">= 12.0.0" 5065 + }, 5066 + "funding": { 5067 + "type": "opencollective", 5068 + "url": "https://opencollective.com/parcel" 5069 + } 5070 + }, 5071 + "node_modules/linebreak": { 5072 + "version": "1.1.0", 5073 + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", 5074 + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", 5075 + "license": "MIT", 5076 + "dependencies": { 5077 + "base64-js": "0.0.8", 5078 + "unicode-trie": "^2.0.0" 5079 + } 5080 + }, 5081 + "node_modules/linebreak/node_modules/base64-js": { 5082 + "version": "0.0.8", 5083 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", 5084 + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", 5085 + "license": "MIT", 5086 + "engines": { 5087 + "node": ">= 0.4" 5088 + } 5089 + }, 5090 + "node_modules/linkify-it": { 5091 + "version": "5.0.0", 5092 + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", 5093 + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", 5094 + "license": "MIT", 5095 + "dependencies": { 5096 + "uc.micro": "^2.0.0" 5097 + } 5098 + }, 5099 + "node_modules/longest-streak": { 5100 + "version": "3.1.0", 5101 + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", 5102 + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", 5103 + "license": "MIT", 5104 + "funding": { 5105 + "type": "github", 5106 + "url": "https://github.com/sponsors/wooorm" 5107 + } 5108 + }, 5109 + "node_modules/lru-cache": { 5110 + "version": "10.4.3", 5111 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 5112 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 5113 + "license": "ISC" 5114 + }, 5115 + "node_modules/magic-string": { 5116 + "version": "0.30.18", 5117 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", 5118 + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", 5119 + "license": "MIT", 5120 + "dependencies": { 5121 + "@jridgewell/sourcemap-codec": "^1.5.5" 5122 + } 5123 + }, 5124 + "node_modules/magicast": { 5125 + "version": "0.3.5", 5126 + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", 5127 + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", 5128 + "license": "MIT", 5129 + "dependencies": { 5130 + "@babel/parser": "^7.25.4", 5131 + "@babel/types": "^7.25.4", 5132 + "source-map-js": "^1.2.0" 5133 + } 5134 + }, 5135 + "node_modules/markdown-extensions": { 5136 + "version": "2.0.0", 5137 + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", 5138 + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", 5139 + "license": "MIT", 5140 + "engines": { 5141 + "node": ">=16" 5142 + }, 5143 + "funding": { 5144 + "url": "https://github.com/sponsors/sindresorhus" 5145 + } 5146 + }, 5147 + "node_modules/markdown-it": { 5148 + "version": "14.1.0", 5149 + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", 5150 + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", 5151 + "license": "MIT", 5152 + "dependencies": { 5153 + "argparse": "^2.0.1", 5154 + "entities": "^4.4.0", 5155 + "linkify-it": "^5.0.0", 5156 + "mdurl": "^2.0.0", 5157 + "punycode.js": "^2.3.1", 5158 + "uc.micro": "^2.1.0" 5159 + }, 5160 + "bin": { 5161 + "markdown-it": "bin/markdown-it.mjs" 5162 + } 5163 + }, 5164 + "node_modules/markdown-table": { 5165 + "version": "3.0.4", 5166 + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", 5167 + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", 5168 + "license": "MIT", 5169 + "funding": { 5170 + "type": "github", 5171 + "url": "https://github.com/sponsors/wooorm" 5172 + } 5173 + }, 5174 + "node_modules/mdast-util-definitions": { 5175 + "version": "6.0.0", 5176 + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", 5177 + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", 5178 + "license": "MIT", 5179 + "dependencies": { 5180 + "@types/mdast": "^4.0.0", 5181 + "@types/unist": "^3.0.0", 5182 + "unist-util-visit": "^5.0.0" 5183 + }, 5184 + "funding": { 5185 + "type": "opencollective", 5186 + "url": "https://opencollective.com/unified" 5187 + } 5188 + }, 5189 + "node_modules/mdast-util-directive": { 5190 + "version": "3.1.0", 5191 + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", 5192 + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", 5193 + "license": "MIT", 5194 + "dependencies": { 5195 + "@types/mdast": "^4.0.0", 5196 + "@types/unist": "^3.0.0", 5197 + "ccount": "^2.0.0", 5198 + "devlop": "^1.0.0", 5199 + "mdast-util-from-markdown": "^2.0.0", 5200 + "mdast-util-to-markdown": "^2.0.0", 5201 + "parse-entities": "^4.0.0", 5202 + "stringify-entities": "^4.0.0", 5203 + "unist-util-visit-parents": "^6.0.0" 5204 + }, 5205 + "funding": { 5206 + "type": "opencollective", 5207 + "url": "https://opencollective.com/unified" 5208 + } 5209 + }, 5210 + "node_modules/mdast-util-find-and-replace": { 5211 + "version": "3.0.2", 5212 + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", 5213 + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", 5214 + "license": "MIT", 5215 + "dependencies": { 5216 + "@types/mdast": "^4.0.0", 5217 + "escape-string-regexp": "^5.0.0", 5218 + "unist-util-is": "^6.0.0", 5219 + "unist-util-visit-parents": "^6.0.0" 5220 + }, 5221 + "funding": { 5222 + "type": "opencollective", 5223 + "url": "https://opencollective.com/unified" 5224 + } 5225 + }, 5226 + "node_modules/mdast-util-from-markdown": { 5227 + "version": "2.0.2", 5228 + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", 5229 + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", 5230 + "license": "MIT", 5231 + "dependencies": { 5232 + "@types/mdast": "^4.0.0", 5233 + "@types/unist": "^3.0.0", 5234 + "decode-named-character-reference": "^1.0.0", 5235 + "devlop": "^1.0.0", 5236 + "mdast-util-to-string": "^4.0.0", 5237 + "micromark": "^4.0.0", 5238 + "micromark-util-decode-numeric-character-reference": "^2.0.0", 5239 + "micromark-util-decode-string": "^2.0.0", 5240 + "micromark-util-normalize-identifier": "^2.0.0", 5241 + "micromark-util-symbol": "^2.0.0", 5242 + "micromark-util-types": "^2.0.0", 5243 + "unist-util-stringify-position": "^4.0.0" 5244 + }, 5245 + "funding": { 5246 + "type": "opencollective", 5247 + "url": "https://opencollective.com/unified" 5248 + } 5249 + }, 5250 + "node_modules/mdast-util-gfm": { 5251 + "version": "3.1.0", 5252 + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", 5253 + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", 5254 + "license": "MIT", 5255 + "dependencies": { 5256 + "mdast-util-from-markdown": "^2.0.0", 5257 + "mdast-util-gfm-autolink-literal": "^2.0.0", 5258 + "mdast-util-gfm-footnote": "^2.0.0", 5259 + "mdast-util-gfm-strikethrough": "^2.0.0", 5260 + "mdast-util-gfm-table": "^2.0.0", 5261 + "mdast-util-gfm-task-list-item": "^2.0.0", 5262 + "mdast-util-to-markdown": "^2.0.0" 5263 + }, 5264 + "funding": { 5265 + "type": "opencollective", 5266 + "url": "https://opencollective.com/unified" 5267 + } 5268 + }, 5269 + "node_modules/mdast-util-gfm-autolink-literal": { 5270 + "version": "2.0.1", 5271 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", 5272 + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", 5273 + "license": "MIT", 5274 + "dependencies": { 5275 + "@types/mdast": "^4.0.0", 5276 + "ccount": "^2.0.0", 5277 + "devlop": "^1.0.0", 5278 + "mdast-util-find-and-replace": "^3.0.0", 5279 + "micromark-util-character": "^2.0.0" 5280 + }, 5281 + "funding": { 5282 + "type": "opencollective", 5283 + "url": "https://opencollective.com/unified" 5284 + } 5285 + }, 5286 + "node_modules/mdast-util-gfm-footnote": { 5287 + "version": "2.1.0", 5288 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", 5289 + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", 5290 + "license": "MIT", 5291 + "dependencies": { 5292 + "@types/mdast": "^4.0.0", 5293 + "devlop": "^1.1.0", 5294 + "mdast-util-from-markdown": "^2.0.0", 5295 + "mdast-util-to-markdown": "^2.0.0", 5296 + "micromark-util-normalize-identifier": "^2.0.0" 5297 + }, 5298 + "funding": { 5299 + "type": "opencollective", 5300 + "url": "https://opencollective.com/unified" 5301 + } 5302 + }, 5303 + "node_modules/mdast-util-gfm-strikethrough": { 5304 + "version": "2.0.0", 5305 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", 5306 + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", 5307 + "license": "MIT", 5308 + "dependencies": { 5309 + "@types/mdast": "^4.0.0", 5310 + "mdast-util-from-markdown": "^2.0.0", 5311 + "mdast-util-to-markdown": "^2.0.0" 5312 + }, 5313 + "funding": { 5314 + "type": "opencollective", 5315 + "url": "https://opencollective.com/unified" 5316 + } 5317 + }, 5318 + "node_modules/mdast-util-gfm-table": { 5319 + "version": "2.0.0", 5320 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", 5321 + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", 5322 + "license": "MIT", 5323 + "dependencies": { 5324 + "@types/mdast": "^4.0.0", 5325 + "devlop": "^1.0.0", 5326 + "markdown-table": "^3.0.0", 5327 + "mdast-util-from-markdown": "^2.0.0", 5328 + "mdast-util-to-markdown": "^2.0.0" 5329 + }, 5330 + "funding": { 5331 + "type": "opencollective", 5332 + "url": "https://opencollective.com/unified" 5333 + } 5334 + }, 5335 + "node_modules/mdast-util-gfm-task-list-item": { 5336 + "version": "2.0.0", 5337 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", 5338 + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", 5339 + "license": "MIT", 5340 + "dependencies": { 5341 + "@types/mdast": "^4.0.0", 5342 + "devlop": "^1.0.0", 5343 + "mdast-util-from-markdown": "^2.0.0", 5344 + "mdast-util-to-markdown": "^2.0.0" 5345 + }, 5346 + "funding": { 5347 + "type": "opencollective", 5348 + "url": "https://opencollective.com/unified" 5349 + } 5350 + }, 5351 + "node_modules/mdast-util-math": { 5352 + "version": "3.0.0", 5353 + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", 5354 + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", 5355 + "license": "MIT", 5356 + "dependencies": { 5357 + "@types/hast": "^3.0.0", 5358 + "@types/mdast": "^4.0.0", 5359 + "devlop": "^1.0.0", 5360 + "longest-streak": "^3.0.0", 5361 + "mdast-util-from-markdown": "^2.0.0", 5362 + "mdast-util-to-markdown": "^2.1.0", 5363 + "unist-util-remove-position": "^5.0.0" 5364 + }, 5365 + "funding": { 5366 + "type": "opencollective", 5367 + "url": "https://opencollective.com/unified" 5368 + } 5369 + }, 5370 + "node_modules/mdast-util-mdx": { 5371 + "version": "3.0.0", 5372 + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", 5373 + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", 5374 + "license": "MIT", 5375 + "dependencies": { 5376 + "mdast-util-from-markdown": "^2.0.0", 5377 + "mdast-util-mdx-expression": "^2.0.0", 5378 + "mdast-util-mdx-jsx": "^3.0.0", 5379 + "mdast-util-mdxjs-esm": "^2.0.0", 5380 + "mdast-util-to-markdown": "^2.0.0" 5381 + }, 5382 + "funding": { 5383 + "type": "opencollective", 5384 + "url": "https://opencollective.com/unified" 5385 + } 5386 + }, 5387 + "node_modules/mdast-util-mdx-expression": { 5388 + "version": "2.0.1", 5389 + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", 5390 + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", 5391 + "license": "MIT", 5392 + "dependencies": { 5393 + "@types/estree-jsx": "^1.0.0", 5394 + "@types/hast": "^3.0.0", 5395 + "@types/mdast": "^4.0.0", 5396 + "devlop": "^1.0.0", 5397 + "mdast-util-from-markdown": "^2.0.0", 5398 + "mdast-util-to-markdown": "^2.0.0" 5399 + }, 5400 + "funding": { 5401 + "type": "opencollective", 5402 + "url": "https://opencollective.com/unified" 5403 + } 5404 + }, 5405 + "node_modules/mdast-util-mdx-jsx": { 5406 + "version": "3.2.0", 5407 + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", 5408 + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", 5409 + "license": "MIT", 5410 + "dependencies": { 5411 + "@types/estree-jsx": "^1.0.0", 5412 + "@types/hast": "^3.0.0", 5413 + "@types/mdast": "^4.0.0", 5414 + "@types/unist": "^3.0.0", 5415 + "ccount": "^2.0.0", 5416 + "devlop": "^1.1.0", 5417 + "mdast-util-from-markdown": "^2.0.0", 5418 + "mdast-util-to-markdown": "^2.0.0", 5419 + "parse-entities": "^4.0.0", 5420 + "stringify-entities": "^4.0.0", 5421 + "unist-util-stringify-position": "^4.0.0", 5422 + "vfile-message": "^4.0.0" 5423 + }, 5424 + "funding": { 5425 + "type": "opencollective", 5426 + "url": "https://opencollective.com/unified" 5427 + } 5428 + }, 5429 + "node_modules/mdast-util-mdxjs-esm": { 5430 + "version": "2.0.1", 5431 + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", 5432 + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", 5433 + "license": "MIT", 5434 + "dependencies": { 5435 + "@types/estree-jsx": "^1.0.0", 5436 + "@types/hast": "^3.0.0", 5437 + "@types/mdast": "^4.0.0", 5438 + "devlop": "^1.0.0", 5439 + "mdast-util-from-markdown": "^2.0.0", 5440 + "mdast-util-to-markdown": "^2.0.0" 5441 + }, 5442 + "funding": { 5443 + "type": "opencollective", 5444 + "url": "https://opencollective.com/unified" 5445 + } 5446 + }, 5447 + "node_modules/mdast-util-phrasing": { 5448 + "version": "4.1.0", 5449 + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", 5450 + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", 5451 + "license": "MIT", 5452 + "dependencies": { 5453 + "@types/mdast": "^4.0.0", 5454 + "unist-util-is": "^6.0.0" 5455 + }, 5456 + "funding": { 5457 + "type": "opencollective", 5458 + "url": "https://opencollective.com/unified" 5459 + } 5460 + }, 5461 + "node_modules/mdast-util-to-hast": { 5462 + "version": "13.2.0", 5463 + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", 5464 + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", 5465 + "license": "MIT", 5466 + "dependencies": { 5467 + "@types/hast": "^3.0.0", 5468 + "@types/mdast": "^4.0.0", 5469 + "@ungap/structured-clone": "^1.0.0", 5470 + "devlop": "^1.0.0", 5471 + "micromark-util-sanitize-uri": "^2.0.0", 5472 + "trim-lines": "^3.0.0", 5473 + "unist-util-position": "^5.0.0", 5474 + "unist-util-visit": "^5.0.0", 5475 + "vfile": "^6.0.0" 5476 + }, 5477 + "funding": { 5478 + "type": "opencollective", 5479 + "url": "https://opencollective.com/unified" 5480 + } 5481 + }, 5482 + "node_modules/mdast-util-to-markdown": { 5483 + "version": "2.1.2", 5484 + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", 5485 + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", 5486 + "license": "MIT", 5487 + "dependencies": { 5488 + "@types/mdast": "^4.0.0", 5489 + "@types/unist": "^3.0.0", 5490 + "longest-streak": "^3.0.0", 5491 + "mdast-util-phrasing": "^4.0.0", 5492 + "mdast-util-to-string": "^4.0.0", 5493 + "micromark-util-classify-character": "^2.0.0", 5494 + "micromark-util-decode-string": "^2.0.0", 5495 + "unist-util-visit": "^5.0.0", 5496 + "zwitch": "^2.0.0" 5497 + }, 5498 + "funding": { 5499 + "type": "opencollective", 5500 + "url": "https://opencollective.com/unified" 5501 + } 5502 + }, 5503 + "node_modules/mdast-util-to-string": { 5504 + "version": "4.0.0", 5505 + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", 5506 + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", 5507 + "license": "MIT", 5508 + "dependencies": { 5509 + "@types/mdast": "^4.0.0" 5510 + }, 5511 + "funding": { 5512 + "type": "opencollective", 5513 + "url": "https://opencollective.com/unified" 5514 + } 5515 + }, 5516 + "node_modules/mdurl": { 5517 + "version": "2.0.0", 5518 + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", 5519 + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", 5520 + "license": "MIT" 5521 + }, 5522 + "node_modules/micromark": { 5523 + "version": "4.0.2", 5524 + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", 5525 + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", 5526 + "funding": [ 5527 + { 5528 + "type": "GitHub Sponsors", 5529 + "url": "https://github.com/sponsors/unifiedjs" 5530 + }, 5531 + { 5532 + "type": "OpenCollective", 5533 + "url": "https://opencollective.com/unified" 5534 + } 5535 + ], 5536 + "license": "MIT", 5537 + "dependencies": { 5538 + "@types/debug": "^4.0.0", 5539 + "debug": "^4.0.0", 5540 + "decode-named-character-reference": "^1.0.0", 5541 + "devlop": "^1.0.0", 5542 + "micromark-core-commonmark": "^2.0.0", 5543 + "micromark-factory-space": "^2.0.0", 5544 + "micromark-util-character": "^2.0.0", 5545 + "micromark-util-chunked": "^2.0.0", 5546 + "micromark-util-combine-extensions": "^2.0.0", 5547 + "micromark-util-decode-numeric-character-reference": "^2.0.0", 5548 + "micromark-util-encode": "^2.0.0", 5549 + "micromark-util-normalize-identifier": "^2.0.0", 5550 + "micromark-util-resolve-all": "^2.0.0", 5551 + "micromark-util-sanitize-uri": "^2.0.0", 5552 + "micromark-util-subtokenize": "^2.0.0", 5553 + "micromark-util-symbol": "^2.0.0", 5554 + "micromark-util-types": "^2.0.0" 5555 + } 5556 + }, 5557 + "node_modules/micromark-core-commonmark": { 5558 + "version": "2.0.3", 5559 + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", 5560 + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", 5561 + "funding": [ 5562 + { 5563 + "type": "GitHub Sponsors", 5564 + "url": "https://github.com/sponsors/unifiedjs" 5565 + }, 5566 + { 5567 + "type": "OpenCollective", 5568 + "url": "https://opencollective.com/unified" 5569 + } 5570 + ], 5571 + "license": "MIT", 5572 + "dependencies": { 5573 + "decode-named-character-reference": "^1.0.0", 5574 + "devlop": "^1.0.0", 5575 + "micromark-factory-destination": "^2.0.0", 5576 + "micromark-factory-label": "^2.0.0", 5577 + "micromark-factory-space": "^2.0.0", 5578 + "micromark-factory-title": "^2.0.0", 5579 + "micromark-factory-whitespace": "^2.0.0", 5580 + "micromark-util-character": "^2.0.0", 5581 + "micromark-util-chunked": "^2.0.0", 5582 + "micromark-util-classify-character": "^2.0.0", 5583 + "micromark-util-html-tag-name": "^2.0.0", 5584 + "micromark-util-normalize-identifier": "^2.0.0", 5585 + "micromark-util-resolve-all": "^2.0.0", 5586 + "micromark-util-subtokenize": "^2.0.0", 5587 + "micromark-util-symbol": "^2.0.0", 5588 + "micromark-util-types": "^2.0.0" 5589 + } 5590 + }, 5591 + "node_modules/micromark-extension-directive": { 5592 + "version": "4.0.0", 5593 + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", 5594 + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", 5595 + "license": "MIT", 5596 + "dependencies": { 5597 + "devlop": "^1.0.0", 5598 + "micromark-factory-space": "^2.0.0", 5599 + "micromark-factory-whitespace": "^2.0.0", 5600 + "micromark-util-character": "^2.0.0", 5601 + "micromark-util-symbol": "^2.0.0", 5602 + "micromark-util-types": "^2.0.0", 5603 + "parse-entities": "^4.0.0" 5604 + }, 5605 + "funding": { 5606 + "type": "opencollective", 5607 + "url": "https://opencollective.com/unified" 5608 + } 5609 + }, 5610 + "node_modules/micromark-extension-gfm": { 5611 + "version": "3.0.0", 5612 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", 5613 + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", 5614 + "license": "MIT", 5615 + "dependencies": { 5616 + "micromark-extension-gfm-autolink-literal": "^2.0.0", 5617 + "micromark-extension-gfm-footnote": "^2.0.0", 5618 + "micromark-extension-gfm-strikethrough": "^2.0.0", 5619 + "micromark-extension-gfm-table": "^2.0.0", 5620 + "micromark-extension-gfm-tagfilter": "^2.0.0", 5621 + "micromark-extension-gfm-task-list-item": "^2.0.0", 5622 + "micromark-util-combine-extensions": "^2.0.0", 5623 + "micromark-util-types": "^2.0.0" 5624 + }, 5625 + "funding": { 5626 + "type": "opencollective", 5627 + "url": "https://opencollective.com/unified" 5628 + } 5629 + }, 5630 + "node_modules/micromark-extension-gfm-autolink-literal": { 5631 + "version": "2.1.0", 5632 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", 5633 + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", 5634 + "license": "MIT", 5635 + "dependencies": { 5636 + "micromark-util-character": "^2.0.0", 5637 + "micromark-util-sanitize-uri": "^2.0.0", 5638 + "micromark-util-symbol": "^2.0.0", 5639 + "micromark-util-types": "^2.0.0" 5640 + }, 5641 + "funding": { 5642 + "type": "opencollective", 5643 + "url": "https://opencollective.com/unified" 5644 + } 5645 + }, 5646 + "node_modules/micromark-extension-gfm-footnote": { 5647 + "version": "2.1.0", 5648 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", 5649 + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", 5650 + "license": "MIT", 5651 + "dependencies": { 5652 + "devlop": "^1.0.0", 5653 + "micromark-core-commonmark": "^2.0.0", 5654 + "micromark-factory-space": "^2.0.0", 5655 + "micromark-util-character": "^2.0.0", 5656 + "micromark-util-normalize-identifier": "^2.0.0", 5657 + "micromark-util-sanitize-uri": "^2.0.0", 5658 + "micromark-util-symbol": "^2.0.0", 5659 + "micromark-util-types": "^2.0.0" 5660 + }, 5661 + "funding": { 5662 + "type": "opencollective", 5663 + "url": "https://opencollective.com/unified" 5664 + } 5665 + }, 5666 + "node_modules/micromark-extension-gfm-strikethrough": { 5667 + "version": "2.1.0", 5668 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", 5669 + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", 5670 + "license": "MIT", 5671 + "dependencies": { 5672 + "devlop": "^1.0.0", 5673 + "micromark-util-chunked": "^2.0.0", 5674 + "micromark-util-classify-character": "^2.0.0", 5675 + "micromark-util-resolve-all": "^2.0.0", 5676 + "micromark-util-symbol": "^2.0.0", 5677 + "micromark-util-types": "^2.0.0" 5678 + }, 5679 + "funding": { 5680 + "type": "opencollective", 5681 + "url": "https://opencollective.com/unified" 5682 + } 5683 + }, 5684 + "node_modules/micromark-extension-gfm-table": { 5685 + "version": "2.1.1", 5686 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", 5687 + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", 5688 + "license": "MIT", 5689 + "dependencies": { 5690 + "devlop": "^1.0.0", 5691 + "micromark-factory-space": "^2.0.0", 5692 + "micromark-util-character": "^2.0.0", 5693 + "micromark-util-symbol": "^2.0.0", 5694 + "micromark-util-types": "^2.0.0" 5695 + }, 5696 + "funding": { 5697 + "type": "opencollective", 5698 + "url": "https://opencollective.com/unified" 5699 + } 5700 + }, 5701 + "node_modules/micromark-extension-gfm-tagfilter": { 5702 + "version": "2.0.0", 5703 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", 5704 + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", 5705 + "license": "MIT", 5706 + "dependencies": { 5707 + "micromark-util-types": "^2.0.0" 5708 + }, 5709 + "funding": { 5710 + "type": "opencollective", 5711 + "url": "https://opencollective.com/unified" 5712 + } 5713 + }, 5714 + "node_modules/micromark-extension-gfm-task-list-item": { 5715 + "version": "2.1.0", 5716 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", 5717 + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", 5718 + "license": "MIT", 5719 + "dependencies": { 5720 + "devlop": "^1.0.0", 5721 + "micromark-factory-space": "^2.0.0", 5722 + "micromark-util-character": "^2.0.0", 5723 + "micromark-util-symbol": "^2.0.0", 5724 + "micromark-util-types": "^2.0.0" 5725 + }, 5726 + "funding": { 5727 + "type": "opencollective", 5728 + "url": "https://opencollective.com/unified" 5729 + } 5730 + }, 5731 + "node_modules/micromark-extension-math": { 5732 + "version": "3.1.0", 5733 + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", 5734 + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", 5735 + "license": "MIT", 5736 + "dependencies": { 5737 + "@types/katex": "^0.16.0", 5738 + "devlop": "^1.0.0", 5739 + "katex": "^0.16.0", 5740 + "micromark-factory-space": "^2.0.0", 5741 + "micromark-util-character": "^2.0.0", 5742 + "micromark-util-symbol": "^2.0.0", 5743 + "micromark-util-types": "^2.0.0" 5744 + }, 5745 + "funding": { 5746 + "type": "opencollective", 5747 + "url": "https://opencollective.com/unified" 5748 + } 5749 + }, 5750 + "node_modules/micromark-extension-mdx-expression": { 5751 + "version": "3.0.1", 5752 + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", 5753 + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", 5754 + "funding": [ 5755 + { 5756 + "type": "GitHub Sponsors", 5757 + "url": "https://github.com/sponsors/unifiedjs" 5758 + }, 5759 + { 5760 + "type": "OpenCollective", 5761 + "url": "https://opencollective.com/unified" 5762 + } 5763 + ], 5764 + "license": "MIT", 5765 + "dependencies": { 5766 + "@types/estree": "^1.0.0", 5767 + "devlop": "^1.0.0", 5768 + "micromark-factory-mdx-expression": "^2.0.0", 5769 + "micromark-factory-space": "^2.0.0", 5770 + "micromark-util-character": "^2.0.0", 5771 + "micromark-util-events-to-acorn": "^2.0.0", 5772 + "micromark-util-symbol": "^2.0.0", 5773 + "micromark-util-types": "^2.0.0" 5774 + } 5775 + }, 5776 + "node_modules/micromark-extension-mdx-jsx": { 5777 + "version": "3.0.2", 5778 + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", 5779 + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", 5780 + "license": "MIT", 5781 + "dependencies": { 5782 + "@types/estree": "^1.0.0", 5783 + "devlop": "^1.0.0", 5784 + "estree-util-is-identifier-name": "^3.0.0", 5785 + "micromark-factory-mdx-expression": "^2.0.0", 5786 + "micromark-factory-space": "^2.0.0", 5787 + "micromark-util-character": "^2.0.0", 5788 + "micromark-util-events-to-acorn": "^2.0.0", 5789 + "micromark-util-symbol": "^2.0.0", 5790 + "micromark-util-types": "^2.0.0", 5791 + "vfile-message": "^4.0.0" 5792 + }, 5793 + "funding": { 5794 + "type": "opencollective", 5795 + "url": "https://opencollective.com/unified" 5796 + } 5797 + }, 5798 + "node_modules/micromark-extension-mdx-md": { 5799 + "version": "2.0.0", 5800 + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", 5801 + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", 5802 + "license": "MIT", 5803 + "dependencies": { 5804 + "micromark-util-types": "^2.0.0" 5805 + }, 5806 + "funding": { 5807 + "type": "opencollective", 5808 + "url": "https://opencollective.com/unified" 5809 + } 5810 + }, 5811 + "node_modules/micromark-extension-mdxjs": { 5812 + "version": "3.0.0", 5813 + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", 5814 + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", 5815 + "license": "MIT", 5816 + "dependencies": { 5817 + "acorn": "^8.0.0", 5818 + "acorn-jsx": "^5.0.0", 5819 + "micromark-extension-mdx-expression": "^3.0.0", 5820 + "micromark-extension-mdx-jsx": "^3.0.0", 5821 + "micromark-extension-mdx-md": "^2.0.0", 5822 + "micromark-extension-mdxjs-esm": "^3.0.0", 5823 + "micromark-util-combine-extensions": "^2.0.0", 5824 + "micromark-util-types": "^2.0.0" 5825 + }, 5826 + "funding": { 5827 + "type": "opencollective", 5828 + "url": "https://opencollective.com/unified" 5829 + } 5830 + }, 5831 + "node_modules/micromark-extension-mdxjs-esm": { 5832 + "version": "3.0.0", 5833 + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", 5834 + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", 5835 + "license": "MIT", 5836 + "dependencies": { 5837 + "@types/estree": "^1.0.0", 5838 + "devlop": "^1.0.0", 5839 + "micromark-core-commonmark": "^2.0.0", 5840 + "micromark-util-character": "^2.0.0", 5841 + "micromark-util-events-to-acorn": "^2.0.0", 5842 + "micromark-util-symbol": "^2.0.0", 5843 + "micromark-util-types": "^2.0.0", 5844 + "unist-util-position-from-estree": "^2.0.0", 5845 + "vfile-message": "^4.0.0" 5846 + }, 5847 + "funding": { 5848 + "type": "opencollective", 5849 + "url": "https://opencollective.com/unified" 5850 + } 5851 + }, 5852 + "node_modules/micromark-factory-destination": { 5853 + "version": "2.0.1", 5854 + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", 5855 + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", 5856 + "funding": [ 5857 + { 5858 + "type": "GitHub Sponsors", 5859 + "url": "https://github.com/sponsors/unifiedjs" 5860 + }, 5861 + { 5862 + "type": "OpenCollective", 5863 + "url": "https://opencollective.com/unified" 5864 + } 5865 + ], 5866 + "license": "MIT", 5867 + "dependencies": { 5868 + "micromark-util-character": "^2.0.0", 5869 + "micromark-util-symbol": "^2.0.0", 5870 + "micromark-util-types": "^2.0.0" 5871 + } 5872 + }, 5873 + "node_modules/micromark-factory-label": { 5874 + "version": "2.0.1", 5875 + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", 5876 + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", 5877 + "funding": [ 5878 + { 5879 + "type": "GitHub Sponsors", 5880 + "url": "https://github.com/sponsors/unifiedjs" 5881 + }, 5882 + { 5883 + "type": "OpenCollective", 5884 + "url": "https://opencollective.com/unified" 5885 + } 5886 + ], 5887 + "license": "MIT", 5888 + "dependencies": { 5889 + "devlop": "^1.0.0", 5890 + "micromark-util-character": "^2.0.0", 5891 + "micromark-util-symbol": "^2.0.0", 5892 + "micromark-util-types": "^2.0.0" 5893 + } 5894 + }, 5895 + "node_modules/micromark-factory-mdx-expression": { 5896 + "version": "2.0.3", 5897 + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", 5898 + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", 5899 + "funding": [ 5900 + { 5901 + "type": "GitHub Sponsors", 5902 + "url": "https://github.com/sponsors/unifiedjs" 5903 + }, 5904 + { 5905 + "type": "OpenCollective", 5906 + "url": "https://opencollective.com/unified" 5907 + } 5908 + ], 5909 + "license": "MIT", 5910 + "dependencies": { 5911 + "@types/estree": "^1.0.0", 5912 + "devlop": "^1.0.0", 5913 + "micromark-factory-space": "^2.0.0", 5914 + "micromark-util-character": "^2.0.0", 5915 + "micromark-util-events-to-acorn": "^2.0.0", 5916 + "micromark-util-symbol": "^2.0.0", 5917 + "micromark-util-types": "^2.0.0", 5918 + "unist-util-position-from-estree": "^2.0.0", 5919 + "vfile-message": "^4.0.0" 5920 + } 5921 + }, 5922 + "node_modules/micromark-factory-space": { 5923 + "version": "2.0.1", 5924 + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", 5925 + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", 5926 + "funding": [ 5927 + { 5928 + "type": "GitHub Sponsors", 5929 + "url": "https://github.com/sponsors/unifiedjs" 5930 + }, 5931 + { 5932 + "type": "OpenCollective", 5933 + "url": "https://opencollective.com/unified" 5934 + } 5935 + ], 5936 + "license": "MIT", 5937 + "dependencies": { 5938 + "micromark-util-character": "^2.0.0", 5939 + "micromark-util-types": "^2.0.0" 5940 + } 5941 + }, 5942 + "node_modules/micromark-factory-title": { 5943 + "version": "2.0.1", 5944 + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", 5945 + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", 5946 + "funding": [ 5947 + { 5948 + "type": "GitHub Sponsors", 5949 + "url": "https://github.com/sponsors/unifiedjs" 5950 + }, 5951 + { 5952 + "type": "OpenCollective", 5953 + "url": "https://opencollective.com/unified" 5954 + } 5955 + ], 5956 + "license": "MIT", 5957 + "dependencies": { 5958 + "micromark-factory-space": "^2.0.0", 5959 + "micromark-util-character": "^2.0.0", 5960 + "micromark-util-symbol": "^2.0.0", 5961 + "micromark-util-types": "^2.0.0" 5962 + } 5963 + }, 5964 + "node_modules/micromark-factory-whitespace": { 5965 + "version": "2.0.1", 5966 + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", 5967 + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", 5968 + "funding": [ 5969 + { 5970 + "type": "GitHub Sponsors", 5971 + "url": "https://github.com/sponsors/unifiedjs" 5972 + }, 5973 + { 5974 + "type": "OpenCollective", 5975 + "url": "https://opencollective.com/unified" 5976 + } 5977 + ], 5978 + "license": "MIT", 5979 + "dependencies": { 5980 + "micromark-factory-space": "^2.0.0", 5981 + "micromark-util-character": "^2.0.0", 5982 + "micromark-util-symbol": "^2.0.0", 5983 + "micromark-util-types": "^2.0.0" 5984 + } 5985 + }, 5986 + "node_modules/micromark-util-character": { 5987 + "version": "2.1.1", 5988 + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", 5989 + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", 5990 + "funding": [ 5991 + { 5992 + "type": "GitHub Sponsors", 5993 + "url": "https://github.com/sponsors/unifiedjs" 5994 + }, 5995 + { 5996 + "type": "OpenCollective", 5997 + "url": "https://opencollective.com/unified" 5998 + } 5999 + ], 6000 + "license": "MIT", 6001 + "dependencies": { 6002 + "micromark-util-symbol": "^2.0.0", 6003 + "micromark-util-types": "^2.0.0" 6004 + } 6005 + }, 6006 + "node_modules/micromark-util-chunked": { 6007 + "version": "2.0.1", 6008 + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", 6009 + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", 6010 + "funding": [ 6011 + { 6012 + "type": "GitHub Sponsors", 6013 + "url": "https://github.com/sponsors/unifiedjs" 6014 + }, 6015 + { 6016 + "type": "OpenCollective", 6017 + "url": "https://opencollective.com/unified" 6018 + } 6019 + ], 6020 + "license": "MIT", 6021 + "dependencies": { 6022 + "micromark-util-symbol": "^2.0.0" 6023 + } 6024 + }, 6025 + "node_modules/micromark-util-classify-character": { 6026 + "version": "2.0.1", 6027 + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", 6028 + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", 6029 + "funding": [ 6030 + { 6031 + "type": "GitHub Sponsors", 6032 + "url": "https://github.com/sponsors/unifiedjs" 6033 + }, 6034 + { 6035 + "type": "OpenCollective", 6036 + "url": "https://opencollective.com/unified" 6037 + } 6038 + ], 6039 + "license": "MIT", 6040 + "dependencies": { 6041 + "micromark-util-character": "^2.0.0", 6042 + "micromark-util-symbol": "^2.0.0", 6043 + "micromark-util-types": "^2.0.0" 6044 + } 6045 + }, 6046 + "node_modules/micromark-util-combine-extensions": { 6047 + "version": "2.0.1", 6048 + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", 6049 + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", 6050 + "funding": [ 6051 + { 6052 + "type": "GitHub Sponsors", 6053 + "url": "https://github.com/sponsors/unifiedjs" 6054 + }, 6055 + { 6056 + "type": "OpenCollective", 6057 + "url": "https://opencollective.com/unified" 6058 + } 6059 + ], 6060 + "license": "MIT", 6061 + "dependencies": { 6062 + "micromark-util-chunked": "^2.0.0", 6063 + "micromark-util-types": "^2.0.0" 6064 + } 6065 + }, 6066 + "node_modules/micromark-util-decode-numeric-character-reference": { 6067 + "version": "2.0.2", 6068 + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", 6069 + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", 6070 + "funding": [ 6071 + { 6072 + "type": "GitHub Sponsors", 6073 + "url": "https://github.com/sponsors/unifiedjs" 6074 + }, 6075 + { 6076 + "type": "OpenCollective", 6077 + "url": "https://opencollective.com/unified" 6078 + } 6079 + ], 6080 + "license": "MIT", 6081 + "dependencies": { 6082 + "micromark-util-symbol": "^2.0.0" 6083 + } 6084 + }, 6085 + "node_modules/micromark-util-decode-string": { 6086 + "version": "2.0.1", 6087 + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", 6088 + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", 6089 + "funding": [ 6090 + { 6091 + "type": "GitHub Sponsors", 6092 + "url": "https://github.com/sponsors/unifiedjs" 6093 + }, 6094 + { 6095 + "type": "OpenCollective", 6096 + "url": "https://opencollective.com/unified" 6097 + } 6098 + ], 6099 + "license": "MIT", 6100 + "dependencies": { 6101 + "decode-named-character-reference": "^1.0.0", 6102 + "micromark-util-character": "^2.0.0", 6103 + "micromark-util-decode-numeric-character-reference": "^2.0.0", 6104 + "micromark-util-symbol": "^2.0.0" 6105 + } 6106 + }, 6107 + "node_modules/micromark-util-encode": { 6108 + "version": "2.0.1", 6109 + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", 6110 + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", 6111 + "funding": [ 6112 + { 6113 + "type": "GitHub Sponsors", 6114 + "url": "https://github.com/sponsors/unifiedjs" 6115 + }, 6116 + { 6117 + "type": "OpenCollective", 6118 + "url": "https://opencollective.com/unified" 6119 + } 6120 + ], 6121 + "license": "MIT" 6122 + }, 6123 + "node_modules/micromark-util-events-to-acorn": { 6124 + "version": "2.0.3", 6125 + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", 6126 + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", 6127 + "funding": [ 6128 + { 6129 + "type": "GitHub Sponsors", 6130 + "url": "https://github.com/sponsors/unifiedjs" 6131 + }, 6132 + { 6133 + "type": "OpenCollective", 6134 + "url": "https://opencollective.com/unified" 6135 + } 6136 + ], 6137 + "license": "MIT", 6138 + "dependencies": { 6139 + "@types/estree": "^1.0.0", 6140 + "@types/unist": "^3.0.0", 6141 + "devlop": "^1.0.0", 6142 + "estree-util-visit": "^2.0.0", 6143 + "micromark-util-symbol": "^2.0.0", 6144 + "micromark-util-types": "^2.0.0", 6145 + "vfile-message": "^4.0.0" 6146 + } 6147 + }, 6148 + "node_modules/micromark-util-html-tag-name": { 6149 + "version": "2.0.1", 6150 + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", 6151 + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", 6152 + "funding": [ 6153 + { 6154 + "type": "GitHub Sponsors", 6155 + "url": "https://github.com/sponsors/unifiedjs" 6156 + }, 6157 + { 6158 + "type": "OpenCollective", 6159 + "url": "https://opencollective.com/unified" 6160 + } 6161 + ], 6162 + "license": "MIT" 6163 + }, 6164 + "node_modules/micromark-util-normalize-identifier": { 6165 + "version": "2.0.1", 6166 + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", 6167 + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", 6168 + "funding": [ 6169 + { 6170 + "type": "GitHub Sponsors", 6171 + "url": "https://github.com/sponsors/unifiedjs" 6172 + }, 6173 + { 6174 + "type": "OpenCollective", 6175 + "url": "https://opencollective.com/unified" 6176 + } 6177 + ], 6178 + "license": "MIT", 6179 + "dependencies": { 6180 + "micromark-util-symbol": "^2.0.0" 6181 + } 6182 + }, 6183 + "node_modules/micromark-util-resolve-all": { 6184 + "version": "2.0.1", 6185 + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", 6186 + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", 6187 + "funding": [ 6188 + { 6189 + "type": "GitHub Sponsors", 6190 + "url": "https://github.com/sponsors/unifiedjs" 6191 + }, 6192 + { 6193 + "type": "OpenCollective", 6194 + "url": "https://opencollective.com/unified" 6195 + } 6196 + ], 6197 + "license": "MIT", 6198 + "dependencies": { 6199 + "micromark-util-types": "^2.0.0" 6200 + } 6201 + }, 6202 + "node_modules/micromark-util-sanitize-uri": { 6203 + "version": "2.0.1", 6204 + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", 6205 + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", 6206 + "funding": [ 6207 + { 6208 + "type": "GitHub Sponsors", 6209 + "url": "https://github.com/sponsors/unifiedjs" 6210 + }, 6211 + { 6212 + "type": "OpenCollective", 6213 + "url": "https://opencollective.com/unified" 6214 + } 6215 + ], 6216 + "license": "MIT", 6217 + "dependencies": { 6218 + "micromark-util-character": "^2.0.0", 6219 + "micromark-util-encode": "^2.0.0", 6220 + "micromark-util-symbol": "^2.0.0" 6221 + } 6222 + }, 6223 + "node_modules/micromark-util-subtokenize": { 6224 + "version": "2.1.0", 6225 + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", 6226 + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", 6227 + "funding": [ 6228 + { 6229 + "type": "GitHub Sponsors", 6230 + "url": "https://github.com/sponsors/unifiedjs" 6231 + }, 6232 + { 6233 + "type": "OpenCollective", 6234 + "url": "https://opencollective.com/unified" 6235 + } 6236 + ], 6237 + "license": "MIT", 6238 + "dependencies": { 6239 + "devlop": "^1.0.0", 6240 + "micromark-util-chunked": "^2.0.0", 6241 + "micromark-util-symbol": "^2.0.0", 6242 + "micromark-util-types": "^2.0.0" 6243 + } 6244 + }, 6245 + "node_modules/micromark-util-symbol": { 6246 + "version": "2.0.1", 6247 + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", 6248 + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", 6249 + "funding": [ 6250 + { 6251 + "type": "GitHub Sponsors", 6252 + "url": "https://github.com/sponsors/unifiedjs" 6253 + }, 6254 + { 6255 + "type": "OpenCollective", 6256 + "url": "https://opencollective.com/unified" 6257 + } 6258 + ], 6259 + "license": "MIT" 6260 + }, 6261 + "node_modules/micromark-util-types": { 6262 + "version": "2.0.2", 6263 + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", 6264 + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", 6265 + "funding": [ 6266 + { 6267 + "type": "GitHub Sponsors", 6268 + "url": "https://github.com/sponsors/unifiedjs" 6269 + }, 6270 + { 6271 + "type": "OpenCollective", 6272 + "url": "https://opencollective.com/unified" 6273 + } 6274 + ], 6275 + "license": "MIT" 6276 + }, 6277 + "node_modules/micromatch": { 6278 + "version": "4.0.8", 6279 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 6280 + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 6281 + "dev": true, 6282 + "license": "MIT", 6283 + "optional": true, 6284 + "dependencies": { 6285 + "braces": "^3.0.3", 6286 + "picomatch": "^2.3.1" 6287 + }, 6288 + "engines": { 6289 + "node": ">=8.6" 6290 + } 6291 + }, 6292 + "node_modules/micromatch/node_modules/picomatch": { 6293 + "version": "2.3.1", 6294 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 6295 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 6296 + "dev": true, 6297 + "license": "MIT", 6298 + "optional": true, 6299 + "engines": { 6300 + "node": ">=8.6" 6301 + }, 6302 + "funding": { 6303 + "url": "https://github.com/sponsors/jonschlinkert" 6304 + } 6305 + }, 6306 + "node_modules/minipass": { 6307 + "version": "7.1.2", 6308 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 6309 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 6310 + "license": "ISC", 6311 + "engines": { 6312 + "node": ">=16 || 14 >=14.17" 6313 + } 6314 + }, 6315 + "node_modules/minizlib": { 6316 + "version": "3.0.2", 6317 + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", 6318 + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", 6319 + "license": "MIT", 6320 + "dependencies": { 6321 + "minipass": "^7.1.2" 6322 + }, 6323 + "engines": { 6324 + "node": ">= 18" 6325 + } 6326 + }, 6327 + "node_modules/mkdirp": { 6328 + "version": "3.0.1", 6329 + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", 6330 + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 6331 + "license": "MIT", 6332 + "bin": { 6333 + "mkdirp": "dist/cjs/src/bin.js" 6334 + }, 6335 + "engines": { 6336 + "node": ">=10" 6337 + }, 6338 + "funding": { 6339 + "url": "https://github.com/sponsors/isaacs" 6340 + } 6341 + }, 6342 + "node_modules/mrmime": { 6343 + "version": "2.0.1", 6344 + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", 6345 + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", 6346 + "license": "MIT", 6347 + "engines": { 6348 + "node": ">=10" 6349 + } 6350 + }, 6351 + "node_modules/ms": { 6352 + "version": "2.1.3", 6353 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 6354 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 6355 + "license": "MIT" 6356 + }, 6357 + "node_modules/nanoid": { 6358 + "version": "3.3.11", 6359 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 6360 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 6361 + "funding": [ 6362 + { 6363 + "type": "github", 6364 + "url": "https://github.com/sponsors/ai" 6365 + } 6366 + ], 6367 + "license": "MIT", 6368 + "bin": { 6369 + "nanoid": "bin/nanoid.cjs" 6370 + }, 6371 + "engines": { 6372 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 6373 + } 6374 + }, 6375 + "node_modules/neotraverse": { 6376 + "version": "0.6.18", 6377 + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", 6378 + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", 6379 + "license": "MIT", 6380 + "engines": { 6381 + "node": ">= 10" 6382 + } 6383 + }, 6384 + "node_modules/nlcst-to-string": { 6385 + "version": "4.0.0", 6386 + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", 6387 + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", 6388 + "license": "MIT", 6389 + "dependencies": { 6390 + "@types/nlcst": "^2.0.0" 6391 + }, 6392 + "funding": { 6393 + "type": "opencollective", 6394 + "url": "https://opencollective.com/unified" 6395 + } 6396 + }, 6397 + "node_modules/node-addon-api": { 6398 + "version": "7.1.1", 6399 + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 6400 + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", 6401 + "dev": true, 6402 + "license": "MIT", 6403 + "optional": true 6404 + }, 6405 + "node_modules/node-fetch": { 6406 + "version": "2.7.0", 6407 + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 6408 + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 6409 + "license": "MIT", 6410 + "dependencies": { 6411 + "whatwg-url": "^5.0.0" 6412 + }, 6413 + "engines": { 6414 + "node": "4.x || >=6.0.0" 6415 + }, 6416 + "peerDependencies": { 6417 + "encoding": "^0.1.0" 6418 + }, 6419 + "peerDependenciesMeta": { 6420 + "encoding": { 6421 + "optional": true 6422 + } 6423 + } 6424 + }, 6425 + "node_modules/node-fetch-native": { 6426 + "version": "1.6.6", 6427 + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", 6428 + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", 6429 + "license": "MIT" 6430 + }, 6431 + "node_modules/node-mock-http": { 6432 + "version": "1.0.1", 6433 + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.1.tgz", 6434 + "integrity": "sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==", 6435 + "license": "MIT" 6436 + }, 6437 + "node_modules/normalize-path": { 6438 + "version": "3.0.0", 6439 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 6440 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 6441 + "license": "MIT", 6442 + "engines": { 6443 + "node": ">=0.10.0" 6444 + } 6445 + }, 6446 + "node_modules/nth-check": { 6447 + "version": "2.1.1", 6448 + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 6449 + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 6450 + "license": "BSD-2-Clause", 6451 + "dependencies": { 6452 + "boolbase": "^1.0.0" 6453 + }, 6454 + "funding": { 6455 + "url": "https://github.com/fb55/nth-check?sponsor=1" 6456 + } 6457 + }, 6458 + "node_modules/ofetch": { 6459 + "version": "1.4.1", 6460 + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", 6461 + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", 6462 + "license": "MIT", 6463 + "dependencies": { 6464 + "destr": "^2.0.3", 6465 + "node-fetch-native": "^1.6.4", 6466 + "ufo": "^1.5.4" 6467 + } 6468 + }, 6469 + "node_modules/ohash": { 6470 + "version": "2.0.11", 6471 + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", 6472 + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", 6473 + "license": "MIT" 6474 + }, 6475 + "node_modules/oniguruma-parser": { 6476 + "version": "0.12.1", 6477 + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", 6478 + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", 6479 + "license": "MIT" 6480 + }, 6481 + "node_modules/oniguruma-to-es": { 6482 + "version": "4.3.3", 6483 + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", 6484 + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", 6485 + "license": "MIT", 6486 + "dependencies": { 6487 + "oniguruma-parser": "^0.12.1", 6488 + "regex": "^6.0.1", 6489 + "regex-recursion": "^6.0.2" 6490 + } 6491 + }, 6492 + "node_modules/p-limit": { 6493 + "version": "6.2.0", 6494 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", 6495 + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", 6496 + "license": "MIT", 6497 + "dependencies": { 6498 + "yocto-queue": "^1.1.1" 6499 + }, 6500 + "engines": { 6501 + "node": ">=18" 6502 + }, 6503 + "funding": { 6504 + "url": "https://github.com/sponsors/sindresorhus" 6505 + } 6506 + }, 6507 + "node_modules/p-queue": { 6508 + "version": "8.1.0", 6509 + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", 6510 + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", 6511 + "license": "MIT", 6512 + "dependencies": { 6513 + "eventemitter3": "^5.0.1", 6514 + "p-timeout": "^6.1.2" 6515 + }, 6516 + "engines": { 6517 + "node": ">=18" 6518 + }, 6519 + "funding": { 6520 + "url": "https://github.com/sponsors/sindresorhus" 6521 + } 6522 + }, 6523 + "node_modules/p-timeout": { 6524 + "version": "6.1.4", 6525 + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", 6526 + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", 6527 + "license": "MIT", 6528 + "engines": { 6529 + "node": ">=14.16" 6530 + }, 6531 + "funding": { 6532 + "url": "https://github.com/sponsors/sindresorhus" 6533 + } 6534 + }, 6535 + "node_modules/package-manager-detector": { 6536 + "version": "1.3.0", 6537 + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", 6538 + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", 6539 + "license": "MIT" 6540 + }, 6541 + "node_modules/pagefind": { 6542 + "version": "1.4.0", 6543 + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.4.0.tgz", 6544 + "integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==", 6545 + "dev": true, 6546 + "license": "MIT", 6547 + "bin": { 6548 + "pagefind": "lib/runner/bin.cjs" 6549 + }, 6550 + "optionalDependencies": { 6551 + "@pagefind/darwin-arm64": "1.4.0", 6552 + "@pagefind/darwin-x64": "1.4.0", 6553 + "@pagefind/freebsd-x64": "1.4.0", 6554 + "@pagefind/linux-arm64": "1.4.0", 6555 + "@pagefind/linux-x64": "1.4.0", 6556 + "@pagefind/windows-x64": "1.4.0" 6557 + } 6558 + }, 6559 + "node_modules/pako": { 6560 + "version": "0.2.9", 6561 + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 6562 + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", 6563 + "license": "MIT" 6564 + }, 6565 + "node_modules/parse-css-color": { 6566 + "version": "0.2.1", 6567 + "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", 6568 + "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", 6569 + "license": "MIT", 6570 + "dependencies": { 6571 + "color-name": "^1.1.4", 6572 + "hex-rgb": "^4.1.0" 6573 + } 6574 + }, 6575 + "node_modules/parse-entities": { 6576 + "version": "4.0.2", 6577 + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", 6578 + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", 6579 + "license": "MIT", 6580 + "dependencies": { 6581 + "@types/unist": "^2.0.0", 6582 + "character-entities-legacy": "^3.0.0", 6583 + "character-reference-invalid": "^2.0.0", 6584 + "decode-named-character-reference": "^1.0.0", 6585 + "is-alphanumerical": "^2.0.0", 6586 + "is-decimal": "^2.0.0", 6587 + "is-hexadecimal": "^2.0.0" 6588 + }, 6589 + "funding": { 6590 + "type": "github", 6591 + "url": "https://github.com/sponsors/wooorm" 6592 + } 6593 + }, 6594 + "node_modules/parse-entities/node_modules/@types/unist": { 6595 + "version": "2.0.11", 6596 + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", 6597 + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", 6598 + "license": "MIT" 6599 + }, 6600 + "node_modules/parse-latin": { 6601 + "version": "7.0.0", 6602 + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", 6603 + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", 6604 + "license": "MIT", 6605 + "dependencies": { 6606 + "@types/nlcst": "^2.0.0", 6607 + "@types/unist": "^3.0.0", 6608 + "nlcst-to-string": "^4.0.0", 6609 + "unist-util-modify-children": "^4.0.0", 6610 + "unist-util-visit-children": "^3.0.0", 6611 + "vfile": "^6.0.0" 6612 + }, 6613 + "funding": { 6614 + "type": "github", 6615 + "url": "https://github.com/sponsors/wooorm" 6616 + } 6617 + }, 6618 + "node_modules/parse-srcset": { 6619 + "version": "1.0.2", 6620 + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", 6621 + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", 6622 + "license": "MIT" 6623 + }, 6624 + "node_modules/parse5": { 6625 + "version": "7.3.0", 6626 + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", 6627 + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", 6628 + "license": "MIT", 6629 + "dependencies": { 6630 + "entities": "^6.0.0" 6631 + }, 6632 + "funding": { 6633 + "url": "https://github.com/inikulin/parse5?sponsor=1" 6634 + } 6635 + }, 6636 + "node_modules/parse5/node_modules/entities": { 6637 + "version": "6.0.1", 6638 + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", 6639 + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", 6640 + "license": "BSD-2-Clause", 6641 + "engines": { 6642 + "node": ">=0.12" 6643 + }, 6644 + "funding": { 6645 + "url": "https://github.com/fb55/entities?sponsor=1" 6646 + } 6647 + }, 6648 + "node_modules/path-browserify": { 6649 + "version": "1.0.1", 6650 + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 6651 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 6652 + "license": "MIT" 6653 + }, 6654 + "node_modules/picocolors": { 6655 + "version": "1.1.1", 6656 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 6657 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 6658 + "license": "ISC" 6659 + }, 6660 + "node_modules/picomatch": { 6661 + "version": "4.0.2", 6662 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 6663 + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 6664 + "license": "MIT", 6665 + "engines": { 6666 + "node": ">=12" 6667 + }, 6668 + "funding": { 6669 + "url": "https://github.com/sponsors/jonschlinkert" 6670 + } 6671 + }, 6672 + "node_modules/postcss": { 6673 + "version": "8.5.6", 6674 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 6675 + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 6676 + "funding": [ 6677 + { 6678 + "type": "opencollective", 6679 + "url": "https://opencollective.com/postcss/" 6680 + }, 6681 + { 6682 + "type": "tidelift", 6683 + "url": "https://tidelift.com/funding/github/npm/postcss" 6684 + }, 6685 + { 6686 + "type": "github", 6687 + "url": "https://github.com/sponsors/ai" 6688 + } 6689 + ], 6690 + "license": "MIT", 6691 + "dependencies": { 6692 + "nanoid": "^3.3.11", 6693 + "picocolors": "^1.1.1", 6694 + "source-map-js": "^1.2.1" 6695 + }, 6696 + "engines": { 6697 + "node": "^10 || ^12 || >=14" 6698 + } 6699 + }, 6700 + "node_modules/postcss-nested": { 6701 + "version": "6.2.0", 6702 + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", 6703 + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", 6704 + "funding": [ 6705 + { 6706 + "type": "opencollective", 6707 + "url": "https://opencollective.com/postcss/" 6708 + }, 6709 + { 6710 + "type": "github", 6711 + "url": "https://github.com/sponsors/ai" 6712 + } 6713 + ], 6714 + "license": "MIT", 6715 + "dependencies": { 6716 + "postcss-selector-parser": "^6.1.1" 6717 + }, 6718 + "engines": { 6719 + "node": ">=12.0" 6720 + }, 6721 + "peerDependencies": { 6722 + "postcss": "^8.2.14" 6723 + } 6724 + }, 6725 + "node_modules/postcss-selector-parser": { 6726 + "version": "6.1.2", 6727 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 6728 + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 6729 + "license": "MIT", 6730 + "dependencies": { 6731 + "cssesc": "^3.0.0", 6732 + "util-deprecate": "^1.0.2" 6733 + }, 6734 + "engines": { 6735 + "node": ">=4" 6736 + } 6737 + }, 6738 + "node_modules/postcss-value-parser": { 6739 + "version": "4.2.0", 6740 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 6741 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 6742 + "license": "MIT" 6743 + }, 6744 + "node_modules/prettier": { 6745 + "version": "3.6.2", 6746 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", 6747 + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", 6748 + "dev": true, 6749 + "license": "MIT", 6750 + "bin": { 6751 + "prettier": "bin/prettier.cjs" 6752 + }, 6753 + "engines": { 6754 + "node": ">=14" 6755 + }, 6756 + "funding": { 6757 + "url": "https://github.com/prettier/prettier?sponsor=1" 6758 + } 6759 + }, 6760 + "node_modules/prettier-plugin-astro": { 6761 + "version": "0.14.1", 6762 + "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.14.1.tgz", 6763 + "integrity": "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==", 6764 + "dev": true, 6765 + "license": "MIT", 6766 + "dependencies": { 6767 + "@astrojs/compiler": "^2.9.1", 6768 + "prettier": "^3.0.0", 6769 + "sass-formatter": "^0.7.6" 6770 + }, 6771 + "engines": { 6772 + "node": "^14.15.0 || >=16.0.0" 6773 + } 6774 + }, 6775 + "node_modules/prismjs": { 6776 + "version": "1.30.0", 6777 + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", 6778 + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", 6779 + "license": "MIT", 6780 + "engines": { 6781 + "node": ">=6" 6782 + } 6783 + }, 6784 + "node_modules/prompts": { 6785 + "version": "2.4.2", 6786 + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 6787 + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 6788 + "license": "MIT", 6789 + "dependencies": { 6790 + "kleur": "^3.0.3", 6791 + "sisteransi": "^1.0.5" 6792 + }, 6793 + "engines": { 6794 + "node": ">= 6" 6795 + } 6796 + }, 6797 + "node_modules/prompts/node_modules/kleur": { 6798 + "version": "3.0.3", 6799 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 6800 + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 6801 + "license": "MIT", 6802 + "engines": { 6803 + "node": ">=6" 6804 + } 6805 + }, 6806 + "node_modules/property-information": { 6807 + "version": "7.1.0", 6808 + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", 6809 + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", 6810 + "license": "MIT", 6811 + "funding": { 6812 + "type": "github", 6813 + "url": "https://github.com/sponsors/wooorm" 6814 + } 6815 + }, 6816 + "node_modules/punycode.js": { 6817 + "version": "2.3.1", 6818 + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", 6819 + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", 6820 + "license": "MIT", 6821 + "engines": { 6822 + "node": ">=6" 6823 + } 6824 + }, 6825 + "node_modules/radix3": { 6826 + "version": "1.1.2", 6827 + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", 6828 + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", 6829 + "license": "MIT" 6830 + }, 6831 + "node_modules/readdirp": { 6832 + "version": "4.1.2", 6833 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 6834 + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 6835 + "license": "MIT", 6836 + "engines": { 6837 + "node": ">= 14.18.0" 6838 + }, 6839 + "funding": { 6840 + "type": "individual", 6841 + "url": "https://paulmillr.com/funding/" 6842 + } 6843 + }, 6844 + "node_modules/reading-time": { 6845 + "version": "1.5.0", 6846 + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", 6847 + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", 6848 + "license": "MIT" 6849 + }, 6850 + "node_modules/recma-build-jsx": { 6851 + "version": "1.0.0", 6852 + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", 6853 + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", 6854 + "license": "MIT", 6855 + "dependencies": { 6856 + "@types/estree": "^1.0.0", 6857 + "estree-util-build-jsx": "^3.0.0", 6858 + "vfile": "^6.0.0" 6859 + }, 6860 + "funding": { 6861 + "type": "opencollective", 6862 + "url": "https://opencollective.com/unified" 6863 + } 6864 + }, 6865 + "node_modules/recma-jsx": { 6866 + "version": "1.0.1", 6867 + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", 6868 + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", 6869 + "license": "MIT", 6870 + "dependencies": { 6871 + "acorn-jsx": "^5.0.0", 6872 + "estree-util-to-js": "^2.0.0", 6873 + "recma-parse": "^1.0.0", 6874 + "recma-stringify": "^1.0.0", 6875 + "unified": "^11.0.0" 6876 + }, 6877 + "funding": { 6878 + "type": "opencollective", 6879 + "url": "https://opencollective.com/unified" 6880 + }, 6881 + "peerDependencies": { 6882 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 6883 + } 6884 + }, 6885 + "node_modules/recma-parse": { 6886 + "version": "1.0.0", 6887 + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", 6888 + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", 6889 + "license": "MIT", 6890 + "dependencies": { 6891 + "@types/estree": "^1.0.0", 6892 + "esast-util-from-js": "^2.0.0", 6893 + "unified": "^11.0.0", 6894 + "vfile": "^6.0.0" 6895 + }, 6896 + "funding": { 6897 + "type": "opencollective", 6898 + "url": "https://opencollective.com/unified" 6899 + } 6900 + }, 6901 + "node_modules/recma-stringify": { 6902 + "version": "1.0.0", 6903 + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", 6904 + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", 6905 + "license": "MIT", 6906 + "dependencies": { 6907 + "@types/estree": "^1.0.0", 6908 + "estree-util-to-js": "^2.0.0", 6909 + "unified": "^11.0.0", 6910 + "vfile": "^6.0.0" 6911 + }, 6912 + "funding": { 6913 + "type": "opencollective", 6914 + "url": "https://opencollective.com/unified" 6915 + } 6916 + }, 6917 + "node_modules/regex": { 6918 + "version": "6.0.1", 6919 + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", 6920 + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", 6921 + "license": "MIT", 6922 + "dependencies": { 6923 + "regex-utilities": "^2.3.0" 6924 + } 6925 + }, 6926 + "node_modules/regex-recursion": { 6927 + "version": "6.0.2", 6928 + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", 6929 + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", 6930 + "license": "MIT", 6931 + "dependencies": { 6932 + "regex-utilities": "^2.3.0" 6933 + } 6934 + }, 6935 + "node_modules/regex-utilities": { 6936 + "version": "2.3.0", 6937 + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", 6938 + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", 6939 + "license": "MIT" 6940 + }, 6941 + "node_modules/rehype": { 6942 + "version": "13.0.2", 6943 + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", 6944 + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", 6945 + "license": "MIT", 6946 + "dependencies": { 6947 + "@types/hast": "^3.0.0", 6948 + "rehype-parse": "^9.0.0", 6949 + "rehype-stringify": "^10.0.0", 6950 + "unified": "^11.0.0" 6951 + }, 6952 + "funding": { 6953 + "type": "opencollective", 6954 + "url": "https://opencollective.com/unified" 6955 + } 6956 + }, 6957 + "node_modules/rehype-autolink-headings": { 6958 + "version": "7.1.0", 6959 + "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz", 6960 + "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==", 6961 + "license": "MIT", 6962 + "dependencies": { 6963 + "@types/hast": "^3.0.0", 6964 + "@ungap/structured-clone": "^1.0.0", 6965 + "hast-util-heading-rank": "^3.0.0", 6966 + "hast-util-is-element": "^3.0.0", 6967 + "unified": "^11.0.0", 6968 + "unist-util-visit": "^5.0.0" 6969 + }, 6970 + "funding": { 6971 + "type": "opencollective", 6972 + "url": "https://opencollective.com/unified" 6973 + } 6974 + }, 6975 + "node_modules/rehype-expressive-code": { 6976 + "version": "0.41.3", 6977 + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.3.tgz", 6978 + "integrity": "sha512-8d9Py4c/V6I/Od2VIXFAdpiO2kc0SV2qTJsRAaqSIcM9aruW4ASLNe2kOEo1inXAAkIhpFzAHTc358HKbvpNUg==", 6979 + "license": "MIT", 6980 + "dependencies": { 6981 + "expressive-code": "^0.41.3" 6982 + } 6983 + }, 6984 + "node_modules/rehype-external-links": { 6985 + "version": "3.0.0", 6986 + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", 6987 + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", 6988 + "license": "MIT", 6989 + "dependencies": { 6990 + "@types/hast": "^3.0.0", 6991 + "@ungap/structured-clone": "^1.0.0", 6992 + "hast-util-is-element": "^3.0.0", 6993 + "is-absolute-url": "^4.0.0", 6994 + "space-separated-tokens": "^2.0.0", 6995 + "unist-util-visit": "^5.0.0" 6996 + }, 6997 + "funding": { 6998 + "type": "opencollective", 6999 + "url": "https://opencollective.com/unified" 7000 + } 7001 + }, 7002 + "node_modules/rehype-katex": { 7003 + "version": "7.0.1", 7004 + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz", 7005 + "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", 7006 + "license": "MIT", 7007 + "dependencies": { 7008 + "@types/hast": "^3.0.0", 7009 + "@types/katex": "^0.16.0", 7010 + "hast-util-from-html-isomorphic": "^2.0.0", 7011 + "hast-util-to-text": "^4.0.0", 7012 + "katex": "^0.16.0", 7013 + "unist-util-visit-parents": "^6.0.0", 7014 + "vfile": "^6.0.0" 7015 + }, 7016 + "funding": { 7017 + "type": "opencollective", 7018 + "url": "https://opencollective.com/unified" 7019 + } 7020 + }, 7021 + "node_modules/rehype-parse": { 7022 + "version": "9.0.1", 7023 + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", 7024 + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", 7025 + "license": "MIT", 7026 + "dependencies": { 7027 + "@types/hast": "^3.0.0", 7028 + "hast-util-from-html": "^2.0.0", 7029 + "unified": "^11.0.0" 7030 + }, 7031 + "funding": { 7032 + "type": "opencollective", 7033 + "url": "https://opencollective.com/unified" 7034 + } 7035 + }, 7036 + "node_modules/rehype-raw": { 7037 + "version": "7.0.0", 7038 + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", 7039 + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", 7040 + "license": "MIT", 7041 + "dependencies": { 7042 + "@types/hast": "^3.0.0", 7043 + "hast-util-raw": "^9.0.0", 7044 + "vfile": "^6.0.0" 7045 + }, 7046 + "funding": { 7047 + "type": "opencollective", 7048 + "url": "https://opencollective.com/unified" 7049 + } 7050 + }, 7051 + "node_modules/rehype-recma": { 7052 + "version": "1.0.0", 7053 + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", 7054 + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", 7055 + "license": "MIT", 7056 + "dependencies": { 7057 + "@types/estree": "^1.0.0", 7058 + "@types/hast": "^3.0.0", 7059 + "hast-util-to-estree": "^3.0.0" 7060 + }, 7061 + "funding": { 7062 + "type": "opencollective", 7063 + "url": "https://opencollective.com/unified" 7064 + } 7065 + }, 7066 + "node_modules/rehype-stringify": { 7067 + "version": "10.0.1", 7068 + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", 7069 + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", 7070 + "license": "MIT", 7071 + "dependencies": { 7072 + "@types/hast": "^3.0.0", 7073 + "hast-util-to-html": "^9.0.0", 7074 + "unified": "^11.0.0" 7075 + }, 7076 + "funding": { 7077 + "type": "opencollective", 7078 + "url": "https://opencollective.com/unified" 7079 + } 7080 + }, 7081 + "node_modules/rehype-unwrap-images": { 7082 + "version": "1.0.0", 7083 + "resolved": "https://registry.npmjs.org/rehype-unwrap-images/-/rehype-unwrap-images-1.0.0.tgz", 7084 + "integrity": "sha512-wzW5Mk9IlVF2UwXC5NtIZsx1aHYbV8+bLWjJnlZaaamz5QU52RppWtq1uEZJqGo8d9Y4RuDqidB6r9RFpKugIg==", 7085 + "license": "MIT", 7086 + "dependencies": { 7087 + "@types/hast": "^3.0.0", 7088 + "hast-util-interactive": "^3.0.0", 7089 + "hast-util-whitespace": "^3.0.0", 7090 + "unist-util-visit": "^5.0.0" 7091 + }, 7092 + "funding": { 7093 + "type": "opencollective", 7094 + "url": "https://opencollective.com/unified" 7095 + } 7096 + }, 7097 + "node_modules/remark-directive": { 7098 + "version": "4.0.0", 7099 + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", 7100 + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", 7101 + "license": "MIT", 7102 + "dependencies": { 7103 + "@types/mdast": "^4.0.0", 7104 + "mdast-util-directive": "^3.0.0", 7105 + "micromark-extension-directive": "^4.0.0", 7106 + "unified": "^11.0.0" 7107 + }, 7108 + "funding": { 7109 + "type": "opencollective", 7110 + "url": "https://opencollective.com/unified" 7111 + } 7112 + }, 7113 + "node_modules/remark-gfm": { 7114 + "version": "4.0.1", 7115 + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", 7116 + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", 7117 + "license": "MIT", 7118 + "dependencies": { 7119 + "@types/mdast": "^4.0.0", 7120 + "mdast-util-gfm": "^3.0.0", 7121 + "micromark-extension-gfm": "^3.0.0", 7122 + "remark-parse": "^11.0.0", 7123 + "remark-stringify": "^11.0.0", 7124 + "unified": "^11.0.0" 7125 + }, 7126 + "funding": { 7127 + "type": "opencollective", 7128 + "url": "https://opencollective.com/unified" 7129 + } 7130 + }, 7131 + "node_modules/remark-math": { 7132 + "version": "6.0.0", 7133 + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz", 7134 + "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", 7135 + "license": "MIT", 7136 + "dependencies": { 7137 + "@types/mdast": "^4.0.0", 7138 + "mdast-util-math": "^3.0.0", 7139 + "micromark-extension-math": "^3.0.0", 7140 + "unified": "^11.0.0" 7141 + }, 7142 + "funding": { 7143 + "type": "opencollective", 7144 + "url": "https://opencollective.com/unified" 7145 + } 7146 + }, 7147 + "node_modules/remark-mdx": { 7148 + "version": "3.1.1", 7149 + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", 7150 + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", 7151 + "license": "MIT", 7152 + "dependencies": { 7153 + "mdast-util-mdx": "^3.0.0", 7154 + "micromark-extension-mdxjs": "^3.0.0" 7155 + }, 7156 + "funding": { 7157 + "type": "opencollective", 7158 + "url": "https://opencollective.com/unified" 7159 + } 7160 + }, 7161 + "node_modules/remark-parse": { 7162 + "version": "11.0.0", 7163 + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", 7164 + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", 7165 + "license": "MIT", 7166 + "dependencies": { 7167 + "@types/mdast": "^4.0.0", 7168 + "mdast-util-from-markdown": "^2.0.0", 7169 + "micromark-util-types": "^2.0.0", 7170 + "unified": "^11.0.0" 7171 + }, 7172 + "funding": { 7173 + "type": "opencollective", 7174 + "url": "https://opencollective.com/unified" 7175 + } 7176 + }, 7177 + "node_modules/remark-rehype": { 7178 + "version": "11.1.2", 7179 + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", 7180 + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", 7181 + "license": "MIT", 7182 + "dependencies": { 7183 + "@types/hast": "^3.0.0", 7184 + "@types/mdast": "^4.0.0", 7185 + "mdast-util-to-hast": "^13.0.0", 7186 + "unified": "^11.0.0", 7187 + "vfile": "^6.0.0" 7188 + }, 7189 + "funding": { 7190 + "type": "opencollective", 7191 + "url": "https://opencollective.com/unified" 7192 + } 7193 + }, 7194 + "node_modules/remark-smartypants": { 7195 + "version": "3.0.2", 7196 + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", 7197 + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", 7198 + "license": "MIT", 7199 + "dependencies": { 7200 + "retext": "^9.0.0", 7201 + "retext-smartypants": "^6.0.0", 7202 + "unified": "^11.0.4", 7203 + "unist-util-visit": "^5.0.0" 7204 + }, 7205 + "engines": { 7206 + "node": ">=16.0.0" 7207 + } 7208 + }, 7209 + "node_modules/remark-stringify": { 7210 + "version": "11.0.0", 7211 + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", 7212 + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", 7213 + "license": "MIT", 7214 + "dependencies": { 7215 + "@types/mdast": "^4.0.0", 7216 + "mdast-util-to-markdown": "^2.0.0", 7217 + "unified": "^11.0.0" 7218 + }, 7219 + "funding": { 7220 + "type": "opencollective", 7221 + "url": "https://opencollective.com/unified" 7222 + } 7223 + }, 7224 + "node_modules/restructure": { 7225 + "version": "3.0.2", 7226 + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", 7227 + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", 7228 + "license": "MIT" 7229 + }, 7230 + "node_modules/retext": { 7231 + "version": "9.0.0", 7232 + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", 7233 + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", 7234 + "license": "MIT", 7235 + "dependencies": { 7236 + "@types/nlcst": "^2.0.0", 7237 + "retext-latin": "^4.0.0", 7238 + "retext-stringify": "^4.0.0", 7239 + "unified": "^11.0.0" 7240 + }, 7241 + "funding": { 7242 + "type": "opencollective", 7243 + "url": "https://opencollective.com/unified" 7244 + } 7245 + }, 7246 + "node_modules/retext-latin": { 7247 + "version": "4.0.0", 7248 + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", 7249 + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", 7250 + "license": "MIT", 7251 + "dependencies": { 7252 + "@types/nlcst": "^2.0.0", 7253 + "parse-latin": "^7.0.0", 7254 + "unified": "^11.0.0" 7255 + }, 7256 + "funding": { 7257 + "type": "opencollective", 7258 + "url": "https://opencollective.com/unified" 7259 + } 7260 + }, 7261 + "node_modules/retext-smartypants": { 7262 + "version": "6.2.0", 7263 + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", 7264 + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", 7265 + "license": "MIT", 7266 + "dependencies": { 7267 + "@types/nlcst": "^2.0.0", 7268 + "nlcst-to-string": "^4.0.0", 7269 + "unist-util-visit": "^5.0.0" 7270 + }, 7271 + "funding": { 7272 + "type": "opencollective", 7273 + "url": "https://opencollective.com/unified" 7274 + } 7275 + }, 7276 + "node_modules/retext-stringify": { 7277 + "version": "4.0.0", 7278 + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", 7279 + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", 7280 + "license": "MIT", 7281 + "dependencies": { 7282 + "@types/nlcst": "^2.0.0", 7283 + "nlcst-to-string": "^4.0.0", 7284 + "unified": "^11.0.0" 7285 + }, 7286 + "funding": { 7287 + "type": "opencollective", 7288 + "url": "https://opencollective.com/unified" 7289 + } 7290 + }, 7291 + "node_modules/rollup": { 7292 + "version": "4.45.0", 7293 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz", 7294 + "integrity": "sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==", 7295 + "license": "MIT", 7296 + "dependencies": { 7297 + "@types/estree": "1.0.8" 7298 + }, 7299 + "bin": { 7300 + "rollup": "dist/bin/rollup" 7301 + }, 7302 + "engines": { 7303 + "node": ">=18.0.0", 7304 + "npm": ">=8.0.0" 7305 + }, 7306 + "optionalDependencies": { 7307 + "@rollup/rollup-android-arm-eabi": "4.45.0", 7308 + "@rollup/rollup-android-arm64": "4.45.0", 7309 + "@rollup/rollup-darwin-arm64": "4.45.0", 7310 + "@rollup/rollup-darwin-x64": "4.45.0", 7311 + "@rollup/rollup-freebsd-arm64": "4.45.0", 7312 + "@rollup/rollup-freebsd-x64": "4.45.0", 7313 + "@rollup/rollup-linux-arm-gnueabihf": "4.45.0", 7314 + "@rollup/rollup-linux-arm-musleabihf": "4.45.0", 7315 + "@rollup/rollup-linux-arm64-gnu": "4.45.0", 7316 + "@rollup/rollup-linux-arm64-musl": "4.45.0", 7317 + "@rollup/rollup-linux-loongarch64-gnu": "4.45.0", 7318 + "@rollup/rollup-linux-powerpc64le-gnu": "4.45.0", 7319 + "@rollup/rollup-linux-riscv64-gnu": "4.45.0", 7320 + "@rollup/rollup-linux-riscv64-musl": "4.45.0", 7321 + "@rollup/rollup-linux-s390x-gnu": "4.45.0", 7322 + "@rollup/rollup-linux-x64-gnu": "4.45.0", 7323 + "@rollup/rollup-linux-x64-musl": "4.45.0", 7324 + "@rollup/rollup-win32-arm64-msvc": "4.45.0", 7325 + "@rollup/rollup-win32-ia32-msvc": "4.45.0", 7326 + "@rollup/rollup-win32-x64-msvc": "4.45.0", 7327 + "fsevents": "~2.3.2" 7328 + } 7329 + }, 7330 + "node_modules/rxjs": { 7331 + "version": "7.8.2", 7332 + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", 7333 + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", 7334 + "devOptional": true, 7335 + "license": "Apache-2.0", 7336 + "dependencies": { 7337 + "tslib": "^2.1.0" 7338 + } 7339 + }, 7340 + "node_modules/s.color": { 7341 + "version": "0.0.15", 7342 + "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", 7343 + "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", 7344 + "dev": true, 7345 + "license": "MIT" 7346 + }, 7347 + "node_modules/sanitize-html": { 7348 + "version": "2.17.0", 7349 + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.17.0.tgz", 7350 + "integrity": "sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==", 7351 + "license": "MIT", 7352 + "dependencies": { 7353 + "deepmerge": "^4.2.2", 7354 + "escape-string-regexp": "^4.0.0", 7355 + "htmlparser2": "^8.0.0", 7356 + "is-plain-object": "^5.0.0", 7357 + "parse-srcset": "^1.0.2", 7358 + "postcss": "^8.3.11" 7359 + } 7360 + }, 7361 + "node_modules/sanitize-html/node_modules/escape-string-regexp": { 7362 + "version": "4.0.0", 7363 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 7364 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 7365 + "license": "MIT", 7366 + "engines": { 7367 + "node": ">=10" 7368 + }, 7369 + "funding": { 7370 + "url": "https://github.com/sponsors/sindresorhus" 7371 + } 7372 + }, 7373 + "node_modules/sanitize-html/node_modules/htmlparser2": { 7374 + "version": "8.0.2", 7375 + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", 7376 + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 7377 + "funding": [ 7378 + "https://github.com/fb55/htmlparser2?sponsor=1", 7379 + { 7380 + "type": "github", 7381 + "url": "https://github.com/sponsors/fb55" 7382 + } 7383 + ], 7384 + "license": "MIT", 7385 + "dependencies": { 7386 + "domelementtype": "^2.3.0", 7387 + "domhandler": "^5.0.3", 7388 + "domutils": "^3.0.1", 7389 + "entities": "^4.4.0" 7390 + } 7391 + }, 7392 + "node_modules/sass": { 7393 + "version": "1.92.1", 7394 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", 7395 + "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", 7396 + "license": "MIT", 7397 + "optional": true, 7398 + "dependencies": { 7399 + "chokidar": "^4.0.0", 7400 + "immutable": "^5.0.2", 7401 + "source-map-js": ">=0.6.2 <2.0.0" 7402 + }, 7403 + "bin": { 7404 + "sass": "sass.js" 7405 + }, 7406 + "engines": { 7407 + "node": ">=14.0.0" 7408 + }, 7409 + "optionalDependencies": { 7410 + "@parcel/watcher": "^2.4.1" 7411 + } 7412 + }, 7413 + "node_modules/sass-embedded": { 7414 + "version": "1.92.1", 7415 + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.92.1.tgz", 7416 + "integrity": "sha512-28YwLnF5atAhogt3E4hXzz/NB9dwKffyw08a7DEasLh94P7+aELkG3ENSHYCWB9QFN14hYNLfwr9ozUsPDhcDQ==", 7417 + "devOptional": true, 7418 + "license": "MIT", 7419 + "dependencies": { 7420 + "@bufbuild/protobuf": "^2.5.0", 7421 + "buffer-builder": "^0.2.0", 7422 + "colorjs.io": "^0.5.0", 7423 + "immutable": "^5.0.2", 7424 + "rxjs": "^7.4.0", 7425 + "supports-color": "^8.1.1", 7426 + "sync-child-process": "^1.0.2", 7427 + "varint": "^6.0.0" 7428 + }, 7429 + "bin": { 7430 + "sass": "dist/bin/sass.js" 7431 + }, 7432 + "engines": { 7433 + "node": ">=16.0.0" 7434 + }, 7435 + "optionalDependencies": { 7436 + "sass-embedded-all-unknown": "1.92.1", 7437 + "sass-embedded-android-arm": "1.92.1", 7438 + "sass-embedded-android-arm64": "1.92.1", 7439 + "sass-embedded-android-riscv64": "1.92.1", 7440 + "sass-embedded-android-x64": "1.92.1", 7441 + "sass-embedded-darwin-arm64": "1.92.1", 7442 + "sass-embedded-darwin-x64": "1.92.1", 7443 + "sass-embedded-linux-arm": "1.92.1", 7444 + "sass-embedded-linux-arm64": "1.92.1", 7445 + "sass-embedded-linux-musl-arm": "1.92.1", 7446 + "sass-embedded-linux-musl-arm64": "1.92.1", 7447 + "sass-embedded-linux-musl-riscv64": "1.92.1", 7448 + "sass-embedded-linux-musl-x64": "1.92.1", 7449 + "sass-embedded-linux-riscv64": "1.92.1", 7450 + "sass-embedded-linux-x64": "1.92.1", 7451 + "sass-embedded-unknown-all": "1.92.1", 7452 + "sass-embedded-win32-arm64": "1.92.1", 7453 + "sass-embedded-win32-x64": "1.92.1" 7454 + } 7455 + }, 7456 + "node_modules/sass-embedded-all-unknown": { 7457 + "version": "1.92.1", 7458 + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.92.1.tgz", 7459 + "integrity": "sha512-5t6/YZf+vhO3OY/49h8RCL6Cwo78luva0M+TnTM9gu9ASffRXAuOVLNKciSXa3loptyemDDS6IU5/dVH5w0KmA==", 7460 + "cpu": [ 7461 + "!arm", 7462 + "!arm64", 7463 + "!riscv64", 7464 + "!x64" 7465 + ], 7466 + "dev": true, 7467 + "license": "MIT", 7468 + "optional": true, 7469 + "dependencies": { 7470 + "sass": "1.92.1" 7471 + } 7472 + }, 7473 + "node_modules/sass-embedded-android-arm": { 7474 + "version": "1.92.1", 7475 + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.92.1.tgz", 7476 + "integrity": "sha512-4EjpVVzuksERdgAd4BqeSXFnWtWN3DSRyEIUPJ7BhcS9sfDh2Gf6miI2kNTvIQLJ2XIJynDDcEQ8a1U9KwKUTQ==", 7477 + "cpu": [ 7478 + "arm" 7479 + ], 7480 + "dev": true, 7481 + "license": "MIT", 7482 + "optional": true, 7483 + "os": [ 7484 + "android" 7485 + ], 7486 + "engines": { 7487 + "node": ">=14.0.0" 7488 + } 7489 + }, 7490 + "node_modules/sass-embedded-android-arm64": { 7491 + "version": "1.92.1", 7492 + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.92.1.tgz", 7493 + "integrity": "sha512-Q+UruGb7yKawHagVmVDRRKsnc4mJZvWMBnuRCu2coJo2FofyqBmXohVGXbxko97sYceA9TJTrUEx3WVKQUNCbQ==", 7494 + "cpu": [ 7495 + "arm64" 7496 + ], 7497 + "dev": true, 7498 + "license": "MIT", 7499 + "optional": true, 7500 + "os": [ 7501 + "android" 7502 + ], 7503 + "engines": { 7504 + "node": ">=14.0.0" 7505 + } 7506 + }, 7507 + "node_modules/sass-embedded-android-riscv64": { 7508 + "version": "1.92.1", 7509 + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.92.1.tgz", 7510 + "integrity": "sha512-nCY5btLlX7W7Jc6cCL6D2Yklpiu540EJ2G08YVGu12DrAMCBzqM347CSRf2ojp1H8jyhvmLkaFwnrJWzh+6S+w==", 7511 + "cpu": [ 7512 + "riscv64" 7513 + ], 7514 + "dev": true, 7515 + "license": "MIT", 7516 + "optional": true, 7517 + "os": [ 7518 + "android" 7519 + ], 7520 + "engines": { 7521 + "node": ">=14.0.0" 7522 + } 7523 + }, 7524 + "node_modules/sass-embedded-android-x64": { 7525 + "version": "1.92.1", 7526 + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.92.1.tgz", 7527 + "integrity": "sha512-qYWR3bftJ77aLYwYDFuzDI4dcwVVixxqQxlIQWNGkHRCexj614qGSSHemr18C2eVj3mjXAQxTQxU68U7pkGPAA==", 7528 + "cpu": [ 7529 + "x64" 7530 + ], 7531 + "dev": true, 7532 + "license": "MIT", 7533 + "optional": true, 7534 + "os": [ 7535 + "android" 7536 + ], 7537 + "engines": { 7538 + "node": ">=14.0.0" 7539 + } 7540 + }, 7541 + "node_modules/sass-embedded-darwin-arm64": { 7542 + "version": "1.92.1", 7543 + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.92.1.tgz", 7544 + "integrity": "sha512-g2yQ3txjMYLKMjL2cW1xRO9nnV3ijf95NbX/QShtV6tiVUETZNWDsRMDEwBNGYY6PTE/UZerjJL1R/2xpQg6WA==", 7545 + "cpu": [ 7546 + "arm64" 7547 + ], 7548 + "dev": true, 7549 + "license": "MIT", 7550 + "optional": true, 7551 + "os": [ 7552 + "darwin" 7553 + ], 7554 + "engines": { 7555 + "node": ">=14.0.0" 7556 + } 7557 + }, 7558 + "node_modules/sass-embedded-darwin-x64": { 7559 + "version": "1.92.1", 7560 + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.92.1.tgz", 7561 + "integrity": "sha512-eH+fgxLQhTEPjZPCgPAVuX5e514Qp/4DMAUMtlNShv4cr4TD5qOp1XlsPYR/b7uE7p2cKFkUpUn/bHNqJ2ay4A==", 7562 + "cpu": [ 7563 + "x64" 7564 + ], 7565 + "dev": true, 7566 + "license": "MIT", 7567 + "optional": true, 7568 + "os": [ 7569 + "darwin" 7570 + ], 7571 + "engines": { 7572 + "node": ">=14.0.0" 7573 + } 7574 + }, 7575 + "node_modules/sass-embedded-linux-arm": { 7576 + "version": "1.92.1", 7577 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.92.1.tgz", 7578 + "integrity": "sha512-cT3w8yoQTqrtZvWLJeutEGmawITDTY4J6oSVQjeDcPnnoPt0gOFxem8YMznraACXvahw/2+KJDH33BTNgiPo0A==", 7579 + "cpu": [ 7580 + "arm" 7581 + ], 7582 + "dev": true, 7583 + "license": "MIT", 7584 + "optional": true, 7585 + "os": [ 7586 + "linux" 7587 + ], 7588 + "engines": { 7589 + "node": ">=14.0.0" 7590 + } 7591 + }, 7592 + "node_modules/sass-embedded-linux-arm64": { 7593 + "version": "1.92.1", 7594 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.92.1.tgz", 7595 + "integrity": "sha512-dNmlpGeZkry1BofhAdGFBXrpM69y9LlYuNnncf+HfsOOUtj8j0q1RwS+zb5asknhKFUOAG8GCGRY1df7Rwu35g==", 7596 + "cpu": [ 7597 + "arm64" 7598 + ], 7599 + "dev": true, 7600 + "license": "MIT", 7601 + "optional": true, 7602 + "os": [ 7603 + "linux" 7604 + ], 7605 + "engines": { 7606 + "node": ">=14.0.0" 7607 + } 7608 + }, 7609 + "node_modules/sass-embedded-linux-musl-arm": { 7610 + "version": "1.92.1", 7611 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.92.1.tgz", 7612 + "integrity": "sha512-nPBos6lI31ef2zQhqTZhFOU7ar4impJbLIax0XsqS269YsiCwjhk11VmUloJTpFlJuKMiVXNo7dPx+katxhD/Q==", 7613 + "cpu": [ 7614 + "arm" 7615 + ], 7616 + "dev": true, 7617 + "license": "MIT", 7618 + "optional": true, 7619 + "os": [ 7620 + "linux" 7621 + ], 7622 + "engines": { 7623 + "node": ">=14.0.0" 7624 + } 7625 + }, 7626 + "node_modules/sass-embedded-linux-musl-arm64": { 7627 + "version": "1.92.1", 7628 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.92.1.tgz", 7629 + "integrity": "sha512-TfiEBkCyNzVoOhjHXUT+vZ6+p0ueDbvRw6f4jHdkvljZzXdXMby4wh7BU1odl69rgRTkSvYKhgbErRLDR/F7pQ==", 7630 + "cpu": [ 7631 + "arm64" 7632 + ], 7633 + "dev": true, 7634 + "license": "MIT", 7635 + "optional": true, 7636 + "os": [ 7637 + "linux" 7638 + ], 7639 + "engines": { 7640 + "node": ">=14.0.0" 7641 + } 7642 + }, 7643 + "node_modules/sass-embedded-linux-musl-riscv64": { 7644 + "version": "1.92.1", 7645 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.92.1.tgz", 7646 + "integrity": "sha512-R+RcJA4EYpJDE9JM1GgPYgZo7x94FlxZ6jPodOQkEaZ1S9kvXVCuP5X/0PXRPhu08KJOfeMsAElzfdAjUf7KJg==", 7647 + "cpu": [ 7648 + "riscv64" 7649 + ], 7650 + "dev": true, 7651 + "license": "MIT", 7652 + "optional": true, 7653 + "os": [ 7654 + "linux" 7655 + ], 7656 + "engines": { 7657 + "node": ">=14.0.0" 7658 + } 7659 + }, 7660 + "node_modules/sass-embedded-linux-musl-x64": { 7661 + "version": "1.92.1", 7662 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.92.1.tgz", 7663 + "integrity": "sha512-/HolYRGXJjx8nLw6oj5ZrkR7PFM7X/5kE4MYZaFMpDIPIcw3bqB2fUXLo/MYlRLsw7gBAT6hJAMBrNdKuTphfw==", 7664 + "cpu": [ 7665 + "x64" 7666 + ], 7667 + "dev": true, 7668 + "license": "MIT", 7669 + "optional": true, 7670 + "os": [ 7671 + "linux" 7672 + ], 7673 + "engines": { 7674 + "node": ">=14.0.0" 7675 + } 7676 + }, 7677 + "node_modules/sass-embedded-linux-riscv64": { 7678 + "version": "1.92.1", 7679 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.92.1.tgz", 7680 + "integrity": "sha512-b9bxe0CMsbSsLx3nrR0cq8xpIkoAC6X36o4DGMITF3m2v3KsojC7ru9X0Gz+zUFr6rwpq/0lTNzFLNu6sPNo3w==", 7681 + "cpu": [ 7682 + "riscv64" 7683 + ], 7684 + "dev": true, 7685 + "license": "MIT", 7686 + "optional": true, 7687 + "os": [ 7688 + "linux" 7689 + ], 7690 + "engines": { 7691 + "node": ">=14.0.0" 7692 + } 7693 + }, 7694 + "node_modules/sass-embedded-linux-x64": { 7695 + "version": "1.92.1", 7696 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.92.1.tgz", 7697 + "integrity": "sha512-xuiK5Jp5NldW4bvlC7AuX1Wf7o0gLZ3md/hNg+bkTvxtCDgnUHtfdo8Q+xWP11bD9QX31xXFWpmUB8UDLi6XQQ==", 7698 + "cpu": [ 7699 + "x64" 7700 + ], 7701 + "dev": true, 7702 + "license": "MIT", 7703 + "optional": true, 7704 + "os": [ 7705 + "linux" 7706 + ], 7707 + "engines": { 7708 + "node": ">=14.0.0" 7709 + } 7710 + }, 7711 + "node_modules/sass-embedded-unknown-all": { 7712 + "version": "1.92.1", 7713 + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.92.1.tgz", 7714 + "integrity": "sha512-AT9oXvtNY4N+Nd0wvoWqq9A5HjdH/X3aUH4boQUtXyaJ/9DUwnQmBpP5Gtn028ZS8exOGBdobmmWAuigv0k/OA==", 7715 + "dev": true, 7716 + "license": "MIT", 7717 + "optional": true, 7718 + "os": [ 7719 + "!android", 7720 + "!darwin", 7721 + "!linux", 7722 + "!win32" 7723 + ], 7724 + "dependencies": { 7725 + "sass": "1.92.1" 7726 + } 7727 + }, 7728 + "node_modules/sass-embedded-win32-arm64": { 7729 + "version": "1.92.1", 7730 + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.92.1.tgz", 7731 + "integrity": "sha512-KvmpQjY9yTBMtTYz4WBqetlv9bGaDW1aStcu7MSTbH7YiSybX/9fnxlCAEQv1WlIidQhcJAiyk0Eae+LGK7cIQ==", 7732 + "cpu": [ 7733 + "arm64" 7734 + ], 7735 + "dev": true, 7736 + "license": "MIT", 7737 + "optional": true, 7738 + "os": [ 7739 + "win32" 7740 + ], 7741 + "engines": { 7742 + "node": ">=14.0.0" 7743 + } 7744 + }, 7745 + "node_modules/sass-embedded-win32-x64": { 7746 + "version": "1.92.1", 7747 + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.92.1.tgz", 7748 + "integrity": "sha512-B6Nz/GbH7Vkpb2TkQHsGcczWM5t+70VWopWF1x5V5yxLpA8ZzVQ7NTKKi+jDoVY2Efu6ZyzgT9n5KgG2kWliXA==", 7749 + "cpu": [ 7750 + "x64" 7751 + ], 7752 + "dev": true, 7753 + "license": "MIT", 7754 + "optional": true, 7755 + "os": [ 7756 + "win32" 7757 + ], 7758 + "engines": { 7759 + "node": ">=14.0.0" 7760 + } 7761 + }, 7762 + "node_modules/sass-formatter": { 7763 + "version": "0.7.9", 7764 + "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.9.tgz", 7765 + "integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==", 7766 + "dev": true, 7767 + "license": "MIT", 7768 + "dependencies": { 7769 + "suf-log": "^2.5.3" 7770 + } 7771 + }, 7772 + "node_modules/satori": { 7773 + "version": "0.18.2", 7774 + "resolved": "https://registry.npmjs.org/satori/-/satori-0.18.2.tgz", 7775 + "integrity": "sha512-Y9fOzHuaslMX+3otoULyvUBOxXN6a0CJL+MPeFrHgGSPDwdSxkZdhY9W8U4MvDm0aT/+EIr5g18dvAQV+UplDA==", 7776 + "license": "MPL-2.0", 7777 + "dependencies": { 7778 + "@shuding/opentype.js": "1.4.0-beta.0", 7779 + "css-background-parser": "^0.1.0", 7780 + "css-box-shadow": "1.0.0-3", 7781 + "css-gradient-parser": "^0.0.17", 7782 + "css-to-react-native": "^3.0.0", 7783 + "emoji-regex-xs": "^2.0.1", 7784 + "escape-html": "^1.0.3", 7785 + "linebreak": "^1.1.0", 7786 + "parse-css-color": "^0.2.1", 7787 + "postcss-value-parser": "^4.2.0", 7788 + "yoga-layout": "^3.2.1" 7789 + }, 7790 + "engines": { 7791 + "node": ">=16" 7792 + } 7793 + }, 7794 + "node_modules/satori-html": { 7795 + "version": "0.3.2", 7796 + "resolved": "https://registry.npmjs.org/satori-html/-/satori-html-0.3.2.tgz", 7797 + "integrity": "sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==", 7798 + "license": "MIT", 7799 + "dependencies": { 7800 + "ultrahtml": "^1.2.0" 7801 + } 7802 + }, 7803 + "node_modules/sax": { 7804 + "version": "1.4.1", 7805 + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", 7806 + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", 7807 + "license": "ISC" 7808 + }, 7809 + "node_modules/semver": { 7810 + "version": "7.7.2", 7811 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 7812 + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 7813 + "license": "ISC", 7814 + "bin": { 7815 + "semver": "bin/semver.js" 7816 + }, 7817 + "engines": { 7818 + "node": ">=10" 7819 + } 7820 + }, 7821 + "node_modules/sharp": { 7822 + "version": "0.33.5", 7823 + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", 7824 + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", 7825 + "hasInstallScript": true, 7826 + "license": "Apache-2.0", 7827 + "optional": true, 7828 + "dependencies": { 7829 + "color": "^4.2.3", 7830 + "detect-libc": "^2.0.3", 7831 + "semver": "^7.6.3" 7832 + }, 7833 + "engines": { 7834 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 7835 + }, 7836 + "funding": { 7837 + "url": "https://opencollective.com/libvips" 7838 + }, 7839 + "optionalDependencies": { 7840 + "@img/sharp-darwin-arm64": "0.33.5", 7841 + "@img/sharp-darwin-x64": "0.33.5", 7842 + "@img/sharp-libvips-darwin-arm64": "1.0.4", 7843 + "@img/sharp-libvips-darwin-x64": "1.0.4", 7844 + "@img/sharp-libvips-linux-arm": "1.0.5", 7845 + "@img/sharp-libvips-linux-arm64": "1.0.4", 7846 + "@img/sharp-libvips-linux-s390x": "1.0.4", 7847 + "@img/sharp-libvips-linux-x64": "1.0.4", 7848 + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", 7849 + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", 7850 + "@img/sharp-linux-arm": "0.33.5", 7851 + "@img/sharp-linux-arm64": "0.33.5", 7852 + "@img/sharp-linux-s390x": "0.33.5", 7853 + "@img/sharp-linux-x64": "0.33.5", 7854 + "@img/sharp-linuxmusl-arm64": "0.33.5", 7855 + "@img/sharp-linuxmusl-x64": "0.33.5", 7856 + "@img/sharp-wasm32": "0.33.5", 7857 + "@img/sharp-win32-ia32": "0.33.5", 7858 + "@img/sharp-win32-x64": "0.33.5" 7859 + } 7860 + }, 7861 + "node_modules/sharp/node_modules/color": { 7862 + "version": "4.2.3", 7863 + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 7864 + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 7865 + "license": "MIT", 7866 + "optional": true, 7867 + "dependencies": { 7868 + "color-convert": "^2.0.1", 7869 + "color-string": "^1.9.0" 7870 + }, 7871 + "engines": { 7872 + "node": ">=12.5.0" 7873 + } 7874 + }, 7875 + "node_modules/sharp/node_modules/color-convert": { 7876 + "version": "2.0.1", 7877 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 7878 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 7879 + "license": "MIT", 7880 + "optional": true, 7881 + "dependencies": { 7882 + "color-name": "~1.1.4" 7883 + }, 7884 + "engines": { 7885 + "node": ">=7.0.0" 7886 + } 7887 + }, 7888 + "node_modules/sharp/node_modules/color-string": { 7889 + "version": "1.9.1", 7890 + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 7891 + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 7892 + "license": "MIT", 7893 + "optional": true, 7894 + "dependencies": { 7895 + "color-name": "^1.0.0", 7896 + "simple-swizzle": "^0.2.2" 7897 + } 7898 + }, 7899 + "node_modules/shiki": { 7900 + "version": "3.14.0", 7901 + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.14.0.tgz", 7902 + "integrity": "sha512-J0yvpLI7LSig3Z3acIuDLouV5UCKQqu8qOArwMx+/yPVC3WRMgrP67beaG8F+j4xfEWE0eVC4GeBCIXeOPra1g==", 7903 + "license": "MIT", 7904 + "dependencies": { 7905 + "@shikijs/core": "3.14.0", 7906 + "@shikijs/engine-javascript": "3.14.0", 7907 + "@shikijs/engine-oniguruma": "3.14.0", 7908 + "@shikijs/langs": "3.14.0", 7909 + "@shikijs/themes": "3.14.0", 7910 + "@shikijs/types": "3.14.0", 7911 + "@shikijs/vscode-textmate": "^10.0.2", 7912 + "@types/hast": "^3.0.4" 7913 + } 7914 + }, 7915 + "node_modules/simple-swizzle": { 7916 + "version": "0.2.2", 7917 + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 7918 + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 7919 + "license": "MIT", 7920 + "optional": true, 7921 + "dependencies": { 7922 + "is-arrayish": "^0.3.1" 7923 + } 7924 + }, 7925 + "node_modules/sisteransi": { 7926 + "version": "1.0.5", 7927 + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 7928 + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 7929 + "license": "MIT" 7930 + }, 7931 + "node_modules/sitemap": { 7932 + "version": "8.0.0", 7933 + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.0.tgz", 7934 + "integrity": "sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==", 7935 + "license": "MIT", 7936 + "dependencies": { 7937 + "@types/node": "^17.0.5", 7938 + "@types/sax": "^1.2.1", 7939 + "arg": "^5.0.0", 7940 + "sax": "^1.2.4" 7941 + }, 7942 + "bin": { 7943 + "sitemap": "dist/cli.js" 7944 + }, 7945 + "engines": { 7946 + "node": ">=14.0.0", 7947 + "npm": ">=6.0.0" 7948 + } 7949 + }, 7950 + "node_modules/sitemap/node_modules/@types/node": { 7951 + "version": "17.0.45", 7952 + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", 7953 + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", 7954 + "license": "MIT" 7955 + }, 7956 + "node_modules/smol-toml": { 7957 + "version": "1.4.2", 7958 + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.4.2.tgz", 7959 + "integrity": "sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==", 7960 + "license": "BSD-3-Clause", 7961 + "engines": { 7962 + "node": ">= 18" 7963 + }, 7964 + "funding": { 7965 + "url": "https://github.com/sponsors/cyyynthia" 7966 + } 7967 + }, 7968 + "node_modules/source-map": { 7969 + "version": "0.7.6", 7970 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", 7971 + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", 7972 + "license": "BSD-3-Clause", 7973 + "engines": { 7974 + "node": ">= 12" 7975 + } 7976 + }, 7977 + "node_modules/source-map-js": { 7978 + "version": "1.2.1", 7979 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 7980 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 7981 + "license": "BSD-3-Clause", 7982 + "engines": { 7983 + "node": ">=0.10.0" 7984 + } 7985 + }, 7986 + "node_modules/space-separated-tokens": { 7987 + "version": "2.0.2", 7988 + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", 7989 + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", 7990 + "license": "MIT", 7991 + "funding": { 7992 + "type": "github", 7993 + "url": "https://github.com/sponsors/wooorm" 7994 + } 7995 + }, 7996 + "node_modules/stream-replace-string": { 7997 + "version": "2.0.0", 7998 + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", 7999 + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", 8000 + "license": "MIT" 8001 + }, 8002 + "node_modules/string-width": { 8003 + "version": "7.2.0", 8004 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", 8005 + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 8006 + "license": "MIT", 8007 + "dependencies": { 8008 + "emoji-regex": "^10.3.0", 8009 + "get-east-asian-width": "^1.0.0", 8010 + "strip-ansi": "^7.1.0" 8011 + }, 8012 + "engines": { 8013 + "node": ">=18" 8014 + }, 8015 + "funding": { 8016 + "url": "https://github.com/sponsors/sindresorhus" 8017 + } 8018 + }, 8019 + "node_modules/string.prototype.codepointat": { 8020 + "version": "0.2.1", 8021 + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", 8022 + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", 8023 + "license": "MIT" 8024 + }, 8025 + "node_modules/stringify-entities": { 8026 + "version": "4.0.4", 8027 + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", 8028 + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", 8029 + "license": "MIT", 8030 + "dependencies": { 8031 + "character-entities-html4": "^2.0.0", 8032 + "character-entities-legacy": "^3.0.0" 8033 + }, 8034 + "funding": { 8035 + "type": "github", 8036 + "url": "https://github.com/sponsors/wooorm" 8037 + } 8038 + }, 8039 + "node_modules/strip-ansi": { 8040 + "version": "7.1.0", 8041 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 8042 + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 8043 + "license": "MIT", 8044 + "dependencies": { 8045 + "ansi-regex": "^6.0.1" 8046 + }, 8047 + "engines": { 8048 + "node": ">=12" 8049 + }, 8050 + "funding": { 8051 + "url": "https://github.com/chalk/strip-ansi?sponsor=1" 8052 + } 8053 + }, 8054 + "node_modules/strnum": { 8055 + "version": "2.1.1", 8056 + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", 8057 + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", 8058 + "funding": [ 8059 + { 8060 + "type": "github", 8061 + "url": "https://github.com/sponsors/NaturalIntelligence" 8062 + } 8063 + ], 8064 + "license": "MIT" 8065 + }, 8066 + "node_modules/style-to-js": { 8067 + "version": "1.1.18", 8068 + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.18.tgz", 8069 + "integrity": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==", 8070 + "license": "MIT", 8071 + "dependencies": { 8072 + "style-to-object": "1.0.11" 8073 + } 8074 + }, 8075 + "node_modules/style-to-object": { 8076 + "version": "1.0.11", 8077 + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.11.tgz", 8078 + "integrity": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==", 8079 + "license": "MIT", 8080 + "dependencies": { 8081 + "inline-style-parser": "0.2.4" 8082 + } 8083 + }, 8084 + "node_modules/suf-log": { 8085 + "version": "2.5.3", 8086 + "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", 8087 + "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", 8088 + "dev": true, 8089 + "license": "MIT", 8090 + "dependencies": { 8091 + "s.color": "0.0.15" 8092 + } 8093 + }, 8094 + "node_modules/supports-color": { 8095 + "version": "8.1.1", 8096 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 8097 + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 8098 + "devOptional": true, 8099 + "license": "MIT", 8100 + "dependencies": { 8101 + "has-flag": "^4.0.0" 8102 + }, 8103 + "engines": { 8104 + "node": ">=10" 8105 + }, 8106 + "funding": { 8107 + "url": "https://github.com/chalk/supports-color?sponsor=1" 8108 + } 8109 + }, 8110 + "node_modules/sync-child-process": { 8111 + "version": "1.0.2", 8112 + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", 8113 + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", 8114 + "devOptional": true, 8115 + "license": "MIT", 8116 + "dependencies": { 8117 + "sync-message-port": "^1.0.0" 8118 + }, 8119 + "engines": { 8120 + "node": ">=16.0.0" 8121 + } 8122 + }, 8123 + "node_modules/sync-message-port": { 8124 + "version": "1.1.3", 8125 + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", 8126 + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", 8127 + "devOptional": true, 8128 + "license": "MIT", 8129 + "engines": { 8130 + "node": ">=16.0.0" 8131 + } 8132 + }, 8133 + "node_modules/tailwindcss": { 8134 + "version": "4.1.13", 8135 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", 8136 + "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", 8137 + "license": "MIT" 8138 + }, 8139 + "node_modules/tapable": { 8140 + "version": "2.2.3", 8141 + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", 8142 + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", 8143 + "license": "MIT", 8144 + "engines": { 8145 + "node": ">=6" 8146 + }, 8147 + "funding": { 8148 + "type": "opencollective", 8149 + "url": "https://opencollective.com/webpack" 8150 + } 8151 + }, 8152 + "node_modules/tar": { 8153 + "version": "7.4.3", 8154 + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", 8155 + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", 8156 + "license": "ISC", 8157 + "dependencies": { 8158 + "@isaacs/fs-minipass": "^4.0.0", 8159 + "chownr": "^3.0.0", 8160 + "minipass": "^7.1.2", 8161 + "minizlib": "^3.0.1", 8162 + "mkdirp": "^3.0.1", 8163 + "yallist": "^5.0.0" 8164 + }, 8165 + "engines": { 8166 + "node": ">=18" 8167 + } 8168 + }, 8169 + "node_modules/tiny-inflate": { 8170 + "version": "1.0.3", 8171 + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", 8172 + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", 8173 + "license": "MIT" 8174 + }, 8175 + "node_modules/tinyexec": { 8176 + "version": "0.3.2", 8177 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 8178 + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 8179 + "license": "MIT" 8180 + }, 8181 + "node_modules/tinyglobby": { 8182 + "version": "0.2.14", 8183 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", 8184 + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 8185 + "license": "MIT", 8186 + "dependencies": { 8187 + "fdir": "^6.4.4", 8188 + "picomatch": "^4.0.2" 8189 + }, 8190 + "engines": { 8191 + "node": ">=12.0.0" 8192 + }, 8193 + "funding": { 8194 + "url": "https://github.com/sponsors/SuperchupuDev" 8195 + } 8196 + }, 8197 + "node_modules/to-regex-range": { 8198 + "version": "5.0.1", 8199 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 8200 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 8201 + "dev": true, 8202 + "license": "MIT", 8203 + "optional": true, 8204 + "dependencies": { 8205 + "is-number": "^7.0.0" 8206 + }, 8207 + "engines": { 8208 + "node": ">=8.0" 8209 + } 8210 + }, 8211 + "node_modules/tr46": { 8212 + "version": "0.0.3", 8213 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 8214 + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 8215 + "license": "MIT" 8216 + }, 8217 + "node_modules/trim-lines": { 8218 + "version": "3.0.1", 8219 + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", 8220 + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", 8221 + "license": "MIT", 8222 + "funding": { 8223 + "type": "github", 8224 + "url": "https://github.com/sponsors/wooorm" 8225 + } 8226 + }, 8227 + "node_modules/trough": { 8228 + "version": "2.2.0", 8229 + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", 8230 + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", 8231 + "license": "MIT", 8232 + "funding": { 8233 + "type": "github", 8234 + "url": "https://github.com/sponsors/wooorm" 8235 + } 8236 + }, 8237 + "node_modules/tsconfck": { 8238 + "version": "3.1.6", 8239 + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", 8240 + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", 8241 + "license": "MIT", 8242 + "bin": { 8243 + "tsconfck": "bin/tsconfck.js" 8244 + }, 8245 + "engines": { 8246 + "node": "^18 || >=20" 8247 + }, 8248 + "peerDependencies": { 8249 + "typescript": "^5.0.0" 8250 + }, 8251 + "peerDependenciesMeta": { 8252 + "typescript": { 8253 + "optional": true 8254 + } 8255 + } 8256 + }, 8257 + "node_modules/tslib": { 8258 + "version": "2.8.1", 8259 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 8260 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 8261 + "license": "0BSD" 8262 + }, 8263 + "node_modules/type-fest": { 8264 + "version": "4.41.0", 8265 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", 8266 + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", 8267 + "license": "(MIT OR CC0-1.0)", 8268 + "engines": { 8269 + "node": ">=16" 8270 + }, 8271 + "funding": { 8272 + "url": "https://github.com/sponsors/sindresorhus" 8273 + } 8274 + }, 8275 + "node_modules/typescript": { 8276 + "version": "5.9.2", 8277 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", 8278 + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", 8279 + "license": "Apache-2.0", 8280 + "bin": { 8281 + "tsc": "bin/tsc", 8282 + "tsserver": "bin/tsserver" 8283 + }, 8284 + "engines": { 8285 + "node": ">=14.17" 8286 + } 8287 + }, 8288 + "node_modules/uc.micro": { 8289 + "version": "2.1.0", 8290 + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", 8291 + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", 8292 + "license": "MIT" 8293 + }, 8294 + "node_modules/ufo": { 8295 + "version": "1.6.1", 8296 + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", 8297 + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", 8298 + "license": "MIT" 8299 + }, 8300 + "node_modules/ultrahtml": { 8301 + "version": "1.6.0", 8302 + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", 8303 + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", 8304 + "license": "MIT" 8305 + }, 8306 + "node_modules/uncrypto": { 8307 + "version": "0.1.3", 8308 + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", 8309 + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", 8310 + "license": "MIT" 8311 + }, 8312 + "node_modules/undici-types": { 8313 + "version": "7.8.0", 8314 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", 8315 + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", 8316 + "license": "MIT" 8317 + }, 8318 + "node_modules/unicode-properties": { 8319 + "version": "1.4.1", 8320 + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", 8321 + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", 8322 + "license": "MIT", 8323 + "dependencies": { 8324 + "base64-js": "^1.3.0", 8325 + "unicode-trie": "^2.0.0" 8326 + } 8327 + }, 8328 + "node_modules/unicode-trie": { 8329 + "version": "2.0.0", 8330 + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", 8331 + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", 8332 + "license": "MIT", 8333 + "dependencies": { 8334 + "pako": "^0.2.5", 8335 + "tiny-inflate": "^1.0.0" 8336 + } 8337 + }, 8338 + "node_modules/unified": { 8339 + "version": "11.0.5", 8340 + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", 8341 + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", 8342 + "license": "MIT", 8343 + "dependencies": { 8344 + "@types/unist": "^3.0.0", 8345 + "bail": "^2.0.0", 8346 + "devlop": "^1.0.0", 8347 + "extend": "^3.0.0", 8348 + "is-plain-obj": "^4.0.0", 8349 + "trough": "^2.0.0", 8350 + "vfile": "^6.0.0" 8351 + }, 8352 + "funding": { 8353 + "type": "opencollective", 8354 + "url": "https://opencollective.com/unified" 8355 + } 8356 + }, 8357 + "node_modules/unifont": { 8358 + "version": "0.5.2", 8359 + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.5.2.tgz", 8360 + "integrity": "sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg==", 8361 + "license": "MIT", 8362 + "dependencies": { 8363 + "css-tree": "^3.0.0", 8364 + "ofetch": "^1.4.1", 8365 + "ohash": "^2.0.0" 8366 + } 8367 + }, 8368 + "node_modules/unifont/node_modules/css-tree": { 8369 + "version": "3.1.0", 8370 + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", 8371 + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", 8372 + "license": "MIT", 8373 + "dependencies": { 8374 + "mdn-data": "2.12.2", 8375 + "source-map-js": "^1.0.1" 8376 + }, 8377 + "engines": { 8378 + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 8379 + } 8380 + }, 8381 + "node_modules/unifont/node_modules/mdn-data": { 8382 + "version": "2.12.2", 8383 + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", 8384 + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", 8385 + "license": "CC0-1.0" 8386 + }, 8387 + "node_modules/unist-util-find-after": { 8388 + "version": "5.0.0", 8389 + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", 8390 + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", 8391 + "license": "MIT", 8392 + "dependencies": { 8393 + "@types/unist": "^3.0.0", 8394 + "unist-util-is": "^6.0.0" 8395 + }, 8396 + "funding": { 8397 + "type": "opencollective", 8398 + "url": "https://opencollective.com/unified" 8399 + } 8400 + }, 8401 + "node_modules/unist-util-is": { 8402 + "version": "6.0.0", 8403 + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", 8404 + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", 8405 + "license": "MIT", 8406 + "dependencies": { 8407 + "@types/unist": "^3.0.0" 8408 + }, 8409 + "funding": { 8410 + "type": "opencollective", 8411 + "url": "https://opencollective.com/unified" 8412 + } 8413 + }, 8414 + "node_modules/unist-util-modify-children": { 8415 + "version": "4.0.0", 8416 + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", 8417 + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", 8418 + "license": "MIT", 8419 + "dependencies": { 8420 + "@types/unist": "^3.0.0", 8421 + "array-iterate": "^2.0.0" 8422 + }, 8423 + "funding": { 8424 + "type": "opencollective", 8425 + "url": "https://opencollective.com/unified" 8426 + } 8427 + }, 8428 + "node_modules/unist-util-position": { 8429 + "version": "5.0.0", 8430 + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", 8431 + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", 8432 + "license": "MIT", 8433 + "dependencies": { 8434 + "@types/unist": "^3.0.0" 8435 + }, 8436 + "funding": { 8437 + "type": "opencollective", 8438 + "url": "https://opencollective.com/unified" 8439 + } 8440 + }, 8441 + "node_modules/unist-util-position-from-estree": { 8442 + "version": "2.0.0", 8443 + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", 8444 + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", 8445 + "license": "MIT", 8446 + "dependencies": { 8447 + "@types/unist": "^3.0.0" 8448 + }, 8449 + "funding": { 8450 + "type": "opencollective", 8451 + "url": "https://opencollective.com/unified" 8452 + } 8453 + }, 8454 + "node_modules/unist-util-remove-position": { 8455 + "version": "5.0.0", 8456 + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", 8457 + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", 8458 + "license": "MIT", 8459 + "dependencies": { 8460 + "@types/unist": "^3.0.0", 8461 + "unist-util-visit": "^5.0.0" 8462 + }, 8463 + "funding": { 8464 + "type": "opencollective", 8465 + "url": "https://opencollective.com/unified" 8466 + } 8467 + }, 8468 + "node_modules/unist-util-stringify-position": { 8469 + "version": "4.0.0", 8470 + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", 8471 + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", 8472 + "license": "MIT", 8473 + "dependencies": { 8474 + "@types/unist": "^3.0.0" 8475 + }, 8476 + "funding": { 8477 + "type": "opencollective", 8478 + "url": "https://opencollective.com/unified" 8479 + } 8480 + }, 8481 + "node_modules/unist-util-visit": { 8482 + "version": "5.0.0", 8483 + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", 8484 + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", 8485 + "license": "MIT", 8486 + "dependencies": { 8487 + "@types/unist": "^3.0.0", 8488 + "unist-util-is": "^6.0.0", 8489 + "unist-util-visit-parents": "^6.0.0" 8490 + }, 8491 + "funding": { 8492 + "type": "opencollective", 8493 + "url": "https://opencollective.com/unified" 8494 + } 8495 + }, 8496 + "node_modules/unist-util-visit-children": { 8497 + "version": "3.0.0", 8498 + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", 8499 + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", 8500 + "license": "MIT", 8501 + "dependencies": { 8502 + "@types/unist": "^3.0.0" 8503 + }, 8504 + "funding": { 8505 + "type": "opencollective", 8506 + "url": "https://opencollective.com/unified" 8507 + } 8508 + }, 8509 + "node_modules/unist-util-visit-parents": { 8510 + "version": "6.0.1", 8511 + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", 8512 + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", 8513 + "license": "MIT", 8514 + "dependencies": { 8515 + "@types/unist": "^3.0.0", 8516 + "unist-util-is": "^6.0.0" 8517 + }, 8518 + "funding": { 8519 + "type": "opencollective", 8520 + "url": "https://opencollective.com/unified" 8521 + } 8522 + }, 8523 + "node_modules/unstorage": { 8524 + "version": "1.16.0", 8525 + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.16.0.tgz", 8526 + "integrity": "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==", 8527 + "license": "MIT", 8528 + "dependencies": { 8529 + "anymatch": "^3.1.3", 8530 + "chokidar": "^4.0.3", 8531 + "destr": "^2.0.5", 8532 + "h3": "^1.15.2", 8533 + "lru-cache": "^10.4.3", 8534 + "node-fetch-native": "^1.6.6", 8535 + "ofetch": "^1.4.1", 8536 + "ufo": "^1.6.1" 8537 + }, 8538 + "peerDependencies": { 8539 + "@azure/app-configuration": "^1.8.0", 8540 + "@azure/cosmos": "^4.2.0", 8541 + "@azure/data-tables": "^13.3.0", 8542 + "@azure/identity": "^4.6.0", 8543 + "@azure/keyvault-secrets": "^4.9.0", 8544 + "@azure/storage-blob": "^12.26.0", 8545 + "@capacitor/preferences": "^6.0.3 || ^7.0.0", 8546 + "@deno/kv": ">=0.9.0", 8547 + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", 8548 + "@planetscale/database": "^1.19.0", 8549 + "@upstash/redis": "^1.34.3", 8550 + "@vercel/blob": ">=0.27.1", 8551 + "@vercel/kv": "^1.0.1", 8552 + "aws4fetch": "^1.0.20", 8553 + "db0": ">=0.2.1", 8554 + "idb-keyval": "^6.2.1", 8555 + "ioredis": "^5.4.2", 8556 + "uploadthing": "^7.4.4" 8557 + }, 8558 + "peerDependenciesMeta": { 8559 + "@azure/app-configuration": { 8560 + "optional": true 8561 + }, 8562 + "@azure/cosmos": { 8563 + "optional": true 8564 + }, 8565 + "@azure/data-tables": { 8566 + "optional": true 8567 + }, 8568 + "@azure/identity": { 8569 + "optional": true 8570 + }, 8571 + "@azure/keyvault-secrets": { 8572 + "optional": true 8573 + }, 8574 + "@azure/storage-blob": { 8575 + "optional": true 8576 + }, 8577 + "@capacitor/preferences": { 8578 + "optional": true 8579 + }, 8580 + "@deno/kv": { 8581 + "optional": true 8582 + }, 8583 + "@netlify/blobs": { 8584 + "optional": true 8585 + }, 8586 + "@planetscale/database": { 8587 + "optional": true 8588 + }, 8589 + "@upstash/redis": { 8590 + "optional": true 8591 + }, 8592 + "@vercel/blob": { 8593 + "optional": true 8594 + }, 8595 + "@vercel/kv": { 8596 + "optional": true 8597 + }, 8598 + "aws4fetch": { 8599 + "optional": true 8600 + }, 8601 + "db0": { 8602 + "optional": true 8603 + }, 8604 + "idb-keyval": { 8605 + "optional": true 8606 + }, 8607 + "ioredis": { 8608 + "optional": true 8609 + }, 8610 + "uploadthing": { 8611 + "optional": true 8612 + } 8613 + } 8614 + }, 8615 + "node_modules/util-deprecate": { 8616 + "version": "1.0.2", 8617 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 8618 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 8619 + "license": "MIT" 8620 + }, 8621 + "node_modules/varint": { 8622 + "version": "6.0.0", 8623 + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", 8624 + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", 8625 + "devOptional": true, 8626 + "license": "MIT" 8627 + }, 8628 + "node_modules/vfile": { 8629 + "version": "6.0.3", 8630 + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", 8631 + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", 8632 + "license": "MIT", 8633 + "dependencies": { 8634 + "@types/unist": "^3.0.0", 8635 + "vfile-message": "^4.0.0" 8636 + }, 8637 + "funding": { 8638 + "type": "opencollective", 8639 + "url": "https://opencollective.com/unified" 8640 + } 8641 + }, 8642 + "node_modules/vfile-location": { 8643 + "version": "5.0.3", 8644 + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", 8645 + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", 8646 + "license": "MIT", 8647 + "dependencies": { 8648 + "@types/unist": "^3.0.0", 8649 + "vfile": "^6.0.0" 8650 + }, 8651 + "funding": { 8652 + "type": "opencollective", 8653 + "url": "https://opencollective.com/unified" 8654 + } 8655 + }, 8656 + "node_modules/vfile-message": { 8657 + "version": "4.0.2", 8658 + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", 8659 + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", 8660 + "license": "MIT", 8661 + "dependencies": { 8662 + "@types/unist": "^3.0.0", 8663 + "unist-util-stringify-position": "^4.0.0" 8664 + }, 8665 + "funding": { 8666 + "type": "opencollective", 8667 + "url": "https://opencollective.com/unified" 8668 + } 8669 + }, 8670 + "node_modules/vite": { 8671 + "version": "7.0.4", 8672 + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.4.tgz", 8673 + "integrity": "sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==", 8674 + "license": "MIT", 8675 + "peer": true, 8676 + "dependencies": { 8677 + "esbuild": "^0.25.0", 8678 + "fdir": "^6.4.6", 8679 + "picomatch": "^4.0.2", 8680 + "postcss": "^8.5.6", 8681 + "rollup": "^4.40.0", 8682 + "tinyglobby": "^0.2.14" 8683 + }, 8684 + "bin": { 8685 + "vite": "bin/vite.js" 8686 + }, 8687 + "engines": { 8688 + "node": "^20.19.0 || >=22.12.0" 8689 + }, 8690 + "funding": { 8691 + "url": "https://github.com/vitejs/vite?sponsor=1" 8692 + }, 8693 + "optionalDependencies": { 8694 + "fsevents": "~2.3.3" 8695 + }, 8696 + "peerDependencies": { 8697 + "@types/node": "^20.19.0 || >=22.12.0", 8698 + "jiti": ">=1.21.0", 8699 + "less": "^4.0.0", 8700 + "lightningcss": "^1.21.0", 8701 + "sass": "^1.70.0", 8702 + "sass-embedded": "^1.70.0", 8703 + "stylus": ">=0.54.8", 8704 + "sugarss": "^5.0.0", 8705 + "terser": "^5.16.0", 8706 + "tsx": "^4.8.1", 8707 + "yaml": "^2.4.2" 8708 + }, 8709 + "peerDependenciesMeta": { 8710 + "@types/node": { 8711 + "optional": true 8712 + }, 8713 + "jiti": { 8714 + "optional": true 8715 + }, 8716 + "less": { 8717 + "optional": true 8718 + }, 8719 + "lightningcss": { 8720 + "optional": true 8721 + }, 8722 + "sass": { 8723 + "optional": true 8724 + }, 8725 + "sass-embedded": { 8726 + "optional": true 8727 + }, 8728 + "stylus": { 8729 + "optional": true 8730 + }, 8731 + "sugarss": { 8732 + "optional": true 8733 + }, 8734 + "terser": { 8735 + "optional": true 8736 + }, 8737 + "tsx": { 8738 + "optional": true 8739 + }, 8740 + "yaml": { 8741 + "optional": true 8742 + } 8743 + } 8744 + }, 8745 + "node_modules/vitefu": { 8746 + "version": "1.1.1", 8747 + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", 8748 + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", 8749 + "license": "MIT", 8750 + "workspaces": [ 8751 + "tests/deps/*", 8752 + "tests/projects/*", 8753 + "tests/projects/workspace/packages/*" 8754 + ], 8755 + "peerDependencies": { 8756 + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" 8757 + }, 8758 + "peerDependenciesMeta": { 8759 + "vite": { 8760 + "optional": true 8761 + } 8762 + } 8763 + }, 8764 + "node_modules/vscode-languageserver-textdocument": { 8765 + "version": "1.0.12", 8766 + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", 8767 + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", 8768 + "license": "MIT" 8769 + }, 8770 + "node_modules/vscode-uri": { 8771 + "version": "3.1.0", 8772 + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", 8773 + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", 8774 + "license": "MIT" 8775 + }, 8776 + "node_modules/web-namespaces": { 8777 + "version": "2.0.1", 8778 + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", 8779 + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", 8780 + "license": "MIT", 8781 + "funding": { 8782 + "type": "github", 8783 + "url": "https://github.com/sponsors/wooorm" 8784 + } 8785 + }, 8786 + "node_modules/webidl-conversions": { 8787 + "version": "3.0.1", 8788 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 8789 + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 8790 + "license": "BSD-2-Clause" 8791 + }, 8792 + "node_modules/whatwg-url": { 8793 + "version": "5.0.0", 8794 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 8795 + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 8796 + "license": "MIT", 8797 + "dependencies": { 8798 + "tr46": "~0.0.3", 8799 + "webidl-conversions": "^3.0.0" 8800 + } 8801 + }, 8802 + "node_modules/which-pm-runs": { 8803 + "version": "1.1.0", 8804 + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", 8805 + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", 8806 + "license": "MIT", 8807 + "engines": { 8808 + "node": ">=4" 8809 + } 8810 + }, 8811 + "node_modules/widest-line": { 8812 + "version": "5.0.0", 8813 + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", 8814 + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", 8815 + "license": "MIT", 8816 + "dependencies": { 8817 + "string-width": "^7.0.0" 8818 + }, 8819 + "engines": { 8820 + "node": ">=18" 8821 + }, 8822 + "funding": { 8823 + "url": "https://github.com/sponsors/sindresorhus" 8824 + } 8825 + }, 8826 + "node_modules/wrap-ansi": { 8827 + "version": "9.0.0", 8828 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", 8829 + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", 8830 + "license": "MIT", 8831 + "dependencies": { 8832 + "ansi-styles": "^6.2.1", 8833 + "string-width": "^7.0.0", 8834 + "strip-ansi": "^7.1.0" 8835 + }, 8836 + "engines": { 8837 + "node": ">=18" 8838 + }, 8839 + "funding": { 8840 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 8841 + } 8842 + }, 8843 + "node_modules/xxhash-wasm": { 8844 + "version": "1.1.0", 8845 + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", 8846 + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", 8847 + "license": "MIT" 8848 + }, 8849 + "node_modules/yallist": { 8850 + "version": "5.0.0", 8851 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", 8852 + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", 8853 + "license": "BlueOak-1.0.0", 8854 + "engines": { 8855 + "node": ">=18" 8856 + } 8857 + }, 8858 + "node_modules/yaml": { 8859 + "version": "2.8.0", 8860 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", 8861 + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", 8862 + "license": "ISC", 8863 + "bin": { 8864 + "yaml": "bin.mjs" 8865 + }, 8866 + "engines": { 8867 + "node": ">= 14.6" 8868 + } 8869 + }, 8870 + "node_modules/yargs-parser": { 8871 + "version": "21.1.1", 8872 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 8873 + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 8874 + "license": "ISC", 8875 + "engines": { 8876 + "node": ">=12" 8877 + } 8878 + }, 8879 + "node_modules/yocto-queue": { 8880 + "version": "1.2.1", 8881 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", 8882 + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", 8883 + "license": "MIT", 8884 + "engines": { 8885 + "node": ">=12.20" 8886 + }, 8887 + "funding": { 8888 + "url": "https://github.com/sponsors/sindresorhus" 8889 + } 8890 + }, 8891 + "node_modules/yocto-spinner": { 8892 + "version": "0.2.3", 8893 + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", 8894 + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", 8895 + "license": "MIT", 8896 + "dependencies": { 8897 + "yoctocolors": "^2.1.1" 8898 + }, 8899 + "engines": { 8900 + "node": ">=18.19" 8901 + }, 8902 + "funding": { 8903 + "url": "https://github.com/sponsors/sindresorhus" 8904 + } 8905 + }, 8906 + "node_modules/yoctocolors": { 8907 + "version": "2.1.1", 8908 + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", 8909 + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", 8910 + "license": "MIT", 8911 + "engines": { 8912 + "node": ">=18" 8913 + }, 8914 + "funding": { 8915 + "url": "https://github.com/sponsors/sindresorhus" 8916 + } 8917 + }, 8918 + "node_modules/yoga-layout": { 8919 + "version": "3.2.1", 8920 + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", 8921 + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", 8922 + "license": "MIT" 8923 + }, 8924 + "node_modules/zod": { 8925 + "version": "3.25.76", 8926 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 8927 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 8928 + "license": "MIT", 8929 + "funding": { 8930 + "url": "https://github.com/sponsors/colinhacks" 8931 + } 8932 + }, 8933 + "node_modules/zod-to-json-schema": { 8934 + "version": "3.24.6", 8935 + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", 8936 + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", 8937 + "license": "ISC", 8938 + "peerDependencies": { 8939 + "zod": "^3.24.1" 8940 + } 8941 + }, 8942 + "node_modules/zod-to-ts": { 8943 + "version": "1.2.0", 8944 + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", 8945 + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", 8946 + "peerDependencies": { 8947 + "typescript": "^4.9.4 || ^5.0.2", 8948 + "zod": "^3" 8949 + } 8950 + }, 8951 + "node_modules/zwitch": { 8952 + "version": "2.0.4", 8953 + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", 8954 + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", 8955 + "license": "MIT", 8956 + "funding": { 8957 + "type": "github", 8958 + "url": "https://github.com/sponsors/wooorm" 8959 + } 8960 + } 8961 + } 8962 + }
+63
package.json
··· 1 + { 2 + "name": "multiterm-astro", 3 + "description": "A terminal-inspired coding blog built with Astro.", 4 + "type": "module", 5 + "version": "1.0.0", 6 + "scripts": { 7 + "dev": "astro dev", 8 + "build": "astro build", 9 + "postbuild": "pagefind --site dist", 10 + "preview": "astro preview", 11 + "astro": "astro", 12 + "format": "prettier --write ." 13 + }, 14 + "dependencies": { 15 + "@astrojs/markdown-remark": "^6.3.6", 16 + "@astrojs/mdx": "^4.3.9", 17 + "@astrojs/rss": "^4.0.12", 18 + "@astrojs/sitemap": "^3.5.1", 19 + "@astrojs/ts-plugin": "^1.10.4", 20 + "@expo-google-fonts/jetbrains-mono": "^0.4.0", 21 + "@expressive-code/plugin-line-numbers": "^0.41.3", 22 + "@fontsource-variable/jetbrains-mono": "^5.2.6", 23 + "@pagefind/default-ui": "^1.4.0", 24 + "@resvg/resvg-js": "^2.6.2", 25 + "@tailwindcss/vite": "^4.1.13", 26 + "@types/hast": "^3.0.4", 27 + "@types/react": "^19.1.12", 28 + "@types/react-dom": "^19.1.9", 29 + "astro": "^5.13.5", 30 + "astro-expressive-code": "^0.41.3", 31 + "color": "^5.0.0", 32 + "date-fns": "^4.1.0", 33 + "emoji-regex": "^10.5.0", 34 + "gemoji": "^8.1.0", 35 + "hast-util-from-html-isomorphic": "^2.0.0", 36 + "hastscript": "^9.0.1", 37 + "katex": "^0.16.22", 38 + "markdown-it": "^14.1.0", 39 + "mdast-util-directive": "^3.1.0", 40 + "mdast-util-to-string": "^4.0.0", 41 + "reading-time": "^1.5.0", 42 + "rehype-autolink-headings": "^7.1.0", 43 + "rehype-external-links": "^3.0.0", 44 + "rehype-katex": "^7.0.1", 45 + "rehype-unwrap-images": "^1.0.0", 46 + "remark-directive": "^4.0.0", 47 + "remark-math": "^6.0.0", 48 + "sanitize-html": "^2.17.0", 49 + "satori": "^0.18.2", 50 + "satori-html": "^0.3.2", 51 + "tailwindcss": "^4.1.13", 52 + "typescript": "^5.9.2", 53 + "unified": "^11.0.5" 54 + }, 55 + "devDependencies": { 56 + "@types/markdown-it": "^14.1.2", 57 + "@types/sanitize-html": "^2.16.0", 58 + "pagefind": "^1.4.0", 59 + "prettier": "3.6.2", 60 + "prettier-plugin-astro": "0.14.1", 61 + "sass-embedded": "^1.92.1" 62 + } 63 + }
+21
prettier.config.js
··· 1 + // Typescript file would be better but it's currently experimental 2 + 3 + const config = { 4 + semi: false, 5 + singleQuote: true, 6 + trailingComma: 'all', 7 + printWidth: 90, 8 + tabWidth: 2, 9 + useTabs: false, 10 + plugins: ['prettier-plugin-astro'], 11 + overrides: [ 12 + { 13 + files: '*.astro', 14 + options: { 15 + parser: 'astro', 16 + }, 17 + }, 18 + ], 19 + } 20 + 21 + export default config
public/duck.webp

This is a binary file and will not be displayed.

+9
public/favicon.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128"> 2 + <path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" /> 3 + <style> 4 + path { fill: #000; } 5 + @media (prefers-color-scheme: dark) { 6 + path { fill: #FFF; } 7 + } 8 + </style> 9 + </svg>
public/owl.webp

This is a binary file and will not be displayed.

+141
public/rss.xsl
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <!-- 3 + 4 + # Pretty Feed 5 + 6 + Styles an RSS/Atom feed, making it friendly for humans viewers, and adds a link 7 + to aboutfeeds.com for new user onboarding. See it in action: 8 + 9 + https://interconnected.org/home/feed 10 + 11 + 12 + ## How to use 13 + 14 + 1. Download this XML stylesheet from the following URL and host it on your own 15 + domain (this is a limitation of XSL in browsers): 16 + 17 + https://github.com/genmon/aboutfeeds/blob/main/tools/pretty-feed-v3.xsl 18 + 19 + 2. Include the XSL at the top of the RSS/Atom feed, like: 20 + 21 + ``` 22 + <?xml version="1.0" encoding="UTF-8"?> 23 + <?xml-stylesheet href="/PATH-TO-YOUR-STYLES/pretty-feed-v3.xsl" type="text/xsl"?> 24 + ``` 25 + 26 + 3. Serve the feed with the following HTTP headers: 27 + 28 + ``` 29 + Content-Type: application/xml; charset=utf-8 # not application/rss+xml 30 + x-content-type-options: nosniff 31 + ``` 32 + 33 + (These headers are required to style feeds for users with Safari on iOS/Mac.) 34 + 35 + 36 + 37 + ## Limitations 38 + 39 + - Styling the feed *prevents* the browser from automatically opening a 40 + newsreader application. This is a trade off, but it's a benefit to new users 41 + who won't have a newsreader installed, and they are saved from seeing or 42 + downloaded obscure XML content. For existing newsreader users, they will know 43 + to copy-and-paste the feed URL, and they get the benefit of an in-browser feed 44 + preview. 45 + - Feed styling, for all browsers, is only available to site owners who control 46 + their own platform. The need to add both XML and HTTP headers makes this a 47 + limited solution. 48 + 49 + 50 + ## Credits 51 + 52 + pretty-feed is based on work by lepture.com: 53 + 54 + https://lepture.com/en/2019/rss-style-with-xsl 55 + 56 + This current version is maintained by aboutfeeds.com: 57 + 58 + https://github.com/genmon/aboutfeeds 59 + 60 + 61 + ## Feedback 62 + 63 + This file is in BETA. Please test and contribute to the discussion: 64 + 65 + https://github.com/genmon/aboutfeeds/issues/8 66 + 67 + --> 68 + <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 69 + xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" 70 + xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"> 71 + <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> 72 + <xsl:template match="/"> 73 + <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 74 + <head> 75 + <title><xsl:value-of select="/rss/channel/title"/> Web Feed</title> 76 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 77 + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/> 78 + <style type="text/css">/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none!important}a{background-color:transparent}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}*{box-sizing:border-box}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px;line-height:1.5;color:#24292e;background-color:#fff}a{color:#0366d6;text-decoration:none}a:hover{text-decoration:underline}b,strong{font-weight:600}.rule,hr{height:0;margin:15px 0;overflow:hidden;background:0 0;border:0;border-bottom:1px solid #dfe2e5}.rule::before,hr::before{display:table;content:""}.rule::after,hr::after{display:table;clear:both;content:""}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}button{cursor:pointer;border-radius:0}[hidden][hidden]{display:none!important}details summary{cursor:pointer}details:not([open])>* :not(summary){display:none!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:0}h1{font-size:32px;font-weight:600}h2{font-size:24px;font-weight:600}h3{font-size:20px;font-weight:600}h4{font-size:16px;font-weight:600}h5{font-size:14px;font-weight:600}h6{font-size:12px;font-weight:600}p{margin-top:0;margin-bottom:10px}small{font-size:90%}blockquote{margin:0}ol,ul{padding-left:0;margin-top:0;margin-bottom:0}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}dd{margin-left:0}code,tt{font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px}pre{margin-top:0;margin-bottom:0;font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px}.octicon{vertical-align:text-bottom}.anim-fade-in{animation-name:fade-in;animation-duration:1s;animation-timing-function:ease-in-out}.anim-fade-in.fast{animation-duration:.3s}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.anim-fade-out{animation-name:fade-out;animation-duration:1s;animation-timing-function:ease-out}.anim-fade-out.fast{animation-duration:.3s}@keyframes fade-out{0%{opacity:1}100%{opacity:0}}.anim-fade-up{opacity:0;animation-name:fade-up;animation-duration:.3s;animation-fill-mode:forwards;animation-timing-function:ease-out;animation-delay:1s}@keyframes fade-up{0%{opacity:.8;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}.anim-fade-down{animation-name:fade-down;animation-duration:.3s;animation-fill-mode:forwards;animation-timing-function:ease-in}@keyframes fade-down{0%{opacity:1;transform:translateY(0)}100%{opacity:.5;transform:translateY(100%)}}.anim-grow-x{width:0%;animation-name:grow-x;animation-duration:.3s;animation-fill-mode:forwards;animation-timing-function:ease;animation-delay:.5s}@keyframes grow-x{to{width:100%}}.anim-shrink-x{animation-name:shrink-x;animation-duration:.3s;animation-fill-mode:forwards;animation-timing-function:ease-in-out;animation-delay:.5s}@keyframes shrink-x{to{width:0%}}.anim-scale-in{animation-name:scale-in;animation-duration:.15s;animation-timing-function:cubic-bezier(.2,0,.13,1.5)}@keyframes scale-in{0%{opacity:0;transform:scale(.5)}100%{opacity:1;transform:scale(1)}}.anim-pulse{animation-name:pulse;animation-duration:2s;animation-timing-function:linear;animation-iteration-count:infinite}@keyframes pulse{0%{opacity:.3}10%{opacity:1}100%{opacity:.3}}.anim-pulse-in{animation-name:pulse-in;animation-duration:.5s}@keyframes pulse-in{0%{transform:scale3d(1,1,1)}50%{transform:scale3d(1.1,1.1,1.1)}100%{transform:scale3d(1,1,1)}}.hover-grow{transition:transform .3s;backface-visibility:hidden}.hover-grow:hover{transform:scale(1.025)}.border{border:1px #e1e4e8 solid!important}.border-y{border-top:1px #e1e4e8 solid!important;border-bottom:1px #e1e4e8 solid!important}.border-0{border:0!important}.border-dashed{border-style:dashed!important}.border-blue{border-color:#0366d6!important}.border-blue-light{border-color:#c8e1ff!important}.border-green{border-color:#34d058!important}.border-green-light{border-color:#a2cbac!important}.border-red{border-color:#d73a49!important}.border-red-light{border-color:#cea0a5!important}.border-purple{border-color:#6f42c1!important}.border-yellow{border-color:#d9d0a5!important}.border-gray-light{border-color:#eaecef!important}.border-gray-dark{border-color:#d1d5da!important}.border-black-fade{border-color:rgba(27,31,35,.15)!important}.border-top{border-top:1px #e1e4e8 solid!important}.border-right{border-right:1px #e1e4e8 solid!important}.border-bottom{border-bottom:1px #e1e4e8 solid!important}.border-left{border-left:1px #e1e4e8 solid!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:3px!important}.rounded-2{border-radius:6px!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:3px!important;border-top-right-radius:3px!important}.rounded-top-2{border-top-left-radius:6px!important;border-top-right-radius:6px!important}.rounded-right-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-right-1{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.rounded-right-2{border-top-right-radius:6px!important;border-bottom-right-radius:6px!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:3px!important;border-bottom-left-radius:3px!important}.rounded-bottom-2{border-bottom-right-radius:6px!important;border-bottom-left-radius:6px!important}.rounded-left-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-left-1{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.rounded-left-2{border-bottom-left-radius:6px!important;border-top-left-radius:6px!important}@media (min-width:544px){.border-sm-top{border-top:1px #e1e4e8 solid!important}.border-sm-right{border-right:1px #e1e4e8 solid!important}.border-sm-bottom{border-bottom:1px #e1e4e8 solid!important}.border-sm-left{border-left:1px #e1e4e8 solid!important}.border-sm-top-0{border-top:0!important}.border-sm-right-0{border-right:0!important}.border-sm-bottom-0{border-bottom:0!important}.border-sm-left-0{border-left:0!important}.rounded-sm-0{border-radius:0!important}.rounded-sm-1{border-radius:3px!important}.rounded-sm-2{border-radius:6px!important}.rounded-sm-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-sm-top-1{border-top-left-radius:3px!important;border-top-right-radius:3px!important}.rounded-sm-top-2{border-top-left-radius:6px!important;border-top-right-radius:6px!important}.rounded-sm-right-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-sm-right-1{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.rounded-sm-right-2{border-top-right-radius:6px!important;border-bottom-right-radius:6px!important}.rounded-sm-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-sm-bottom-1{border-bottom-right-radius:3px!important;border-bottom-left-radius:3px!important}.rounded-sm-bottom-2{border-bottom-right-radius:6px!important;border-bottom-left-radius:6px!important}.rounded-sm-left-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-sm-left-1{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.rounded-sm-left-2{border-bottom-left-radius:6px!important;border-top-left-radius:6px!important}}@media (min-width:768px){.border-md-top{border-top:1px #e1e4e8 solid!important}.border-md-right{border-right:1px #e1e4e8 solid!important}.border-md-bottom{border-bottom:1px #e1e4e8 solid!important}.border-md-left{border-left:1px #e1e4e8 solid!important}.border-md-top-0{border-top:0!important}.border-md-right-0{border-right:0!important}.border-md-bottom-0{border-bottom:0!important}.border-md-left-0{border-left:0!important}.rounded-md-0{border-radius:0!important}.rounded-md-1{border-radius:3px!important}.rounded-md-2{border-radius:6px!important}.rounded-md-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-md-top-1{border-top-left-radius:3px!important;border-top-right-radius:3px!important}.rounded-md-top-2{border-top-left-radius:6px!important;border-top-right-radius:6px!important}.rounded-md-right-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-md-right-1{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.rounded-md-right-2{border-top-right-radius:6px!important;border-bottom-right-radius:6px!important}.rounded-md-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-md-bottom-1{border-bottom-right-radius:3px!important;border-bottom-left-radius:3px!important}.rounded-md-bottom-2{border-bottom-right-radius:6px!important;border-bottom-left-radius:6px!important}.rounded-md-left-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-md-left-1{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.rounded-md-left-2{border-bottom-left-radius:6px!important;border-top-left-radius:6px!important}}@media (min-width:1012px){.border-lg-top{border-top:1px #e1e4e8 solid!important}.border-lg-right{border-right:1px #e1e4e8 solid!important}.border-lg-bottom{border-bottom:1px #e1e4e8 solid!important}.border-lg-left{border-left:1px #e1e4e8 solid!important}.border-lg-top-0{border-top:0!important}.border-lg-right-0{border-right:0!important}.border-lg-bottom-0{border-bottom:0!important}.border-lg-left-0{border-left:0!important}.rounded-lg-0{border-radius:0!important}.rounded-lg-1{border-radius:3px!important}.rounded-lg-2{border-radius:6px!important}.rounded-lg-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-lg-top-1{border-top-left-radius:3px!important;border-top-right-radius:3px!important}.rounded-lg-top-2{border-top-left-radius:6px!important;border-top-right-radius:6px!important}.rounded-lg-right-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-lg-right-1{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.rounded-lg-right-2{border-top-right-radius:6px!important;border-bottom-right-radius:6px!important}.rounded-lg-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-lg-bottom-1{border-bottom-right-radius:3px!important;border-bottom-left-radius:3px!important}.rounded-lg-bottom-2{border-bottom-right-radius:6px!important;border-bottom-left-radius:6px!important}.rounded-lg-left-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-lg-left-1{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.rounded-lg-left-2{border-bottom-left-radius:6px!important;border-top-left-radius:6px!important}}@media (min-width:1280px){.border-xl-top{border-top:1px #e1e4e8 solid!important}.border-xl-right{border-right:1px #e1e4e8 solid!important}.border-xl-bottom{border-bottom:1px #e1e4e8 solid!important}.border-xl-left{border-left:1px #e1e4e8 solid!important}.border-xl-top-0{border-top:0!important}.border-xl-right-0{border-right:0!important}.border-xl-bottom-0{border-bottom:0!important}.border-xl-left-0{border-left:0!important}.rounded-xl-0{border-radius:0!important}.rounded-xl-1{border-radius:3px!important}.rounded-xl-2{border-radius:6px!important}.rounded-xl-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-xl-top-1{border-top-left-radius:3px!important;border-top-right-radius:3px!important}.rounded-xl-top-2{border-top-left-radius:6px!important;border-top-right-radius:6px!important}.rounded-xl-right-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-xl-right-1{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.rounded-xl-right-2{border-top-right-radius:6px!important;border-bottom-right-radius:6px!important}.rounded-xl-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-xl-bottom-1{border-bottom-right-radius:3px!important;border-bottom-left-radius:3px!important}.rounded-xl-bottom-2{border-bottom-right-radius:6px!important;border-bottom-left-radius:6px!important}.rounded-xl-left-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-xl-left-1{border-bottom-left-radius:3px!important;border-top-left-radius:3px!important}.rounded-xl-left-2{border-bottom-left-radius:6px!important;border-top-left-radius:6px!important}}.circle{border-radius:50%!important}.box-shadow{box-shadow:0 1px 1px rgba(27,31,35,.1)!important}.box-shadow-medium{box-shadow:0 1px 5px rgba(27,31,35,.15)!important}.box-shadow-large{box-shadow:0 1px 15px rgba(27,31,35,.15)!important}.box-shadow-extra-large{box-shadow:0 10px 50px rgba(27,31,35,.07)!important}.box-shadow-none{box-shadow:none!important}.bg-white{background-color:#fff!important}.bg-blue{background-color:#0366d6!important}.bg-blue-light{background-color:#f1f8ff!important}.bg-gray-dark{background-color:#24292e!important}.bg-gray{background-color:#f6f8fa!important}.bg-gray-light{background-color:#fafbfc!important}.bg-green{background-color:#28a745!important}.bg-green-light{background-color:#dcffe4!important}.bg-red{background-color:#d73a49!important}.bg-red-light{background-color:#ffdce0!important}.bg-yellow{background-color:#ffd33d!important}.bg-yellow-light{background-color:#fff5b1!important}.bg-purple{background-color:#6f42c1!important}.bg-purple-light{background-color:#f5f0ff!important}.bg-shade-gradient{background-image:linear-gradient(180deg,rgba(27,31,35,.065),rgba(27,31,35,0))!important;background-repeat:no-repeat!important;background-size:100% 200px!important}.text-blue{color:#0366d6!important}.text-red{color:#cb2431!important}.text-gray-light{color:#6a737d!important}.text-gray{color:#586069!important}.text-gray-dark{color:#24292e!important}.text-green{color:#28a745!important}.text-orange{color:#a04100!important}.text-orange-light{color:#e36209!important}.text-purple{color:#6f42c1!important}.text-white{color:#fff!important}.text-inherit{color:inherit!important}.text-pending{color:#b08800!important}.bg-pending{color:#dbab09!important}.link-gray{color:#586069!important}.link-gray:hover{color:#0366d6!important}.link-gray-dark{color:#24292e!important}.link-gray-dark:hover{color:#0366d6!important}.link-hover-blue:hover{color:#0366d6!important}.muted-link{color:#586069!important}.muted-link:hover{color:#0366d6!important;text-decoration:none}.details-overlay[open]>summary::before{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;display:block;cursor:default;content:" ";background:0 0}.details-overlay-dark[open]>summary::before{z-index:99;background:rgba(27,31,35,.5)}.flex-row{flex-direction:row!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column{flex-direction:column!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-justify-start{justify-content:flex-start!important}.flex-justify-end{justify-content:flex-end!important}.flex-justify-center{justify-content:center!important}.flex-justify-between{justify-content:space-between!important}.flex-justify-around{justify-content:space-around!important}.flex-items-start{align-items:flex-start!important}.flex-items-end{align-items:flex-end!important}.flex-items-center{align-items:center!important}.flex-items-baseline{align-items:baseline!important}.flex-items-stretch{align-items:stretch!important}.flex-content-start{align-content:flex-start!important}.flex-content-end{align-content:flex-end!important}.flex-content-center{align-content:center!important}.flex-content-between{align-content:space-between!important}.flex-content-around{align-content:space-around!important}.flex-content-stretch{align-content:stretch!important}.flex-auto{flex:1 1 auto!important}.flex-shrink-0{flex-shrink:0!important}.flex-self-auto{align-self:auto!important}.flex-self-start{align-self:flex-start!important}.flex-self-end{align-self:flex-end!important}.flex-self-center{align-self:center!important}.flex-self-baseline{align-self:baseline!important}.flex-self-stretch{align-self:stretch!important}.flex-item-equal{flex-grow:1;flex-basis:0}@media (min-width:544px){.flex-sm-row{flex-direction:row!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column{flex-direction:column!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-justify-start{justify-content:flex-start!important}.flex-sm-justify-end{justify-content:flex-end!important}.flex-sm-justify-center{justify-content:center!important}.flex-sm-justify-between{justify-content:space-between!important}.flex-sm-justify-around{justify-content:space-around!important}.flex-sm-items-start{align-items:flex-start!important}.flex-sm-items-end{align-items:flex-end!important}.flex-sm-items-center{align-items:center!important}.flex-sm-items-baseline{align-items:baseline!important}.flex-sm-items-stretch{align-items:stretch!important}.flex-sm-content-start{align-content:flex-start!important}.flex-sm-content-end{align-content:flex-end!important}.flex-sm-content-center{align-content:center!important}.flex-sm-content-between{align-content:space-between!important}.flex-sm-content-around{align-content:space-around!important}.flex-sm-content-stretch{align-content:stretch!important}.flex-sm-auto{flex:1 1 auto!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-self-auto{align-self:auto!important}.flex-sm-self-start{align-self:flex-start!important}.flex-sm-self-end{align-self:flex-end!important}.flex-sm-self-center{align-self:center!important}.flex-sm-self-baseline{align-self:baseline!important}.flex-sm-self-stretch{align-self:stretch!important}.flex-sm-item-equal{flex-grow:1;flex-basis:0}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column{flex-direction:column!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-justify-start{justify-content:flex-start!important}.flex-md-justify-end{justify-content:flex-end!important}.flex-md-justify-center{justify-content:center!important}.flex-md-justify-between{justify-content:space-between!important}.flex-md-justify-around{justify-content:space-around!important}.flex-md-items-start{align-items:flex-start!important}.flex-md-items-end{align-items:flex-end!important}.flex-md-items-center{align-items:center!important}.flex-md-items-baseline{align-items:baseline!important}.flex-md-items-stretch{align-items:stretch!important}.flex-md-content-start{align-content:flex-start!important}.flex-md-content-end{align-content:flex-end!important}.flex-md-content-center{align-content:center!important}.flex-md-content-between{align-content:space-between!important}.flex-md-content-around{align-content:space-around!important}.flex-md-content-stretch{align-content:stretch!important}.flex-md-auto{flex:1 1 auto!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-self-auto{align-self:auto!important}.flex-md-self-start{align-self:flex-start!important}.flex-md-self-end{align-self:flex-end!important}.flex-md-self-center{align-self:center!important}.flex-md-self-baseline{align-self:baseline!important}.flex-md-self-stretch{align-self:stretch!important}.flex-md-item-equal{flex-grow:1;flex-basis:0}}@media (min-width:1012px){.flex-lg-row{flex-direction:row!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column{flex-direction:column!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-justify-start{justify-content:flex-start!important}.flex-lg-justify-end{justify-content:flex-end!important}.flex-lg-justify-center{justify-content:center!important}.flex-lg-justify-between{justify-content:space-between!important}.flex-lg-justify-around{justify-content:space-around!important}.flex-lg-items-start{align-items:flex-start!important}.flex-lg-items-end{align-items:flex-end!important}.flex-lg-items-center{align-items:center!important}.flex-lg-items-baseline{align-items:baseline!important}.flex-lg-items-stretch{align-items:stretch!important}.flex-lg-content-start{align-content:flex-start!important}.flex-lg-content-end{align-content:flex-end!important}.flex-lg-content-center{align-content:center!important}.flex-lg-content-between{align-content:space-between!important}.flex-lg-content-around{align-content:space-around!important}.flex-lg-content-stretch{align-content:stretch!important}.flex-lg-auto{flex:1 1 auto!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-self-auto{align-self:auto!important}.flex-lg-self-start{align-self:flex-start!important}.flex-lg-self-end{align-self:flex-end!important}.flex-lg-self-center{align-self:center!important}.flex-lg-self-baseline{align-self:baseline!important}.flex-lg-self-stretch{align-self:stretch!important}.flex-lg-item-equal{flex-grow:1;flex-basis:0}}@media (min-width:1280px){.flex-xl-row{flex-direction:row!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column{flex-direction:column!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-justify-start{justify-content:flex-start!important}.flex-xl-justify-end{justify-content:flex-end!important}.flex-xl-justify-center{justify-content:center!important}.flex-xl-justify-between{justify-content:space-between!important}.flex-xl-justify-around{justify-content:space-around!important}.flex-xl-items-start{align-items:flex-start!important}.flex-xl-items-end{align-items:flex-end!important}.flex-xl-items-center{align-items:center!important}.flex-xl-items-baseline{align-items:baseline!important}.flex-xl-items-stretch{align-items:stretch!important}.flex-xl-content-start{align-content:flex-start!important}.flex-xl-content-end{align-content:flex-end!important}.flex-xl-content-center{align-content:center!important}.flex-xl-content-between{align-content:space-between!important}.flex-xl-content-around{align-content:space-around!important}.flex-xl-content-stretch{align-content:stretch!important}.flex-xl-auto{flex:1 1 auto!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-self-auto{align-self:auto!important}.flex-xl-self-start{align-self:flex-start!important}.flex-xl-self-end{align-self:flex-end!important}.flex-xl-self-center{align-self:center!important}.flex-xl-self-baseline{align-self:baseline!important}.flex-xl-self-stretch{align-self:stretch!important}.flex-xl-item-equal{flex-grow:1;flex-basis:0}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.top-0{top:0!important}.right-0{right:0!important}.bottom-0{bottom:0!important}.left-0{left:0!important}.v-align-middle{vertical-align:middle!important}.v-align-top{vertical-align:top!important}.v-align-bottom{vertical-align:bottom!important}.v-align-text-top{vertical-align:text-top!important}.v-align-text-bottom{vertical-align:text-bottom!important}.v-align-baseline{vertical-align:baseline!important}.overflow-hidden{overflow:hidden!important}.overflow-scroll{overflow:scroll!important}.overflow-auto{overflow:auto!important}.clearfix::before{display:table;content:""}.clearfix::after{display:table;clear:both;content:""}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:544px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:1012px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1280px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.width-fit{max-width:100%!important}.width-full{width:100%!important}.height-fit{max-height:100%!important}.height-full{height:100%!important}.min-width-0{min-width:0!important}.direction-rtl{direction:rtl!important}.direction-ltr{direction:ltr!important}@media (min-width:544px){.direction-sm-rtl{direction:rtl!important}.direction-sm-ltr{direction:ltr!important}}@media (min-width:768px){.direction-md-rtl{direction:rtl!important}.direction-md-ltr{direction:ltr!important}}@media (min-width:1012px){.direction-lg-rtl{direction:rtl!important}.direction-lg-ltr{direction:ltr!important}}@media (min-width:1280px){.direction-xl-rtl{direction:rtl!important}.direction-xl-ltr{direction:ltr!important}}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:4px!important}.mt-1{margin-top:4px!important}.mr-1{margin-right:4px!important}.mb-1{margin-bottom:4px!important}.ml-1{margin-left:4px!important}.mt-n1{margin-top:-4px!important}.mr-n1{margin-right:-4px!important}.mb-n1{margin-bottom:-4px!important}.ml-n1{margin-left:-4px!important}.mx-1{margin-right:4px!important;margin-left:4px!important}.my-1{margin-top:4px!important;margin-bottom:4px!important}.m-2{margin:8px!important}.mt-2{margin-top:8px!important}.mr-2{margin-right:8px!important}.mb-2{margin-bottom:8px!important}.ml-2{margin-left:8px!important}.mt-n2{margin-top:-8px!important}.mr-n2{margin-right:-8px!important}.mb-n2{margin-bottom:-8px!important}.ml-n2{margin-left:-8px!important}.mx-2{margin-right:8px!important;margin-left:8px!important}.my-2{margin-top:8px!important;margin-bottom:8px!important}.m-3{margin:16px!important}.mt-3{margin-top:16px!important}.mr-3{margin-right:16px!important}.mb-3{margin-bottom:16px!important}.ml-3{margin-left:16px!important}.mt-n3{margin-top:-16px!important}.mr-n3{margin-right:-16px!important}.mb-n3{margin-bottom:-16px!important}.ml-n3{margin-left:-16px!important}.mx-3{margin-right:16px!important;margin-left:16px!important}.my-3{margin-top:16px!important;margin-bottom:16px!important}.m-4{margin:24px!important}.mt-4{margin-top:24px!important}.mr-4{margin-right:24px!important}.mb-4{margin-bottom:24px!important}.ml-4{margin-left:24px!important}.mt-n4{margin-top:-24px!important}.mr-n4{margin-right:-24px!important}.mb-n4{margin-bottom:-24px!important}.ml-n4{margin-left:-24px!important}.mx-4{margin-right:24px!important;margin-left:24px!important}.my-4{margin-top:24px!important;margin-bottom:24px!important}.m-5{margin:32px!important}.mt-5{margin-top:32px!important}.mr-5{margin-right:32px!important}.mb-5{margin-bottom:32px!important}.ml-5{margin-left:32px!important}.mt-n5{margin-top:-32px!important}.mr-n5{margin-right:-32px!important}.mb-n5{margin-bottom:-32px!important}.ml-n5{margin-left:-32px!important}.mx-5{margin-right:32px!important;margin-left:32px!important}.my-5{margin-top:32px!important;margin-bottom:32px!important}.m-6{margin:40px!important}.mt-6{margin-top:40px!important}.mr-6{margin-right:40px!important}.mb-6{margin-bottom:40px!important}.ml-6{margin-left:40px!important}.mt-n6{margin-top:-40px!important}.mr-n6{margin-right:-40px!important}.mb-n6{margin-bottom:-40px!important}.ml-n6{margin-left:-40px!important}.mx-6{margin-right:40px!important;margin-left:40px!important}.my-6{margin-top:40px!important;margin-bottom:40px!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}@media (min-width:544px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:4px!important}.mt-sm-1{margin-top:4px!important}.mr-sm-1{margin-right:4px!important}.mb-sm-1{margin-bottom:4px!important}.ml-sm-1{margin-left:4px!important}.mt-sm-n1{margin-top:-4px!important}.mr-sm-n1{margin-right:-4px!important}.mb-sm-n1{margin-bottom:-4px!important}.ml-sm-n1{margin-left:-4px!important}.mx-sm-1{margin-right:4px!important;margin-left:4px!important}.my-sm-1{margin-top:4px!important;margin-bottom:4px!important}.m-sm-2{margin:8px!important}.mt-sm-2{margin-top:8px!important}.mr-sm-2{margin-right:8px!important}.mb-sm-2{margin-bottom:8px!important}.ml-sm-2{margin-left:8px!important}.mt-sm-n2{margin-top:-8px!important}.mr-sm-n2{margin-right:-8px!important}.mb-sm-n2{margin-bottom:-8px!important}.ml-sm-n2{margin-left:-8px!important}.mx-sm-2{margin-right:8px!important;margin-left:8px!important}.my-sm-2{margin-top:8px!important;margin-bottom:8px!important}.m-sm-3{margin:16px!important}.mt-sm-3{margin-top:16px!important}.mr-sm-3{margin-right:16px!important}.mb-sm-3{margin-bottom:16px!important}.ml-sm-3{margin-left:16px!important}.mt-sm-n3{margin-top:-16px!important}.mr-sm-n3{margin-right:-16px!important}.mb-sm-n3{margin-bottom:-16px!important}.ml-sm-n3{margin-left:-16px!important}.mx-sm-3{margin-right:16px!important;margin-left:16px!important}.my-sm-3{margin-top:16px!important;margin-bottom:16px!important}.m-sm-4{margin:24px!important}.mt-sm-4{margin-top:24px!important}.mr-sm-4{margin-right:24px!important}.mb-sm-4{margin-bottom:24px!important}.ml-sm-4{margin-left:24px!important}.mt-sm-n4{margin-top:-24px!important}.mr-sm-n4{margin-right:-24px!important}.mb-sm-n4{margin-bottom:-24px!important}.ml-sm-n4{margin-left:-24px!important}.mx-sm-4{margin-right:24px!important;margin-left:24px!important}.my-sm-4{margin-top:24px!important;margin-bottom:24px!important}.m-sm-5{margin:32px!important}.mt-sm-5{margin-top:32px!important}.mr-sm-5{margin-right:32px!important}.mb-sm-5{margin-bottom:32px!important}.ml-sm-5{margin-left:32px!important}.mt-sm-n5{margin-top:-32px!important}.mr-sm-n5{margin-right:-32px!important}.mb-sm-n5{margin-bottom:-32px!important}.ml-sm-n5{margin-left:-32px!important}.mx-sm-5{margin-right:32px!important;margin-left:32px!important}.my-sm-5{margin-top:32px!important;margin-bottom:32px!important}.m-sm-6{margin:40px!important}.mt-sm-6{margin-top:40px!important}.mr-sm-6{margin-right:40px!important}.mb-sm-6{margin-bottom:40px!important}.ml-sm-6{margin-left:40px!important}.mt-sm-n6{margin-top:-40px!important}.mr-sm-n6{margin-right:-40px!important}.mb-sm-n6{margin-bottom:-40px!important}.ml-sm-n6{margin-left:-40px!important}.mx-sm-6{margin-right:40px!important;margin-left:40px!important}.my-sm-6{margin-top:40px!important;margin-bottom:40px!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:4px!important}.mt-md-1{margin-top:4px!important}.mr-md-1{margin-right:4px!important}.mb-md-1{margin-bottom:4px!important}.ml-md-1{margin-left:4px!important}.mt-md-n1{margin-top:-4px!important}.mr-md-n1{margin-right:-4px!important}.mb-md-n1{margin-bottom:-4px!important}.ml-md-n1{margin-left:-4px!important}.mx-md-1{margin-right:4px!important;margin-left:4px!important}.my-md-1{margin-top:4px!important;margin-bottom:4px!important}.m-md-2{margin:8px!important}.mt-md-2{margin-top:8px!important}.mr-md-2{margin-right:8px!important}.mb-md-2{margin-bottom:8px!important}.ml-md-2{margin-left:8px!important}.mt-md-n2{margin-top:-8px!important}.mr-md-n2{margin-right:-8px!important}.mb-md-n2{margin-bottom:-8px!important}.ml-md-n2{margin-left:-8px!important}.mx-md-2{margin-right:8px!important;margin-left:8px!important}.my-md-2{margin-top:8px!important;margin-bottom:8px!important}.m-md-3{margin:16px!important}.mt-md-3{margin-top:16px!important}.mr-md-3{margin-right:16px!important}.mb-md-3{margin-bottom:16px!important}.ml-md-3{margin-left:16px!important}.mt-md-n3{margin-top:-16px!important}.mr-md-n3{margin-right:-16px!important}.mb-md-n3{margin-bottom:-16px!important}.ml-md-n3{margin-left:-16px!important}.mx-md-3{margin-right:16px!important;margin-left:16px!important}.my-md-3{margin-top:16px!important;margin-bottom:16px!important}.m-md-4{margin:24px!important}.mt-md-4{margin-top:24px!important}.mr-md-4{margin-right:24px!important}.mb-md-4{margin-bottom:24px!important}.ml-md-4{margin-left:24px!important}.mt-md-n4{margin-top:-24px!important}.mr-md-n4{margin-right:-24px!important}.mb-md-n4{margin-bottom:-24px!important}.ml-md-n4{margin-left:-24px!important}.mx-md-4{margin-right:24px!important;margin-left:24px!important}.my-md-4{margin-top:24px!important;margin-bottom:24px!important}.m-md-5{margin:32px!important}.mt-md-5{margin-top:32px!important}.mr-md-5{margin-right:32px!important}.mb-md-5{margin-bottom:32px!important}.ml-md-5{margin-left:32px!important}.mt-md-n5{margin-top:-32px!important}.mr-md-n5{margin-right:-32px!important}.mb-md-n5{margin-bottom:-32px!important}.ml-md-n5{margin-left:-32px!important}.mx-md-5{margin-right:32px!important;margin-left:32px!important}.my-md-5{margin-top:32px!important;margin-bottom:32px!important}.m-md-6{margin:40px!important}.mt-md-6{margin-top:40px!important}.mr-md-6{margin-right:40px!important}.mb-md-6{margin-bottom:40px!important}.ml-md-6{margin-left:40px!important}.mt-md-n6{margin-top:-40px!important}.mr-md-n6{margin-right:-40px!important}.mb-md-n6{margin-bottom:-40px!important}.ml-md-n6{margin-left:-40px!important}.mx-md-6{margin-right:40px!important;margin-left:40px!important}.my-md-6{margin-top:40px!important;margin-bottom:40px!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}}@media (min-width:1012px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:4px!important}.mt-lg-1{margin-top:4px!important}.mr-lg-1{margin-right:4px!important}.mb-lg-1{margin-bottom:4px!important}.ml-lg-1{margin-left:4px!important}.mt-lg-n1{margin-top:-4px!important}.mr-lg-n1{margin-right:-4px!important}.mb-lg-n1{margin-bottom:-4px!important}.ml-lg-n1{margin-left:-4px!important}.mx-lg-1{margin-right:4px!important;margin-left:4px!important}.my-lg-1{margin-top:4px!important;margin-bottom:4px!important}.m-lg-2{margin:8px!important}.mt-lg-2{margin-top:8px!important}.mr-lg-2{margin-right:8px!important}.mb-lg-2{margin-bottom:8px!important}.ml-lg-2{margin-left:8px!important}.mt-lg-n2{margin-top:-8px!important}.mr-lg-n2{margin-right:-8px!important}.mb-lg-n2{margin-bottom:-8px!important}.ml-lg-n2{margin-left:-8px!important}.mx-lg-2{margin-right:8px!important;margin-left:8px!important}.my-lg-2{margin-top:8px!important;margin-bottom:8px!important}.m-lg-3{margin:16px!important}.mt-lg-3{margin-top:16px!important}.mr-lg-3{margin-right:16px!important}.mb-lg-3{margin-bottom:16px!important}.ml-lg-3{margin-left:16px!important}.mt-lg-n3{margin-top:-16px!important}.mr-lg-n3{margin-right:-16px!important}.mb-lg-n3{margin-bottom:-16px!important}.ml-lg-n3{margin-left:-16px!important}.mx-lg-3{margin-right:16px!important;margin-left:16px!important}.my-lg-3{margin-top:16px!important;margin-bottom:16px!important}.m-lg-4{margin:24px!important}.mt-lg-4{margin-top:24px!important}.mr-lg-4{margin-right:24px!important}.mb-lg-4{margin-bottom:24px!important}.ml-lg-4{margin-left:24px!important}.mt-lg-n4{margin-top:-24px!important}.mr-lg-n4{margin-right:-24px!important}.mb-lg-n4{margin-bottom:-24px!important}.ml-lg-n4{margin-left:-24px!important}.mx-lg-4{margin-right:24px!important;margin-left:24px!important}.my-lg-4{margin-top:24px!important;margin-bottom:24px!important}.m-lg-5{margin:32px!important}.mt-lg-5{margin-top:32px!important}.mr-lg-5{margin-right:32px!important}.mb-lg-5{margin-bottom:32px!important}.ml-lg-5{margin-left:32px!important}.mt-lg-n5{margin-top:-32px!important}.mr-lg-n5{margin-right:-32px!important}.mb-lg-n5{margin-bottom:-32px!important}.ml-lg-n5{margin-left:-32px!important}.mx-lg-5{margin-right:32px!important;margin-left:32px!important}.my-lg-5{margin-top:32px!important;margin-bottom:32px!important}.m-lg-6{margin:40px!important}.mt-lg-6{margin-top:40px!important}.mr-lg-6{margin-right:40px!important}.mb-lg-6{margin-bottom:40px!important}.ml-lg-6{margin-left:40px!important}.mt-lg-n6{margin-top:-40px!important}.mr-lg-n6{margin-right:-40px!important}.mb-lg-n6{margin-bottom:-40px!important}.ml-lg-n6{margin-left:-40px!important}.mx-lg-6{margin-right:40px!important;margin-left:40px!important}.my-lg-6{margin-top:40px!important;margin-bottom:40px!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}}@media (min-width:1280px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:4px!important}.mt-xl-1{margin-top:4px!important}.mr-xl-1{margin-right:4px!important}.mb-xl-1{margin-bottom:4px!important}.ml-xl-1{margin-left:4px!important}.mt-xl-n1{margin-top:-4px!important}.mr-xl-n1{margin-right:-4px!important}.mb-xl-n1{margin-bottom:-4px!important}.ml-xl-n1{margin-left:-4px!important}.mx-xl-1{margin-right:4px!important;margin-left:4px!important}.my-xl-1{margin-top:4px!important;margin-bottom:4px!important}.m-xl-2{margin:8px!important}.mt-xl-2{margin-top:8px!important}.mr-xl-2{margin-right:8px!important}.mb-xl-2{margin-bottom:8px!important}.ml-xl-2{margin-left:8px!important}.mt-xl-n2{margin-top:-8px!important}.mr-xl-n2{margin-right:-8px!important}.mb-xl-n2{margin-bottom:-8px!important}.ml-xl-n2{margin-left:-8px!important}.mx-xl-2{margin-right:8px!important;margin-left:8px!important}.my-xl-2{margin-top:8px!important;margin-bottom:8px!important}.m-xl-3{margin:16px!important}.mt-xl-3{margin-top:16px!important}.mr-xl-3{margin-right:16px!important}.mb-xl-3{margin-bottom:16px!important}.ml-xl-3{margin-left:16px!important}.mt-xl-n3{margin-top:-16px!important}.mr-xl-n3{margin-right:-16px!important}.mb-xl-n3{margin-bottom:-16px!important}.ml-xl-n3{margin-left:-16px!important}.mx-xl-3{margin-right:16px!important;margin-left:16px!important}.my-xl-3{margin-top:16px!important;margin-bottom:16px!important}.m-xl-4{margin:24px!important}.mt-xl-4{margin-top:24px!important}.mr-xl-4{margin-right:24px!important}.mb-xl-4{margin-bottom:24px!important}.ml-xl-4{margin-left:24px!important}.mt-xl-n4{margin-top:-24px!important}.mr-xl-n4{margin-right:-24px!important}.mb-xl-n4{margin-bottom:-24px!important}.ml-xl-n4{margin-left:-24px!important}.mx-xl-4{margin-right:24px!important;margin-left:24px!important}.my-xl-4{margin-top:24px!important;margin-bottom:24px!important}.m-xl-5{margin:32px!important}.mt-xl-5{margin-top:32px!important}.mr-xl-5{margin-right:32px!important}.mb-xl-5{margin-bottom:32px!important}.ml-xl-5{margin-left:32px!important}.mt-xl-n5{margin-top:-32px!important}.mr-xl-n5{margin-right:-32px!important}.mb-xl-n5{margin-bottom:-32px!important}.ml-xl-n5{margin-left:-32px!important}.mx-xl-5{margin-right:32px!important;margin-left:32px!important}.my-xl-5{margin-top:32px!important;margin-bottom:32px!important}.m-xl-6{margin:40px!important}.mt-xl-6{margin-top:40px!important}.mr-xl-6{margin-right:40px!important}.mb-xl-6{margin-bottom:40px!important}.ml-xl-6{margin-left:40px!important}.mt-xl-n6{margin-top:-40px!important}.mr-xl-n6{margin-right:-40px!important}.mb-xl-n6{margin-bottom:-40px!important}.ml-xl-n6{margin-left:-40px!important}.mx-xl-6{margin-right:40px!important;margin-left:40px!important}.my-xl-6{margin-top:40px!important;margin-bottom:40px!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:4px!important}.pt-1{padding-top:4px!important}.pr-1{padding-right:4px!important}.pb-1{padding-bottom:4px!important}.pl-1{padding-left:4px!important}.px-1{padding-right:4px!important;padding-left:4px!important}.py-1{padding-top:4px!important;padding-bottom:4px!important}.p-2{padding:8px!important}.pt-2{padding-top:8px!important}.pr-2{padding-right:8px!important}.pb-2{padding-bottom:8px!important}.pl-2{padding-left:8px!important}.px-2{padding-right:8px!important;padding-left:8px!important}.py-2{padding-top:8px!important;padding-bottom:8px!important}.p-3{padding:16px!important}.pt-3{padding-top:16px!important}.pr-3{padding-right:16px!important}.pb-3{padding-bottom:16px!important}.pl-3{padding-left:16px!important}.px-3{padding-right:16px!important;padding-left:16px!important}.py-3{padding-top:16px!important;padding-bottom:16px!important}.p-4{padding:24px!important}.pt-4{padding-top:24px!important}.pr-4{padding-right:24px!important}.pb-4{padding-bottom:24px!important}.pl-4{padding-left:24px!important}.px-4{padding-right:24px!important;padding-left:24px!important}.py-4{padding-top:24px!important;padding-bottom:24px!important}.p-5{padding:32px!important}.pt-5{padding-top:32px!important}.pr-5{padding-right:32px!important}.pb-5{padding-bottom:32px!important}.pl-5{padding-left:32px!important}.px-5{padding-right:32px!important;padding-left:32px!important}.py-5{padding-top:32px!important;padding-bottom:32px!important}.p-6{padding:40px!important}.pt-6{padding-top:40px!important}.pr-6{padding-right:40px!important}.pb-6{padding-bottom:40px!important}.pl-6{padding-left:40px!important}.px-6{padding-right:40px!important;padding-left:40px!important}.py-6{padding-top:40px!important;padding-bottom:40px!important}@media (min-width:544px){.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:4px!important}.pt-sm-1{padding-top:4px!important}.pr-sm-1{padding-right:4px!important}.pb-sm-1{padding-bottom:4px!important}.pl-sm-1{padding-left:4px!important}.px-sm-1{padding-right:4px!important;padding-left:4px!important}.py-sm-1{padding-top:4px!important;padding-bottom:4px!important}.p-sm-2{padding:8px!important}.pt-sm-2{padding-top:8px!important}.pr-sm-2{padding-right:8px!important}.pb-sm-2{padding-bottom:8px!important}.pl-sm-2{padding-left:8px!important}.px-sm-2{padding-right:8px!important;padding-left:8px!important}.py-sm-2{padding-top:8px!important;padding-bottom:8px!important}.p-sm-3{padding:16px!important}.pt-sm-3{padding-top:16px!important}.pr-sm-3{padding-right:16px!important}.pb-sm-3{padding-bottom:16px!important}.pl-sm-3{padding-left:16px!important}.px-sm-3{padding-right:16px!important;padding-left:16px!important}.py-sm-3{padding-top:16px!important;padding-bottom:16px!important}.p-sm-4{padding:24px!important}.pt-sm-4{padding-top:24px!important}.pr-sm-4{padding-right:24px!important}.pb-sm-4{padding-bottom:24px!important}.pl-sm-4{padding-left:24px!important}.px-sm-4{padding-right:24px!important;padding-left:24px!important}.py-sm-4{padding-top:24px!important;padding-bottom:24px!important}.p-sm-5{padding:32px!important}.pt-sm-5{padding-top:32px!important}.pr-sm-5{padding-right:32px!important}.pb-sm-5{padding-bottom:32px!important}.pl-sm-5{padding-left:32px!important}.px-sm-5{padding-right:32px!important;padding-left:32px!important}.py-sm-5{padding-top:32px!important;padding-bottom:32px!important}.p-sm-6{padding:40px!important}.pt-sm-6{padding-top:40px!important}.pr-sm-6{padding-right:40px!important}.pb-sm-6{padding-bottom:40px!important}.pl-sm-6{padding-left:40px!important}.px-sm-6{padding-right:40px!important;padding-left:40px!important}.py-sm-6{padding-top:40px!important;padding-bottom:40px!important}}@media (min-width:768px){.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:4px!important}.pt-md-1{padding-top:4px!important}.pr-md-1{padding-right:4px!important}.pb-md-1{padding-bottom:4px!important}.pl-md-1{padding-left:4px!important}.px-md-1{padding-right:4px!important;padding-left:4px!important}.py-md-1{padding-top:4px!important;padding-bottom:4px!important}.p-md-2{padding:8px!important}.pt-md-2{padding-top:8px!important}.pr-md-2{padding-right:8px!important}.pb-md-2{padding-bottom:8px!important}.pl-md-2{padding-left:8px!important}.px-md-2{padding-right:8px!important;padding-left:8px!important}.py-md-2{padding-top:8px!important;padding-bottom:8px!important}.p-md-3{padding:16px!important}.pt-md-3{padding-top:16px!important}.pr-md-3{padding-right:16px!important}.pb-md-3{padding-bottom:16px!important}.pl-md-3{padding-left:16px!important}.px-md-3{padding-right:16px!important;padding-left:16px!important}.py-md-3{padding-top:16px!important;padding-bottom:16px!important}.p-md-4{padding:24px!important}.pt-md-4{padding-top:24px!important}.pr-md-4{padding-right:24px!important}.pb-md-4{padding-bottom:24px!important}.pl-md-4{padding-left:24px!important}.px-md-4{padding-right:24px!important;padding-left:24px!important}.py-md-4{padding-top:24px!important;padding-bottom:24px!important}.p-md-5{padding:32px!important}.pt-md-5{padding-top:32px!important}.pr-md-5{padding-right:32px!important}.pb-md-5{padding-bottom:32px!important}.pl-md-5{padding-left:32px!important}.px-md-5{padding-right:32px!important;padding-left:32px!important}.py-md-5{padding-top:32px!important;padding-bottom:32px!important}.p-md-6{padding:40px!important}.pt-md-6{padding-top:40px!important}.pr-md-6{padding-right:40px!important}.pb-md-6{padding-bottom:40px!important}.pl-md-6{padding-left:40px!important}.px-md-6{padding-right:40px!important;padding-left:40px!important}.py-md-6{padding-top:40px!important;padding-bottom:40px!important}}@media (min-width:1012px){.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:4px!important}.pt-lg-1{padding-top:4px!important}.pr-lg-1{padding-right:4px!important}.pb-lg-1{padding-bottom:4px!important}.pl-lg-1{padding-left:4px!important}.px-lg-1{padding-right:4px!important;padding-left:4px!important}.py-lg-1{padding-top:4px!important;padding-bottom:4px!important}.p-lg-2{padding:8px!important}.pt-lg-2{padding-top:8px!important}.pr-lg-2{padding-right:8px!important}.pb-lg-2{padding-bottom:8px!important}.pl-lg-2{padding-left:8px!important}.px-lg-2{padding-right:8px!important;padding-left:8px!important}.py-lg-2{padding-top:8px!important;padding-bottom:8px!important}.p-lg-3{padding:16px!important}.pt-lg-3{padding-top:16px!important}.pr-lg-3{padding-right:16px!important}.pb-lg-3{padding-bottom:16px!important}.pl-lg-3{padding-left:16px!important}.px-lg-3{padding-right:16px!important;padding-left:16px!important}.py-lg-3{padding-top:16px!important;padding-bottom:16px!important}.p-lg-4{padding:24px!important}.pt-lg-4{padding-top:24px!important}.pr-lg-4{padding-right:24px!important}.pb-lg-4{padding-bottom:24px!important}.pl-lg-4{padding-left:24px!important}.px-lg-4{padding-right:24px!important;padding-left:24px!important}.py-lg-4{padding-top:24px!important;padding-bottom:24px!important}.p-lg-5{padding:32px!important}.pt-lg-5{padding-top:32px!important}.pr-lg-5{padding-right:32px!important}.pb-lg-5{padding-bottom:32px!important}.pl-lg-5{padding-left:32px!important}.px-lg-5{padding-right:32px!important;padding-left:32px!important}.py-lg-5{padding-top:32px!important;padding-bottom:32px!important}.p-lg-6{padding:40px!important}.pt-lg-6{padding-top:40px!important}.pr-lg-6{padding-right:40px!important}.pb-lg-6{padding-bottom:40px!important}.pl-lg-6{padding-left:40px!important}.px-lg-6{padding-right:40px!important;padding-left:40px!important}.py-lg-6{padding-top:40px!important;padding-bottom:40px!important}}@media (min-width:1280px){.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:4px!important}.pt-xl-1{padding-top:4px!important}.pr-xl-1{padding-right:4px!important}.pb-xl-1{padding-bottom:4px!important}.pl-xl-1{padding-left:4px!important}.px-xl-1{padding-right:4px!important;padding-left:4px!important}.py-xl-1{padding-top:4px!important;padding-bottom:4px!important}.p-xl-2{padding:8px!important}.pt-xl-2{padding-top:8px!important}.pr-xl-2{padding-right:8px!important}.pb-xl-2{padding-bottom:8px!important}.pl-xl-2{padding-left:8px!important}.px-xl-2{padding-right:8px!important;padding-left:8px!important}.py-xl-2{padding-top:8px!important;padding-bottom:8px!important}.p-xl-3{padding:16px!important}.pt-xl-3{padding-top:16px!important}.pr-xl-3{padding-right:16px!important}.pb-xl-3{padding-bottom:16px!important}.pl-xl-3{padding-left:16px!important}.px-xl-3{padding-right:16px!important;padding-left:16px!important}.py-xl-3{padding-top:16px!important;padding-bottom:16px!important}.p-xl-4{padding:24px!important}.pt-xl-4{padding-top:24px!important}.pr-xl-4{padding-right:24px!important}.pb-xl-4{padding-bottom:24px!important}.pl-xl-4{padding-left:24px!important}.px-xl-4{padding-right:24px!important;padding-left:24px!important}.py-xl-4{padding-top:24px!important;padding-bottom:24px!important}.p-xl-5{padding:32px!important}.pt-xl-5{padding-top:32px!important}.pr-xl-5{padding-right:32px!important}.pb-xl-5{padding-bottom:32px!important}.pl-xl-5{padding-left:32px!important}.px-xl-5{padding-right:32px!important;padding-left:32px!important}.py-xl-5{padding-top:32px!important;padding-bottom:32px!important}.p-xl-6{padding:40px!important}.pt-xl-6{padding-top:40px!important}.pr-xl-6{padding-right:40px!important}.pb-xl-6{padding-bottom:40px!important}.pl-xl-6{padding-left:40px!important}.px-xl-6{padding-right:40px!important;padding-left:40px!important}.py-xl-6{padding-top:40px!important;padding-bottom:40px!important}}.p-responsive{padding-right:16px!important;padding-left:16px!important}@media (min-width:544px){.p-responsive{padding-right:40px!important;padding-left:40px!important}}@media (min-width:1012px){.p-responsive{padding-right:16px!important;padding-left:16px!important}}.h1{font-size:26px!important}@media (min-width:768px){.h1{font-size:32px!important}}.h2{font-size:22px!important}@media (min-width:768px){.h2{font-size:24px!important}}.h3{font-size:18px!important}@media (min-width:768px){.h3{font-size:20px!important}}.h4{font-size:16px!important}.h5{font-size:14px!important}.h6{font-size:12px!important}.h1,.h2,.h3,.h4,.h5,.h6{font-weight:600!important}.f1{font-size:26px!important}@media (min-width:768px){.f1{font-size:32px!important}}.f2{font-size:22px!important}@media (min-width:768px){.f2{font-size:24px!important}}.f3{font-size:18px!important}@media (min-width:768px){.f3{font-size:20px!important}}.f4{font-size:16px!important}@media (min-width:768px){.f4{font-size:16px!important}}.f5{font-size:14px!important}.f6{font-size:12px!important}.f00-light{font-size:40px!important;font-weight:300!important}@media (min-width:768px){.f00-light{font-size:48px!important}}.f0-light{font-size:32px!important;font-weight:300!important}@media (min-width:768px){.f0-light{font-size:40px!important}}.f1-light{font-size:26px!important;font-weight:300!important}@media (min-width:768px){.f1-light{font-size:32px!important}}.f2-light{font-size:22px!important;font-weight:300!important}@media (min-width:768px){.f2-light{font-size:24px!important}}.f3-light{font-size:18px!important;font-weight:300!important}@media (min-width:768px){.f3-light{font-size:20px!important}}.text-small{font-size:12px!important}.lead{margin-bottom:30px;font-size:20px;font-weight:300;color:#586069}.lh-condensed-ultra{line-height:1!important}.lh-condensed{line-height:1.25!important}.lh-default{line-height:1.5!important}.lh-0{line-height:0!important}.text-right{text-align:right!important}.text-left{text-align:left!important}.text-center{text-align:center!important}@media (min-width:544px){.text-sm-right{text-align:right!important}.text-sm-left{text-align:left!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-right{text-align:right!important}.text-md-left{text-align:left!important}.text-md-center{text-align:center!important}}@media (min-width:1012px){.text-lg-right{text-align:right!important}.text-lg-left{text-align:left!important}.text-lg-center{text-align:center!important}}@media (min-width:1280px){.text-xl-right{text-align:right!important}.text-xl-left{text-align:left!important}.text-xl-center{text-align:center!important}}.text-normal{font-weight:400!important}.text-bold{font-weight:600!important}.text-italic{font-style:italic!important}.text-uppercase{text-transform:uppercase!important}.text-underline{text-decoration:underline!important}.no-underline{text-decoration:none!important}.no-wrap{white-space:nowrap!important}.ws-normal{white-space:normal!important}.wb-break-all{word-break:break-all!important}.text-emphasized{font-weight:600;color:#24292e}.list-style-none{list-style:none!important}.text-shadow-dark{text-shadow:0 1px 1px rgba(27,31,35,.25),0 1px 25px rgba(27,31,35,.75)}.text-shadow-light{text-shadow:0 1px 0 rgba(255,255,255,.5)}.text-mono{font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace}.user-select-none{user-select:none!important}.d-block{display:block!important}.d-flex{display:flex!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}@media (min-width:544px){.d-sm-block{display:block!important}.d-sm-flex{display:flex!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}}@media (min-width:768px){.d-md-block{display:block!important}.d-md-flex{display:flex!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}}@media (min-width:1012px){.d-lg-block{display:block!important}.d-lg-flex{display:flex!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}}@media (min-width:1280px){.d-xl-block{display:block!important}.d-xl-flex{display:flex!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}}.v-hidden{visibility:hidden!important}.v-visible{visibility:visible!important}@media (max-width:544px){.hide-sm{display:none!important}}@media (min-width:544px) and(max-width:768px){.hide-md{display:none!important}}@media (min-width:768px) and(max-width:1012px){.hide-lg{display:none!important}}@media (min-width:1012px){.hide-xl{display:none!important}}.table-fixed{table-layout:fixed!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);word-wrap:normal;border:0}.show-on-focus{position:absolute;width:1px;height:1px;margin:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}.show-on-focus:focus{z-index:20;width:auto;height:auto;clip:auto}.container{width:980px;margin-right:auto;margin-left:auto}.container::before{display:table;content:""}.container::after{display:table;clear:both;content:""}.container-md{max-width:768px;margin-right:auto;margin-left:auto}.container-lg{max-width:1012px;margin-right:auto;margin-left:auto}.container-xl{max-width:1280px;margin-right:auto;margin-left:auto}.columns{margin-right:-10px;margin-left:-10px}.columns::before{display:table;content:""}.columns::after{display:table;clear:both;content:""}.column{float:left;padding-right:10px;padding-left:10px}.one-third{width:33.333333%}.two-thirds{width:66.666667%}.one-fourth{width:25%}.one-half{width:50%}.three-fourths{width:75%}.one-fifth{width:20%}.four-fifths{width:80%}.centered{display:block;float:none;margin-right:auto;margin-left:auto}.col-1{width:8.3333333333%}.col-2{width:16.6666666667%}.col-3{width:25%}.col-4{width:33.3333333333%}.col-5{width:41.6666666667%}.col-6{width:50%}.col-7{width:58.3333333333%}.col-8{width:66.6666666667%}.col-9{width:75%}.col-10{width:83.3333333333%}.col-11{width:91.6666666667%}.col-12{width:100%}@media (min-width:544px){.col-sm-1{width:8.3333333333%}.col-sm-2{width:16.6666666667%}.col-sm-3{width:25%}.col-sm-4{width:33.3333333333%}.col-sm-5{width:41.6666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.3333333333%}.col-sm-8{width:66.6666666667%}.col-sm-9{width:75%}.col-sm-10{width:83.3333333333%}.col-sm-11{width:91.6666666667%}.col-sm-12{width:100%}}@media (min-width:768px){.col-md-1{width:8.3333333333%}.col-md-2{width:16.6666666667%}.col-md-3{width:25%}.col-md-4{width:33.3333333333%}.col-md-5{width:41.6666666667%}.col-md-6{width:50%}.col-md-7{width:58.3333333333%}.col-md-8{width:66.6666666667%}.col-md-9{width:75%}.col-md-10{width:83.3333333333%}.col-md-11{width:91.6666666667%}.col-md-12{width:100%}}@media (min-width:1012px){.col-lg-1{width:8.3333333333%}.col-lg-2{width:16.6666666667%}.col-lg-3{width:25%}.col-lg-4{width:33.3333333333%}.col-lg-5{width:41.6666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.3333333333%}.col-lg-8{width:66.6666666667%}.col-lg-9{width:75%}.col-lg-10{width:83.3333333333%}.col-lg-11{width:91.6666666667%}.col-lg-12{width:100%}}@media (min-width:1280px){.col-xl-1{width:8.3333333333%}.col-xl-2{width:16.6666666667%}.col-xl-3{width:25%}.col-xl-4{width:33.3333333333%}.col-xl-5{width:41.6666666667%}.col-xl-6{width:50%}.col-xl-7{width:58.3333333333%}.col-xl-8{width:66.6666666667%}.col-xl-9{width:75%}.col-xl-10{width:83.3333333333%}.col-xl-11{width:91.6666666667%}.col-xl-12{width:100%}}.gutter{margin-right:-16px;margin-left:-16px}.gutter>[class*=col-]{padding-right:16px!important;padding-left:16px!important}.gutter-condensed{margin-right:-8px;margin-left:-8px}.gutter-condensed>[class*=col-]{padding-right:8px!important;padding-left:8px!important}.gutter-spacious{margin-right:-24px;margin-left:-24px}.gutter-spacious>[class*=col-]{padding-right:24px!important;padding-left:24px!important}@media (min-width:544px){.gutter-sm{margin-right:-16px;margin-left:-16px}.gutter-sm>[class*=col-]{padding-right:16px!important;padding-left:16px!important}.gutter-sm-condensed{margin-right:-8px;margin-left:-8px}.gutter-sm-condensed>[class*=col-]{padding-right:8px!important;padding-left:8px!important}.gutter-sm-spacious{margin-right:-24px;margin-left:-24px}.gutter-sm-spacious>[class*=col-]{padding-right:24px!important;padding-left:24px!important}}@media (min-width:768px){.gutter-md{margin-right:-16px;margin-left:-16px}.gutter-md>[class*=col-]{padding-right:16px!important;padding-left:16px!important}.gutter-md-condensed{margin-right:-8px;margin-left:-8px}.gutter-md-condensed>[class*=col-]{padding-right:8px!important;padding-left:8px!important}.gutter-md-spacious{margin-right:-24px;margin-left:-24px}.gutter-md-spacious>[class*=col-]{padding-right:24px!important;padding-left:24px!important}}@media (min-width:1012px){.gutter-lg{margin-right:-16px;margin-left:-16px}.gutter-lg>[class*=col-]{padding-right:16px!important;padding-left:16px!important}.gutter-lg-condensed{margin-right:-8px;margin-left:-8px}.gutter-lg-condensed>[class*=col-]{padding-right:8px!important;padding-left:8px!important}.gutter-lg-spacious{margin-right:-24px;margin-left:-24px}.gutter-lg-spacious>[class*=col-]{padding-right:24px!important;padding-left:24px!important}}@media (min-width:1280px){.gutter-xl{margin-right:-16px;margin-left:-16px}.gutter-xl>[class*=col-]{padding-right:16px!important;padding-left:16px!important}.gutter-xl-condensed{margin-right:-8px;margin-left:-8px}.gutter-xl-condensed>[class*=col-]{padding-right:8px!important;padding-left:8px!important}.gutter-xl-spacious{margin-right:-24px;margin-left:-24px}.gutter-xl-spacious>[class*=col-]{padding-right:24px!important;padding-left:24px!important}}.offset-1{margin-left:8.3333333333%!important}.offset-2{margin-left:16.6666666667%!important}.offset-3{margin-left:25%!important}.offset-4{margin-left:33.3333333333%!important}.offset-5{margin-left:41.6666666667%!important}.offset-6{margin-left:50%!important}.offset-7{margin-left:58.3333333333%!important}.offset-8{margin-left:66.6666666667%!important}.offset-9{margin-left:75%!important}.offset-10{margin-left:83.3333333333%!important}.offset-11{margin-left:91.6666666667%!important}@media (min-width:544px){.offset-sm-1{margin-left:8.3333333333%!important}.offset-sm-2{margin-left:16.6666666667%!important}.offset-sm-3{margin-left:25%!important}.offset-sm-4{margin-left:33.3333333333%!important}.offset-sm-5{margin-left:41.6666666667%!important}.offset-sm-6{margin-left:50%!important}.offset-sm-7{margin-left:58.3333333333%!important}.offset-sm-8{margin-left:66.6666666667%!important}.offset-sm-9{margin-left:75%!important}.offset-sm-10{margin-left:83.3333333333%!important}.offset-sm-11{margin-left:91.6666666667%!important}}@media (min-width:768px){.offset-md-1{margin-left:8.3333333333%!important}.offset-md-2{margin-left:16.6666666667%!important}.offset-md-3{margin-left:25%!important}.offset-md-4{margin-left:33.3333333333%!important}.offset-md-5{margin-left:41.6666666667%!important}.offset-md-6{margin-left:50%!important}.offset-md-7{margin-left:58.3333333333%!important}.offset-md-8{margin-left:66.6666666667%!important}.offset-md-9{margin-left:75%!important}.offset-md-10{margin-left:83.3333333333%!important}.offset-md-11{margin-left:91.6666666667%!important}}@media (min-width:1012px){.offset-lg-1{margin-left:8.3333333333%!important}.offset-lg-2{margin-left:16.6666666667%!important}.offset-lg-3{margin-left:25%!important}.offset-lg-4{margin-left:33.3333333333%!important}.offset-lg-5{margin-left:41.6666666667%!important}.offset-lg-6{margin-left:50%!important}.offset-lg-7{margin-left:58.3333333333%!important}.offset-lg-8{margin-left:66.6666666667%!important}.offset-lg-9{margin-left:75%!important}.offset-lg-10{margin-left:83.3333333333%!important}.offset-lg-11{margin-left:91.6666666667%!important}}@media (min-width:1280px){.offset-xl-1{margin-left:8.3333333333%!important}.offset-xl-2{margin-left:16.6666666667%!important}.offset-xl-3{margin-left:25%!important}.offset-xl-4{margin-left:33.3333333333%!important}.offset-xl-5{margin-left:41.6666666667%!important}.offset-xl-6{margin-left:50%!important}.offset-xl-7{margin-left:58.3333333333%!important}.offset-xl-8{margin-left:66.6666666667%!important}.offset-xl-9{margin-left:75%!important}.offset-xl-10{margin-left:83.3333333333%!important}.offset-xl-11{margin-left:91.6666666667%!important}}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>* :first-child{margin-top:0!important}.markdown-body>* :last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cb2431}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:0}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{padding-bottom:.3em;font-size:2em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#6a737d}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li{word-wrap:break-all}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #dfe2e5}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#24292e}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:#f6f8fa;border-top:0}.highlight table td{padding:5px}.highlight table pre{margin:0}.highlight .cm{color:#998;font-style:italic}.highlight .cp{color:#999;font-weight:700}.highlight .c1{color:#998;font-style:italic}.highlight .cs{color:#999;font-weight:700;font-style:italic}.highlight .c,.highlight .cd{color:#998;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .gd{color:#000;background-color:#fdd}.highlight .ge{color:#000;font-style:italic}.highlight .gr{color:#a00}.highlight .gh{color:#999}.highlight .gi{color:#000;background-color:#dfd}.highlight .go{color:#888}.highlight .gp{color:#555}.highlight .gs{font-weight:700}.highlight .gu{color:#aaa}.highlight .gt{color:#a00}.highlight .kc{color:#000;font-weight:700}.highlight .kd{color:#000;font-weight:700}.highlight .kn{color:#000;font-weight:700}.highlight .kp{color:#000;font-weight:700}.highlight .kr{color:#000;font-weight:700}.highlight .kt{color:#458;font-weight:700}.highlight .k,.highlight .kv{color:#000;font-weight:700}.highlight .mf{color:#099}.highlight .mh{color:#099}.highlight .il{color:#099}.highlight .mi{color:#099}.highlight .mo{color:#099}.highlight .m,.highlight .mb,.highlight .mx{color:#099}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#d14}.highlight .s2{color:#d14}.highlight .se{color:#d14}.highlight .sh{color:#d14}.highlight .si{color:#d14}.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .s{color:#d14}.highlight .na{color:teal}.highlight .bp{color:#999}.highlight .nb{color:#0086b3}.highlight .nc{color:#458;font-weight:700}.highlight .no{color:teal}.highlight .nd{color:#3c5d5d;font-weight:700}.highlight .ni{color:purple}.highlight .ne{color:#900;font-weight:700}.highlight .nf{color:#900;font-weight:700}.highlight .nl{color:#900;font-weight:700}.highlight .nn{color:#555}.highlight .nt{color:navy}.highlight .vc{color:teal}.highlight .vg{color:teal}.highlight .vi{color:teal}.highlight .nv{color:teal}.highlight .ow{color:#000;font-weight:700}.highlight .o{color:#000;font-weight:700}.highlight .w{color:#bbb}.highlight{background-color:#f8f8f8}</style> 79 + </head> 80 + <body class="bg-white"> 81 + <nav class="container-md px-3 py-2 mt-2 mt-md-5 mb-5 markdown-body"> 82 + <p class="bg-yellow-light ml-n1 px-1 py-1 mb-1"> 83 + <strong>This is a web feed,</strong> also known as an RSS feed. <strong>Subscribe</strong> by copying the URL from the address bar into your newsreader. 84 + </p> 85 + <p class="text-gray"> 86 + Visit <a href="https://aboutfeeds.com">About Feeds</a> to get started with newsreaders and subscribing. It’s free. 87 + </p> 88 + </nav> 89 + <div class="container-md px-3 py-3 markdown-body"> 90 + <header class="py-5"> 91 + <h1 class="border-0"> 92 + <!-- https://commons.wikimedia.org/wiki/File:Feed-icon.svg --> 93 + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" style="vertical-align: text-bottom; width: 1.2em; height: 1.2em;" class="pr-1" id="RSSicon" viewBox="0 0 256 256"> 94 + <defs> 95 + <linearGradient x1="0.085" y1="0.085" x2="0.915" y2="0.915" id="RSSg"> 96 + <stop offset="0.0" stop-color="#E3702D"/><stop offset="0.1071" stop-color="#EA7D31"/> 97 + <stop offset="0.3503" stop-color="#F69537"/><stop offset="0.5" stop-color="#FB9E3A"/> 98 + <stop offset="0.7016" stop-color="#EA7C31"/><stop offset="0.8866" stop-color="#DE642B"/> 99 + <stop offset="1.0" stop-color="#D95B29"/> 100 + </linearGradient> 101 + </defs> 102 + <rect width="256" height="256" rx="55" ry="55" x="0" y="0" fill="#CC5D15"/> 103 + <rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/> 104 + <rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#RSSg)"/> 105 + <circle cx="68" cy="189" r="24" fill="#FFF"/> 106 + <path d="M160 213h-34a82 82 0 0 0 -82 -82v-34a116 116 0 0 1 116 116z" fill="#FFF"/> 107 + <path d="M184 213A140 140 0 0 0 44 73 V 38a175 175 0 0 1 175 175z" fill="#FFF"/> 108 + </svg> 109 + 110 + Web Feed Preview 111 + </h1> 112 + <h2><xsl:value-of select="/rss/channel/title"/></h2> 113 + <p><xsl:value-of select="/rss/channel/description"/></p> 114 + <a class="head_link" target="_blank"> 115 + <xsl:attribute name="href"> 116 + <xsl:value-of select="/rss/channel/link"/> 117 + </xsl:attribute> 118 + Visit Website &#x2192; 119 + </a> 120 + </header> 121 + <h2>Recent Items</h2> 122 + <xsl:for-each select="/rss/channel/item"> 123 + <div class="pb-5"> 124 + <h3 class="mb-0"> 125 + <a target="_blank"> 126 + <xsl:attribute name="href"> 127 + <xsl:value-of select="link"/> 128 + </xsl:attribute> 129 + <xsl:value-of select="title"/> 130 + </a> 131 + </h3> 132 + <small class="text-gray"> 133 + Published: <xsl:value-of select="pubDate" /> 134 + </small> 135 + </div> 136 + </xsl:for-each> 137 + </div> 138 + </body> 139 + </html> 140 + </xsl:template> 141 + </xsl:stylesheet>
public/unicorn.webp

This is a binary file and will not be displayed.

+6
src/components/BlockHeader.astro
··· 1 + <> 2 + <h1 class="text-accent text-[1.6rem] pb-2.5 pl-1 mt-4 md:mt-7 font-semibold"> 3 + <slot /> 4 + </h1> 5 + <div class="border-1 border-accent/30 rounded-xl h-1 w-full"></div> 6 + </>
+12
src/components/DividerText.astro
··· 1 + --- 2 + interface Props { 3 + text: string 4 + } 5 + const { text } = Astro.props 6 + --- 7 + 8 + <div class="flex gap-3 items-center my-4"> 9 + <hr class="flex-1 bg-accent h-0.5 border-none" /> 10 + <span class="shrink-0 whitespace-nowrap">{text}</span> 11 + <hr class="flex-1 bg-accent h-0.5 border-none" /> 12 + </div>
+30
src/components/Footer.astro
··· 1 + --- 2 + import siteConfig from '~/site.config' 3 + import SocialLinks from '~/components/SocialLinks.astro' 4 + --- 5 + 6 + <footer 7 + class="mt-auto pt-9 md:pt-11 grow-0 flex flex-col gap-6 items-center justify-between max-w-full text-foreground/80" 8 + > 9 + {siteConfig.socialLinks && <SocialLinks socialLinks={siteConfig.socialLinks} />} 10 + <div class="flex flex-col md:flex-row flex-wrap flex-1 items-center justify-center"> 11 + <span class="my-1"> 12 + {siteConfig.author} © 2025 13 + </span> 14 + <span class="mx-5 hidden md:block"> :: </span> 15 + <span class="my-1"> 16 + Powered by <a 17 + class="underline" 18 + target="_blank" 19 + rel="noopener noreferrer" 20 + href="https://astro.build">Astro</a 21 + > 22 + & <a 23 + class="underline" 24 + target="_blank" 25 + rel="noopener noreferrer" 26 + href="https://github.com/stelcodes/multiterm-astro">MultiTerm</a 27 + > 28 + </span> 29 + </div> 30 + </footer>
+116
src/components/GiscusLoader.astro
··· 1 + --- 2 + import siteConfig from '~/site.config' 3 + // This will be localhost during development, site URL in prod 4 + const origin = Astro.url.origin 5 + const giscusConfig = siteConfig.giscus 6 + if (!giscusConfig) { 7 + throw new Error('Giscus configuration is missing in site.config.ts') 8 + } 9 + const repo = giscusConfig.repo 10 + const repoId = giscusConfig.repoId 11 + const category = giscusConfig.category 12 + const categoryId = giscusConfig.categoryId 13 + const reactionsEnabled = giscusConfig.reactionsEnabled ? '1' : '0' 14 + --- 15 + 16 + <div 17 + class="giscus" 18 + data-origin={origin} 19 + data-repo={repo} 20 + data-repo-id={repoId} 21 + data-category={category} 22 + data-category-id={categoryId} 23 + data-reactions-enabled={reactionsEnabled} 24 + > 25 + </div> 26 + <script> 27 + function loadGiscus() { 28 + const giscusDiv = document.querySelector('.giscus') 29 + if (!giscusDiv) { 30 + throw new Error('Giscus div not found in the document.') 31 + } 32 + const origin = giscusDiv.getAttribute('data-origin') 33 + const repo = giscusDiv.getAttribute('data-repo') 34 + const repoId = giscusDiv.getAttribute('data-repo-id') 35 + const category = giscusDiv.getAttribute('data-category') 36 + const categoryId = giscusDiv.getAttribute('data-category-id') 37 + const reactionsEnabled = giscusDiv.getAttribute('data-reactions-enabled') 38 + const theme = document.documentElement.getAttribute('data-theme') 39 + if ( 40 + !origin || 41 + !repo || 42 + !repoId || 43 + !category || 44 + !categoryId || 45 + !reactionsEnabled || 46 + !theme 47 + ) { 48 + throw new Error('Giscus configuration missing in the Giscus div.') 49 + } 50 + const script = document.createElement('script') 51 + script.src = 'https://giscus.app/client.js' 52 + script.setAttribute('data-repo', repo) 53 + script.setAttribute('data-repo-id', repoId) 54 + script.setAttribute('data-category', category) 55 + script.setAttribute('data-category-id', categoryId) 56 + script.setAttribute('data-mapping', 'pathname') 57 + script.setAttribute('data-strict', '0') 58 + script.setAttribute('data-reactions-enabled', reactionsEnabled) 59 + script.setAttribute('data-emit-metadata', '0') 60 + // Setting this to 'bottom' doesn't work. Not sure why. 61 + script.setAttribute('data-input-position', 'top') 62 + script.setAttribute('data-theme', `${origin}/giscus/${theme}.css`) 63 + script.setAttribute('data-lang', 'en') 64 + script.setAttribute('loading', 'lazy') 65 + script.crossOrigin = 'anonymous' 66 + script.async = true 67 + document.body.appendChild(script) 68 + } 69 + async function updateTheme(theme: string) { 70 + console.log('Updating Giscus theme to:', theme) 71 + let giscusFrame 72 + // Try to find the Giscus iframe 3 times, in case it takes a moment to load 73 + for (let i = 0; i < 3; i++) { 74 + giscusFrame = document.querySelector<HTMLIFrameElement>('iframe.giscus-frame') 75 + if (giscusFrame) break 76 + console.log('Giscus iframe not found, retrying...') 77 + // Wait a moment before trying again 78 + await new Promise((resolve) => setTimeout(resolve, 1000)) 79 + } 80 + // If the iframe is still not found, log an error and return 81 + if (!giscusFrame) { 82 + console.error('Giscus iframe not found after retries') 83 + return 84 + } 85 + giscusFrame.contentWindow?.postMessage( 86 + { giscus: { setConfig: { theme: `${origin}/giscus/${theme}.css` } } }, 87 + 'https://giscus.app', 88 + ) 89 + } 90 + function listenForThemeChange() { 91 + // Listen for changes to the data-theme attribute of the html element 92 + const observer = new MutationObserver((mutations) => { 93 + mutations.forEach(async (mutation) => { 94 + if (mutation.type === 'attributes' && mutation.attributeName === 'data-theme') { 95 + const newTheme = document.documentElement.getAttribute('data-theme') 96 + if (newTheme) { 97 + await updateTheme(newTheme) 98 + } 99 + } 100 + }) 101 + }) 102 + observer.observe(document.documentElement, { 103 + attributes: true, 104 + attributeFilter: ['data-theme'], 105 + }) 106 + } 107 + // Load Giscus script with correct theme and listen for theme changes 108 + loadGiscus() 109 + listenForThemeChange() 110 + </script> 111 + 112 + <style is:global> 113 + iframe.giscus-frame { 114 + margin-block: 32px; 115 + } 116 + </style>
+307
src/components/GitHubActivityCalendar.astro
··· 1 + --- 2 + import { 3 + differenceInCalendarDays, 4 + eachDayOfInterval, 5 + formatISO, 6 + getDay, 7 + nextDay, 8 + parseISO, 9 + subWeeks, 10 + getYear, 11 + getMonth, 12 + isValid, 13 + } from 'date-fns' 14 + import type { 15 + WeekdayIndex, 16 + GitHubActivityApiResponse, 17 + GitHubActivityDay, 18 + GitHubActivityWeek, 19 + GitHubActivityMonthLabel, 20 + } from '~/types' 21 + 22 + interface Props { 23 + username: string 24 + year?: number 25 + } 26 + 27 + function range(n: number) { 28 + return [...Array(n).keys()] 29 + } 30 + 31 + async function fetchData( 32 + username: string, 33 + year: number | 'last', 34 + ): Promise<GitHubActivityApiResponse> { 35 + function validateActivities(activities: Array<GitHubActivityDay>) { 36 + if (activities.length === 0) { 37 + throw new Error('Activity data must not be empty.') 38 + } 39 + for (const { date, count } of activities) { 40 + if (!isValid(parseISO(date))) { 41 + throw new Error(`Activity date '${date}' is not a valid ISO 8601 date string.`) 42 + } 43 + if (count < 0) { 44 + throw new RangeError(`Activity count must not be negative, found ${count}.`) 45 + } 46 + } 47 + } 48 + const apiUrl = 'https://github-contributions-api.jogruber.de/v4/' 49 + const response = await fetch(`${apiUrl}${username}?y=${String(year)}`) 50 + const data = (await response.json()) as GitHubActivityApiResponse 51 + if (!response.ok) { 52 + const message = data.error || 'Unknown error' 53 + throw Error(`Fetching GitHub contribution data for "${username}" failed: ${message}`) 54 + } 55 + 56 + validateActivities(data.contributions) 57 + 58 + return data 59 + } 60 + 61 + function calcColorScale([start, end]: [string, string], steps: number): Array<string> { 62 + return range(steps).map((i) => { 63 + switch (i) { 64 + case 0: 65 + return start 66 + case steps - 1: 67 + return end 68 + default: { 69 + const pos = (i / (steps - 1)) * 100 70 + return `color-mix(in oklab, ${end} ${parseFloat(pos.toFixed(2))}%, ${start})` 71 + } 72 + } 73 + }) 74 + } 75 + 76 + function fillHoles(activities: Array<GitHubActivityDay>): Array<GitHubActivityDay> { 77 + const calendar = new Map<string, GitHubActivityDay>(activities.map((a) => [a.date, a])) 78 + const firstActivity = activities[0] as GitHubActivityDay 79 + const lastActivity = activities[activities.length - 1] as GitHubActivityDay 80 + 81 + return eachDayOfInterval({ 82 + start: parseISO(firstActivity.date), 83 + end: parseISO(lastActivity.date), 84 + }).map((day) => { 85 + const date = formatISO(day, { representation: 'date' }) 86 + if (calendar.has(date)) { 87 + return calendar.get(date) as GitHubActivityDay 88 + } 89 + return { 90 + date, 91 + count: 0, 92 + level: 0, 93 + } 94 + }) 95 + } 96 + 97 + function groupByWeeks( 98 + activities: Array<GitHubActivityDay>, 99 + weekStart: WeekdayIndex = 0, // 0 = Sunday 100 + ): Array<GitHubActivityWeek> { 101 + const normalizedActivities = fillHoles(activities) 102 + // Determine the first date of the calendar. If the first date is not the 103 + // passed weekday, the respective weekday one week earlier is used. 104 + const firstActivity = normalizedActivities[0] as GitHubActivityDay 105 + const firstDate = parseISO(firstActivity.date) 106 + const firstCalendarDate = 107 + getDay(firstDate) === weekStart 108 + ? firstDate 109 + : subWeeks(nextDay(firstDate, weekStart), 1) 110 + // To correctly group activities by week, it is necessary to left-pad the list 111 + // because the first date might not be set start weekday. 112 + const paddedActivities = [ 113 + ...(Array(differenceInCalendarDays(firstDate, firstCalendarDate)).fill( 114 + undefined, 115 + ) as Array<GitHubActivityDay>), 116 + ...normalizedActivities, 117 + ] 118 + const numberOfWeeks = Math.ceil(paddedActivities.length / 7) 119 + 120 + // Finally, group activities by week 121 + return [...Array(numberOfWeeks).keys()].map((weekIndex) => 122 + paddedActivities.slice(weekIndex * 7, weekIndex * 7 + 7), 123 + ) 124 + } 125 + 126 + function getMonthLabels( 127 + weeks: Array<GitHubActivityWeek>, 128 + monthNames: Array<string>, 129 + ): Array<GitHubActivityMonthLabel> { 130 + return weeks 131 + .reduce<Array<GitHubActivityMonthLabel>>((labels, week, weekIndex) => { 132 + const firstActivity = week.find((activity) => activity !== undefined) 133 + if (!firstActivity) { 134 + throw new Error(`Unexpected error: Week ${weekIndex + 1} is empty.`) 135 + } 136 + const month = monthNames[getMonth(parseISO(firstActivity.date))] 137 + if (!month) { 138 + const monthName = new Date(firstActivity.date).toLocaleString('en-US', { 139 + month: 'short', 140 + }) 141 + throw new Error(`Unexpected error: undefined month label for ${monthName}.`) 142 + } 143 + const prevLabel = labels[labels.length - 1] 144 + if (weekIndex === 0 || !prevLabel || prevLabel.label !== month) { 145 + return [...labels, { weekIndex, label: month }] 146 + } 147 + return labels 148 + }, []) 149 + .filter(({ weekIndex }, index, labels) => { 150 + const minWeeks = 3 151 + // Skip the first month label if there is not enough space to the next one. 152 + if (index === 0) { 153 + return labels[1] && labels[1].weekIndex - weekIndex >= minWeeks 154 + } 155 + // Skip the last month label if there is not enough data in that month 156 + if (index === labels.length - 1) { 157 + return weeks.slice(weekIndex).length >= minWeeks 158 + } 159 + return true 160 + }) 161 + } 162 + 163 + const { username, year = 'last' } = Astro.props 164 + 165 + const data = await fetchData(username, year) 166 + 167 + const themeFromColorscheme: [string, string] = [ 168 + 'var(--theme-background)', 169 + 'var(--theme-accent)', 170 + ] 171 + 172 + const totalCount = year === 'last' ? data.total.lastYear : data.total[year] 173 + const maxLevel = 4 174 + const blockMargin = 4 175 + const labelMargin = 8 176 + const blockRadius = 2 177 + const blockSize = 12 178 + const fontSize = 14 179 + const hideColorLegend = false 180 + const hideMonthLabels = false 181 + const hideTotalCount = false 182 + const weekStart = 0 // 0 = Sunday, 1 = Monday, etc. 183 + 184 + const colorScale = calcColorScale(themeFromColorscheme, maxLevel + 1) 185 + const activities = data.contributions 186 + 187 + const firstActivity = activities[0] 188 + const activityYear = getYear(parseISO(firstActivity.date)) 189 + const weeks = groupByWeeks(activities, weekStart) 190 + const labels = { 191 + months: [ 192 + 'Jan', 193 + 'Feb', 194 + 'Mar', 195 + 'Apr', 196 + 'May', 197 + 'Jun', 198 + 'Jul', 199 + 'Aug', 200 + 'Sep', 201 + 'Oct', 202 + 'Nov', 203 + 'Dec', 204 + ], 205 + totalCount: `{{count}} contributions in ${year === 'last' ? 'the last year' : '{{year}}'}`, 206 + legend: { 207 + less: 'Less', 208 + more: 'More', 209 + }, 210 + } 211 + const labelHeight = hideMonthLabels ? 0 : fontSize + labelMargin 212 + const width = weeks.length * (blockSize + blockMargin) - blockMargin 213 + const height = labelHeight + (blockSize + blockMargin) * 7 - blockMargin 214 + --- 215 + 216 + <article 217 + id="github-activity-calendar" 218 + class="w-max max-w-full flex flex-col gap-2 text-sm" 219 + > 220 + <div 221 + class="max-w-full overflow-x-auto pt-0.5" 222 + style={{ 223 + // Don't cover the calendar with the scrollbar. 224 + scrollbarGutter: 'stable', 225 + }} 226 + > 227 + <svg 228 + class="block visible" 229 + width={width} 230 + height={height} 231 + viewBox={`0 0 ${width} ${height}`} 232 + > 233 + { 234 + !hideMonthLabels && ( 235 + <g> 236 + {getMonthLabels(weeks, labels.months).map(({ label, weekIndex }) => ( 237 + <text 238 + x={(blockSize + blockMargin) * weekIndex} 239 + y={0} 240 + dominant-baseline="hanging" 241 + fill="currentColor" 242 + > 243 + {label} 244 + </text> 245 + ))} 246 + </g> 247 + ) 248 + } 249 + { 250 + weeks.map((week, weekIndex) => ( 251 + <g transform={`translate(${(blockSize + blockMargin) * weekIndex}, 0)`}> 252 + {week.map((activity, dayIndex) => { 253 + if (!activity) return null 254 + return ( 255 + <rect 256 + class="stroke-foreground/10" 257 + x={0} 258 + y={labelHeight + (blockSize + blockMargin) * dayIndex} 259 + width={blockSize} 260 + height={blockSize} 261 + rx={blockRadius} 262 + ry={blockRadius} 263 + fill={colorScale[activity.level]} 264 + data-date={activity.date} 265 + data-level={activity.level} 266 + /> 267 + ) 268 + })} 269 + </g> 270 + )) 271 + } 272 + </svg> 273 + </div> 274 + { 275 + !(hideTotalCount && hideColorLegend) && ( 276 + <footer class="flex flex-col sm:flex-row sm:justify-between gap-x-1 gap-y-2"> 277 + {!hideTotalCount && ( 278 + <div> 279 + {labels.totalCount 280 + ? labels.totalCount 281 + .replace('{{count}}', String(totalCount)) 282 + .replace('{{year}}', String(activityYear)) 283 + : `${totalCount} activities in ${activityYear}`} 284 + </div> 285 + )} 286 + {!hideColorLegend && ( 287 + <div class="flex items-center gap-[3px]"> 288 + <span class="mr-1.5">{labels.legend.less}</span> 289 + {range(maxLevel + 1).map((level) => ( 290 + <svg width={blockSize} height={blockSize}> 291 + <rect 292 + class="stroke-foreground/10" 293 + width={blockSize} 294 + height={blockSize} 295 + fill={colorScale[level]} 296 + rx={blockRadius} 297 + ry={blockRadius} 298 + /> 299 + </svg> 300 + ))} 301 + <span class="ml-1.5">{labels.legend.more}</span> 302 + </div> 303 + )} 304 + </footer> 305 + ) 306 + } 307 + </article>
+87
src/components/Header.astro
··· 1 + --- 2 + import siteConfig from '~/site.config' 3 + import LightDarkAutoButton from '~/components/LightDarkAutoButton.astro' 4 + import Search from '~/components/Search.astro' 5 + import SelectTheme from '~/components/SelectTheme.astro' 6 + import NavLink from '~/components/NavLink.astro' 7 + 8 + const lightDarkAutoTheme = siteConfig.themes.mode === 'light-dark-auto' 9 + const selectTheme = 10 + siteConfig.themes.mode === 'select' && siteConfig.themes.include.length > 1 11 + --- 12 + 13 + <header> 14 + <div class="relative flex items-center justify-between bg-accent/10 rounded-xl"> 15 + <a 16 + id="logo" 17 + href="/" 18 + class="block px-4 py-1.5 max-w-full no-underline items-center bg-accent text-background font-bold rounded-xl" 19 + > 20 + {siteConfig.title} 21 + </a> 22 + <div class="flex items-center gap-3 sm:mr-3"> 23 + <Search trailingSlashes={siteConfig.trailingSlashes} /> 24 + {lightDarkAutoTheme && <LightDarkAutoButton />} 25 + {selectTheme && <SelectTheme />} 26 + <nav id="nav-mobile" aria-label="Menu" class="p-0 text-accent sm:hidden"> 27 + <button 28 + id="nav-mobile-button" 29 + class="px-3 py-1 h-full cursor-pointer border-2 rounded-xl bg-background" 30 + type="button" 31 + aria-expanded="false" 32 + aria-controls="nav-menu-list" 33 + > 34 + 35 + </button> 36 + <ul 37 + id="nav-mobile-list" 38 + class="invisible absolute flex flex-col bg-background shadow text-accent border-2 m-0 p-2.5 top-11.5 left-auto right-0 z-50 rounded-xl" 39 + > 40 + { 41 + siteConfig.navLinks.map((link) => ( 42 + <li class="p-1" aria-expanded="false"> 43 + <NavLink link={link} /> 44 + </li> 45 + )) 46 + } 47 + </ul> 48 + </nav> 49 + </div> 50 + </div> 51 + <nav aria-label="Menu" class="p-0 mt-4 ml-0.5 text-accent hidden sm:block"> 52 + <ul class="flex flex-row text-accent"> 53 + { 54 + siteConfig.navLinks.map((link) => ( 55 + <li class="mr-5" aria-expanded="true"> 56 + <NavLink link={link} /> 57 + </li> 58 + )) 59 + } 60 + </ul> 61 + </nav> 62 + </header> 63 + 64 + <script> 65 + const navMobileButton = document.getElementById('nav-mobile-button') 66 + const navMobileList = document.getElementById('nav-mobile-list') 67 + const navMobileListItems = navMobileList?.querySelectorAll('li') 68 + const toggleNavMobileMenu = (action: 'on' | 'off' | 'toggle') => { 69 + let isNowOpen: boolean = false 70 + if (action === 'on') { 71 + isNowOpen = true 72 + navMobileList?.classList.remove('invisible') 73 + } else if (action === 'off') { 74 + isNowOpen = false 75 + navMobileList?.classList.add('invisible') 76 + } else { 77 + isNowOpen = !navMobileList?.classList.toggle('invisible') 78 + } 79 + navMobileButton?.setAttribute('aria-expanded', isNowOpen ? 'true' : 'false') 80 + navMobileListItems?.forEach((listItem) => { 81 + listItem.setAttribute('aria-expanded', isNowOpen ? 'true' : 'false') 82 + }) 83 + } 84 + navMobileButton?.addEventListener('click', (_ev) => { 85 + toggleNavMobileMenu('toggle') 86 + }) 87 + </script>
+37
src/components/HomeBanner.astro
··· 1 + --- 2 + import { Image } from 'astro:assets' 3 + import GitHubActivityCalendar from '~/components/GitHubActivityCalendar.astro' 4 + import type { FrontmatterImage } from '~/types' 5 + 6 + interface Props { 7 + avatarImage?: FrontmatterImage 8 + githubCalendar?: string 9 + } 10 + const { avatarImage, githubCalendar } = Astro.props 11 + --- 12 + 13 + <div class="my-6 md:mx-2"> 14 + <div 15 + class="flex flex-col sm:flex-row items-center justify-around sm:gap-5 max-w-full mb-6" 16 + > 17 + { 18 + avatarImage && ( 19 + <Image 20 + priority 21 + src={avatarImage.src} 22 + alt={avatarImage.alt} 23 + class="rounded-full border-8 border-accent/15 size-36 aspect-square box-content shrink-0" 24 + widths={[288]} 25 + height={144} 26 + width={144} 27 + /> 28 + ) 29 + } 30 + <div> 31 + <div class:list={['m-4 max-w-full prose']}> 32 + <slot /> 33 + </div> 34 + </div> 35 + </div> 36 + {githubCalendar && <GitHubActivityCalendar username={githubCalendar} />} 37 + </div>
+71
src/components/LightDarkAutoButton.astro
··· 1 + --- 2 + import IconSun from '~/icons/sun.svg' 3 + import IconMoon from '~/icons/moon.svg' 4 + import IconSunMoon from '~/icons/sun-moon.svg' 5 + import siteConfig from '~/site.config' 6 + let lightTheme = siteConfig.themes.include[0] 7 + let darkTheme = siteConfig.themes.include[1] 8 + --- 9 + 10 + <button 11 + id="theme-change-button" 12 + class="block ml-auto" 13 + data-light={lightTheme} 14 + data-dark={darkTheme} 15 + > 16 + <IconSun id="icon-light" class="hidden size-6 text-accent" /> 17 + <IconMoon id="icon-dark" class="hidden size-6 text-accent" /> 18 + <IconSunMoon id="icon-auto" class="hidden size-6 text-accent" /> 19 + </button> 20 + 21 + <script> 22 + const themeButton = document.getElementById('theme-change-button') 23 + const lightThemeId = themeButton?.getAttribute('data-light') 24 + const darkThemeId = themeButton?.getAttribute('data-dark') 25 + const sunIcon = themeButton?.querySelector('#icon-light') 26 + const moonIcon = themeButton?.querySelector('#icon-dark') 27 + const sunMoonIcon = themeButton?.querySelector('#icon-auto') 28 + const updateIcons = (theme: string) => { 29 + if (theme === lightThemeId) { 30 + sunIcon?.classList.remove('hidden') 31 + moonIcon?.classList.add('hidden') 32 + sunMoonIcon?.classList.add('hidden') 33 + } else if (theme === darkThemeId) { 34 + sunIcon?.classList.add('hidden') 35 + moonIcon?.classList.remove('hidden') 36 + sunMoonIcon?.classList.add('hidden') 37 + } else { 38 + sunIcon?.classList.add('hidden') 39 + moonIcon?.classList.add('hidden') 40 + sunMoonIcon?.classList.remove('hidden') 41 + } 42 + } 43 + let currentTheme = localStorage.getItem('data-theme') || 'auto' 44 + updateIcons(currentTheme) 45 + themeButton?.addEventListener('click', () => { 46 + // Toggle between light, dark, and auto themes 47 + // Only need to update localStorage because there should be a listener in Layout.astro 48 + const currentTheme = localStorage.getItem('data-theme') || darkThemeId 49 + let newTheme 50 + if (currentTheme === lightThemeId) { 51 + newTheme = darkThemeId 52 + } else if (currentTheme === darkThemeId) { 53 + newTheme = 'auto' 54 + } else { 55 + newTheme = lightThemeId 56 + } 57 + if (newTheme) { 58 + updateIcons(newTheme) 59 + localStorage.setItem('data-theme', newTheme) 60 + if (newTheme === 'auto') { 61 + const prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)') 62 + document.documentElement.setAttribute( 63 + 'data-theme', 64 + prefersDarkScheme.matches ? darkThemeId || 'auto' : lightThemeId || 'auto', 65 + ) 66 + } else { 67 + document.documentElement.setAttribute('data-theme', newTheme) 68 + } 69 + } 70 + }) 71 + </script>
+48
src/components/LightDarkAutoThemeLoader.astro
··· 1 + --- 2 + 3 + --- 4 + 5 + <script is:inline> 6 + ;(function loadTheme() { 7 + const pageDefaultTheme = document.documentElement.getAttribute('data-theme') 8 + const pageDarkTheme = document.documentElement.getAttribute('data-dark-theme') 9 + const pageLightTheme = document.documentElement.getAttribute('data-light-theme') 10 + const pageThemeHash = document.documentElement.getAttribute('data-theme-hash') 11 + if (!pageDefaultTheme || !pageDarkTheme || !pageLightTheme || !pageThemeHash) { 12 + throw new Error('Theme attributes are required.') 13 + } 14 + const getStoredTheme = () => localStorage.getItem('data-theme') 15 + let storedTheme = getStoredTheme() 16 + const storedThemeHash = localStorage.getItem('data-theme-hash') 17 + const themeHashMatches = storedThemeHash === pageThemeHash 18 + 19 + if (!storedTheme || !storedThemeHash || !themeHashMatches) { 20 + // Should be the first time loading the website 21 + localStorage.setItem('data-theme', pageDefaultTheme) 22 + localStorage.setItem('data-theme-hash', pageThemeHash) 23 + } 24 + 25 + if ( 26 + themeHashMatches && 27 + storedTheme && 28 + storedTheme !== 'auto' && 29 + storedTheme !== pageDefaultTheme 30 + ) { 31 + // The stored theme is different from the default theme, apply it 32 + document.documentElement.setAttribute('data-theme', storedTheme) 33 + } else if (pageDefaultTheme === 'auto' || storedTheme === 'auto') { 34 + // If the default or stored theme is 'auto', apply the system preference 35 + const prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)') 36 + document.documentElement.setAttribute( 37 + 'data-theme', 38 + prefersDarkScheme.matches ? pageDarkTheme : pageLightTheme, 39 + ) 40 + prefersDarkScheme.addEventListener('change', (e) => { 41 + if (getStoredTheme() === 'auto') { 42 + const newTheme = e.matches ? pageDarkTheme : pageLightTheme 43 + document.documentElement.setAttribute('data-theme', newTheme) 44 + } 45 + }) 46 + } 47 + })() 48 + </script>
+18
src/components/NavLink.astro
··· 1 + --- 2 + import type { NavLink } from '~/types' 3 + 4 + interface Props { 5 + link: NavLink 6 + } 7 + 8 + const { link } = Astro.props 9 + --- 10 + 11 + <a 12 + class="underline" 13 + rel={link.external ? 'noopener noreferrer' : undefined} 14 + target={link.external ? '_blank' : undefined} 15 + href={link.url} 16 + > 17 + {link.name} 18 + </a>
+29
src/components/PageHeader.astro
··· 1 + --- 2 + interface Props { 3 + title?: string 4 + titlePieces?: string[] 5 + } 6 + 7 + const { title, titlePieces } = Astro.props 8 + 9 + const splitPath: string[] = Astro.url.pathname 10 + .split('/') 11 + .filter(Boolean) // Remove empty parts 12 + .map((part) => decodeURIComponent(part)) // For Unicode chars kept by github-slugger 13 + 14 + const pieces = titlePieces ?? splitPath 15 + 16 + if (pieces.length === 0) { 17 + pieces.push('home') 18 + } 19 + 20 + const titleFromPieces = pieces.map((part) => `/ ${part}`) 21 + --- 22 + 23 + <div 24 + class="border-0 border-accent/30 bg-accent/6 rounded-xl inline-block py-2.5 pl-3 pr-4 mt-5 md:mt-8" 25 + > 26 + <h1 class="text-accent text-2xl font-semibold flex flex-wrap gap-y-2 gap-x-3.5"> 27 + {title ? <span>// {title}</span> : titleFromPieces.map((part) => <span>{part}</span>)} 28 + </h1> 29 + </div>
+43
src/components/Pagination.astro
··· 1 + --- 2 + import IconChevronsLeft from '~/icons/chevrons-left.svg' 3 + import IconChevronsRight from '~/icons/chevrons-right.svg' 4 + 5 + interface Props { 6 + prevLink?: string 7 + prevText?: string 8 + nextLink?: string 9 + nextText?: string 10 + } 11 + 12 + const { prevLink, prevText, nextLink, nextText } = Astro.props 13 + --- 14 + 15 + <div class="my-5 flex flex-row flex-wrap gap-3 justify-center"> 16 + { 17 + prevLink && ( 18 + <a 19 + href={prevLink} 20 + aria-label="Previous Page" 21 + class="button flex-row items-center justify-center w-full !pr-3.5 sm:w-min" 22 + > 23 + <IconChevronsLeft class="mr-2 text-xl size-5" /> 24 + {prevText || 'Previous'} 25 + </a> 26 + ) 27 + } 28 + { 29 + nextLink && ( 30 + <a 31 + href={nextLink} 32 + aria-label="Next Page" 33 + class:list={[ 34 + 'button flex-row items-center justify-center w-full !pl-3.5 sm:w-min', 35 + prevLink && 'ml-auto', 36 + ]} 37 + > 38 + {nextText || 'Next'} 39 + <IconChevronsRight class="ml-2 text-xl size-5" /> 40 + </a> 41 + ) 42 + } 43 + </div>
+31
src/components/PostAddendum.astro
··· 1 + --- 2 + import type { FrontmatterImage } from '~/types' 3 + import { Image } from 'astro:assets' 4 + 5 + interface Props { 6 + avatarImage?: FrontmatterImage 7 + } 8 + const { avatarImage } = Astro.props 9 + --- 10 + 11 + <div 12 + class="flex flex-col sm:flex-row items-center justify-around sm:gap-5 max-w-full mb-6 py-10 bg-accent/8 p-4 rounded-xl" 13 + > 14 + { 15 + avatarImage && ( 16 + <Image 17 + src={avatarImage.src} 18 + alt={avatarImage.alt} 19 + class="rounded-full border-8 border-accent/15 size-36 aspect-square box-content shrink-0" 20 + widths={[288]} 21 + height={144} 22 + width={144} 23 + /> 24 + ) 25 + } 26 + <div> 27 + <div class:list={['m-4 max-w-full prose']}> 28 + <slot /> 29 + </div> 30 + </div> 31 + </div>
+62
src/components/PostInfo.astro
··· 1 + --- 2 + import { dateString, SeriesGroup } from '~/utils' 3 + import { render, type CollectionEntry } from 'astro:content' 4 + import type { Collation } from '~/types' 5 + 6 + interface Props { 7 + post: CollectionEntry<'posts'> 8 + class?: string 9 + } 10 + 11 + const { post, class: className } = Astro.props 12 + const { remarkPluginFrontmatter } = await render(post) 13 + const { minutesRead } = remarkPluginFrontmatter 14 + const seriesFrontmatter = post.data.series 15 + let series: Collation<'posts'> | undefined 16 + let seriesPostNumber: number | undefined 17 + let seriesTotal: number | undefined 18 + if (seriesFrontmatter) { 19 + const seriesGroup = await SeriesGroup.build() 20 + series = seriesGroup.match(seriesFrontmatter) 21 + if (!series) { 22 + // This should never happen if the series data is correct 23 + throw new Error(`Series "${seriesFrontmatter}" not found`) 24 + } 25 + seriesPostNumber = series.entries.findIndex((p) => p.id === post.id) + 1 26 + seriesTotal = series.entries.length 27 + } 28 + --- 29 + 30 + <div class:list={[className, 'text-foreground/80']}> 31 + <div 32 + class="flex flex-col gap-4 sm:gap-2 sm:flex-wrap items-start sm:items-center sm:flex-row" 33 + > 34 + { 35 + series && seriesPostNumber && seriesTotal && ( 36 + <a 37 + class="shrink-0 rounded-2xl py-[3px] px-3.5 bg-foreground/1 me-2.5 hover:bg-foreground/5 transition-colors border-1 border-foreground/16 hover:border-foreground/20" 38 + href={series.url} 39 + > 40 + {series.title} {seriesPostNumber} / {seriesTotal} 41 + </a> 42 + ) 43 + } 44 + <div class="shrink-0 pl-0.5 text-[17px] sm:text-base"> 45 + <time>{dateString(post.data.published)}</time> 46 + { 47 + post.data.author && ( 48 + <span class="before:content-['·'] before:font-bold before:inline-block before:mx-0.5"> 49 + {post.data.author} 50 + </span> 51 + ) 52 + } 53 + { 54 + minutesRead && ( 55 + <span class="before:content-['·'] before:inline-block before:mx-0.5"> 56 + {minutesRead} 57 + </span> 58 + ) 59 + } 60 + </div> 61 + </div> 62 + </div>
+46
src/components/PostPreview.astro
··· 1 + --- 2 + import IconChevronsRight from '~/icons/chevrons-right.svg' 3 + import type { CollectionEntry } from 'astro:content' 4 + import { render } from 'astro:content' 5 + import Tags from '~/components/Tags.astro' 6 + import PostInfo from '~/components/PostInfo.astro' 7 + import type { Collation } from '~/types' 8 + import { TagsGroup } from '~/utils' 9 + 10 + interface Props { 11 + post: CollectionEntry<'posts'> 12 + } 13 + 14 + const { post } = Astro.props 15 + 16 + const { remarkPluginFrontmatter } = await render(post) 17 + const description = remarkPluginFrontmatter.description || post.data.description 18 + let tags: Collation<'posts'>[] | undefined 19 + if (post.data.tags && post.data.tags.length > 0) { 20 + const tagsGroup = await TagsGroup.build() 21 + tags = tagsGroup.matchMany(post.data.tags) 22 + } 23 + const samePage = Astro.url.pathname === `/posts/${post.id}` 24 + const articleLink = samePage ? `#${post.id}` : `/posts/${post.id}` 25 + --- 26 + 27 + <article class="w-full py-5 my-1 md:my-4 border-accent/10"> 28 + <h1 class="mb-3 text-2xl text-heading1 font-semibold"> 29 + <a href={articleLink}># {post.data.title}</a> 30 + </h1> 31 + <PostInfo post={post} class="mb-3 mt-4" /> 32 + {description && <p class="pl-0.5 my-4 text-base/7 text-foreground">{description}</p>} 33 + { 34 + tags && ( 35 + <div class="mb-6"> 36 + <Tags tags={tags} /> 37 + </div> 38 + ) 39 + } 40 + <div> 41 + <a class="button flex items-center !pl-3.5" href={articleLink}> 42 + {samePage ? 'Continue' : 'Read'} 43 + <IconChevronsRight class="size-5 ml-2" /> 44 + </a> 45 + </div> 46 + </article>
+94
src/components/ScrollUpButton.astro
··· 1 + --- 2 + import IconChevronUp from '~/icons/chevron-up.svg' 3 + --- 4 + 5 + <button 6 + hidden 7 + class="scroll-up size-11 fixed flex items-center justify-center bg-background z-100 bottom-3 right-3 rounded-full border-2 border-accent/20 hover:bg-accent/10 md:size-12 md:bottom-5 md:right-5 lg:size-13 lg:bottom-6 lg:right-6" 8 + > 9 + <IconChevronUp class="text-accent/50 size-8 lg:size-9" /> 10 + </button> 11 + 12 + <script> 13 + function transitionHiddenElement( 14 + element: HTMLElement, 15 + transitionProperty: string, 16 + transitionClass: string, 17 + ) { 18 + const listener = (e: TransitionEvent) => { 19 + if (e.target === element && e.propertyName === transitionProperty) { 20 + element.setAttribute('hidden', 'true') 21 + element.removeEventListener('transitionend', listener) 22 + } 23 + } 24 + return { 25 + show() { 26 + element.removeEventListener('transitionend', listener) 27 + element.removeAttribute('hidden') 28 + // Force a browser re-paint 29 + const _reflow = element.offsetHeight 30 + element.classList.add(transitionClass) 31 + }, 32 + hide() { 33 + element.addEventListener('transitionend', listener) 34 + element.classList.remove(transitionClass) 35 + }, 36 + } 37 + } 38 + 39 + function init() { 40 + const button = document.querySelector('button.scroll-up') as HTMLButtonElement 41 + const topHeading = document.querySelector('h1') 42 + const topOffset = topHeading ? topHeading.offsetTop : 0 43 + if (!button) { 44 + console.warn('Scroll up button not found in the document.') 45 + return 46 + } 47 + button.addEventListener('click', () => { 48 + window.scrollTo({ top: topOffset, behavior: 'smooth' }) 49 + }) 50 + // Use IntersectionObserver to show/hide the button 51 + const prose = document.querySelector('article div.prose') 52 + if (!prose) { 53 + console.warn('Prose element not found in the article.') 54 + return 55 + } 56 + 57 + const btnControl = transitionHiddenElement(button, 'opacity', 'active') 58 + 59 + const observer = new IntersectionObserver( 60 + (entries) => { 61 + entries.forEach((entry) => { 62 + if (entry.isIntersecting) { 63 + btnControl.show() 64 + } else { 65 + btnControl.hide() 66 + } 67 + }) 68 + }, 69 + // Only consider the top 5% of the viewport 70 + { rootMargin: `0px 0px -95% 0px` }, 71 + ) 72 + observer.observe(prose) 73 + } 74 + 75 + init() 76 + </script> 77 + 78 + <style> 79 + /* When button appears, slide it in from the bottom */ 80 + button.scroll-up { 81 + /* also add a translate effect */ 82 + transform: translateY(0px); 83 + /* and a transition */ 84 + opacity: 1; 85 + transition: 86 + transform 0.3s ease-in-out, 87 + opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1), 88 + background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1); 89 + } 90 + button.scroll-up:not(.active) { 91 + transform: translateY(10px); 92 + opacity: 0; 93 + } 94 + </style>
+221
src/components/Search.astro
··· 1 + --- 2 + import '@pagefind/default-ui/css/ui.css' 3 + import IconCircleX from '~/icons/circle-x.svg' 4 + import IconSearch from '~/icons/search.svg' 5 + 6 + const { trailingSlashes = false } = Astro.props 7 + --- 8 + 9 + <site-search class="ms-auto" id="search" data-trailing-slashes={trailingSlashes}> 10 + <button 11 + class="hover:text-accent flex cursor-pointer items-center justify-center rounded-md" 12 + aria-keyshortcuts="Control+K Meta+K" 13 + data-open-modal 14 + disabled 15 + > 16 + <IconSearch class="size-6 text-accent" /> 17 + <span class="sr-only">Open Search</span> 18 + </button> 19 + <dialog 20 + aria-label="search" 21 + class="text-foreground! bg-background max-h-5/6 min-h-48 w-7/8 sm:w-5/6 max-w-xl border-double! border-4 border-accent/30 shadow-sm backdrop:backdrop-blur-sm open:flex mx-auto mt-10 sm:mt-16 mb-auto rounded-xl" 22 + > 23 + <div class="dialog-frame flex grow flex-col gap-4 p-6 pt-6 max-w-full"> 24 + <button class="cursor-pointer fixed top-2 right-2 rounded-full" data-close-modal> 25 + <IconCircleX class="size-6 text-accent/50" /> 26 + </button> 27 + { 28 + import.meta.env.DEV ? ( 29 + <div class="mx-auto text-center"> 30 + <p> 31 + Search is only available in production builds. <br /> 32 + Try building and previewing the site to test it out locally. 33 + </p> 34 + </div> 35 + ) : ( 36 + <div class="search-container"> 37 + <div id="pagefind-search" class="max-w-full" /> 38 + </div> 39 + ) 40 + } 41 + </div> 42 + </dialog> 43 + </site-search> 44 + 45 + <style is:global> 46 + :root { 47 + --pagefind-ui-font: inherit; 48 + --pagefind-ui-primary: var(--theme-accent); 49 + --pagefind-ui-text: var(--theme-foreground); 50 + --pagefind-ui-background: var(--theme-background); 51 + --pagefind-ui-border: var(--theme-accent); 52 + --pagefind-ui-border-width: 2px; 53 + } 54 + 55 + .pagefind-ui__results-area { 56 + margin: 16px 0; 57 + } 58 + .pagefind-ui__result { 59 + overflow-x: scroll !important; 60 + } 61 + 62 + .pagefind-ui__result-inner { 63 + max-width: 100% !important; 64 + } 65 + 66 + .pagefind-ui__result-inner mark { 67 + background-color: var(--theme-accent) !important; 68 + color: var(--theme-background) !important; 69 + font-weight: 600 !important; 70 + padding: 0 3px !important; 71 + border-radius: 6px !important; 72 + } 73 + 74 + .pagefind-ui__result-nested .pagefind-ui__result-link:before { 75 + content: '>' !important; 76 + left: -16px !important; 77 + right: unset !important; 78 + color: var(--theme-accent) !important; 79 + font-weight: 600 !important; 80 + } 81 + </style> 82 + 83 + <script> 84 + class SiteSearch extends HTMLElement { 85 + #closeBtn: HTMLButtonElement | null 86 + #dialog: HTMLDialogElement | null 87 + #dialogFrame: HTMLDivElement | null 88 + #openBtn: HTMLButtonElement | null 89 + #controller: AbortController 90 + trailingSlashes: boolean 91 + stripTrailingSlash: (path: string) => string 92 + formatURL: (path: string) => string 93 + 94 + constructor() { 95 + super() 96 + this.#openBtn = this.querySelector<HTMLButtonElement>('button[data-open-modal]') 97 + this.#closeBtn = this.querySelector<HTMLButtonElement>('button[data-close-modal]') 98 + this.#dialog = this.querySelector<HTMLDialogElement>('dialog') 99 + this.#dialogFrame = this.querySelector('.dialog-frame') 100 + this.#controller = new AbortController() 101 + 102 + this.trailingSlashes = this.dataset.trailingSlashes === 'true' ? true : false 103 + this.stripTrailingSlash = (path: string) => path.replace(/(.)\/(#.*)?$/, '$1$2') 104 + this.formatURL = !this.trailingSlashes 105 + ? this.stripTrailingSlash 106 + : (path: string) => path 107 + 108 + // Set up events 109 + if (this.#openBtn) { 110 + this.#openBtn.addEventListener('click', this.openModal) 111 + this.#openBtn.disabled = false 112 + } else { 113 + console.warn('Search button not found') 114 + } 115 + 116 + if (this.#closeBtn) { 117 + this.#closeBtn.addEventListener('click', this.closeModal) 118 + } else { 119 + console.warn('Close button not found') 120 + } 121 + 122 + if (this.#dialog) { 123 + this.#dialog.addEventListener('close', () => { 124 + window.removeEventListener('click', this.onWindowClick) 125 + const body = document.querySelector('body') 126 + body?.classList.remove('overflow-hidden') 127 + }) 128 + } else { 129 + console.warn('Dialog not found') 130 + } 131 + 132 + // only add pagefind in production 133 + if (import.meta.env.DEV) return 134 + const onIdle = window.requestIdleCallback || ((cb) => setTimeout(cb, 1)) 135 + onIdle(async () => { 136 + const { PagefindUI } = await import('@pagefind/default-ui') 137 + 138 + new PagefindUI({ 139 + baseUrl: import.meta.env.BASE_URL, 140 + bundlePath: import.meta.env.BASE_URL.replace(/\/$/, '') + '/pagefind/', 141 + element: '#pagefind-search', 142 + showImages: false, 143 + showSubResults: true, 144 + processResult: (result: { 145 + url: string 146 + sub_results: Array<{ url: string }> 147 + }) => { 148 + // Ensure links in search results match the trailing slashes setting 149 + result.url = this.formatURL(result.url) 150 + 151 + result.sub_results = result.sub_results.map((res) => { 152 + res.url = this.formatURL(res.url) 153 + return res 154 + }) 155 + 156 + return result 157 + }, 158 + }) 159 + }) 160 + } 161 + 162 + connectedCallback() { 163 + // window events, requires cleanup 164 + window.addEventListener('keydown', this.onWindowKeydown, { 165 + signal: this.#controller.signal, 166 + }) 167 + } 168 + 169 + disconnectedCallback() { 170 + this.#controller.abort() 171 + } 172 + 173 + openModal = (event?: MouseEvent) => { 174 + if (!this.#dialog) { 175 + console.warn('Dialog not found') 176 + return 177 + } 178 + 179 + const body = document.querySelector('body') 180 + body?.classList.add('overflow-hidden') 181 + 182 + this.#dialog.showModal() 183 + this.querySelector('input')?.focus() 184 + event?.stopPropagation() 185 + window.addEventListener('click', this.onWindowClick, { 186 + signal: this.#controller.signal, 187 + }) 188 + } 189 + 190 + closeModal = () => { 191 + this.#dialog?.close() 192 + } 193 + 194 + onWindowClick = (event: MouseEvent) => { 195 + // check if it's a link 196 + const isLink = 'href' in (event.target || {}) 197 + // make sure the click is either a link or outside of the dialog 198 + if ( 199 + isLink || 200 + (document.body.contains(event.target as Node) && 201 + !this.#dialogFrame?.contains(event.target as Node)) 202 + ) { 203 + this.closeModal() 204 + } 205 + } 206 + 207 + onWindowKeydown = (e: KeyboardEvent) => { 208 + if (!this.#dialog) { 209 + console.warn('Dialog not found') 210 + return 211 + } 212 + // check if it's the Control+K or ⌘+K shortcut 213 + if ((e.metaKey === true || e.ctrlKey === true) && e.key === 'k') { 214 + this.#dialog.open ? this.closeModal() : this.openModal() 215 + e.preventDefault() 216 + } 217 + } 218 + } 219 + 220 + customElements.define('site-search', SiteSearch) 221 + </script>
+193
src/components/SelectTheme.astro
··· 1 + --- 2 + import '@pagefind/default-ui/css/ui.css' 3 + import IconPalette from '~/icons/palette.svg' 4 + import IconCircleX from '~/icons/circle-x.svg' 5 + import siteConfig from '~/site.config' 6 + 7 + function kebabToTitleCase(str: string): string { 8 + return str 9 + .split('-') // Split the string into words 10 + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) // Capitalize each word 11 + .join(' ') // Join the words with a space 12 + } 13 + --- 14 + 15 + <select-theme class="ms-auto" id="search"> 16 + <button 17 + class="hover:text-accent flex cursor-pointer items-center justify-center rounded-md" 18 + aria-keyshortcuts="Control+K Meta+K" 19 + data-open-modal 20 + disabled 21 + > 22 + <IconPalette class="size-6 text-accent" /> 23 + <span class="sr-only">Select Theme</span> 24 + </button> 25 + <dialog 26 + aria-label="select-theme" 27 + class="text-foreground! bg-background max-h-5/6 max-w-5/6 border-double! border-4 border-accent/30 shadow-sm backdrop:backdrop-blur-sm open:flex mx-auto mt-16 mb-auto rounded-xl" 28 + > 29 + <div class="dialog-frame flex grow flex-col gap-4 px-10 py-1 max-w-full"> 30 + <button 31 + aria-roledescription="close" 32 + class="cursor-pointer fixed top-2 right-2 rounded-full" 33 + data-close-modal 34 + > 35 + <IconCircleX class="size-6 text-accent/50" /> 36 + </button> 37 + <ul 38 + id="theme-change-list" 39 + class="flex flex-col bg-background text-accent m-0 p-2 rounded-xl" 40 + > 41 + { 42 + siteConfig.themes.include.map((theme) => ( 43 + <li> 44 + <button class="w-full rounded-lg py-1 px-2" data-theme={theme}> 45 + {kebabToTitleCase(theme)} 46 + </button> 47 + </li> 48 + )) 49 + } 50 + </ul> 51 + </div> 52 + </dialog> 53 + </select-theme> 54 + 55 + <style> 56 + button.current-theme { 57 + background-color: color-mix(in srgb, var(--theme-accent) 8%, transparent 92%); 58 + } 59 + </style> 60 + 61 + <script> 62 + class SelectTheme extends HTMLElement { 63 + #closeBtn: HTMLButtonElement | null 64 + #dialog: HTMLDialogElement | null 65 + #dialogFrame: HTMLDivElement | null 66 + #openBtn: HTMLButtonElement | null 67 + #controller: AbortController 68 + 69 + constructor() { 70 + super() 71 + this.#openBtn = this.querySelector<HTMLButtonElement>('button[data-open-modal]') 72 + this.#closeBtn = this.querySelector<HTMLButtonElement>('button[data-close-modal]') 73 + this.#dialog = this.querySelector<HTMLDialogElement>('dialog') 74 + this.#dialogFrame = this.querySelector('.dialog-frame') 75 + this.#controller = new AbortController() 76 + 77 + // Set up events 78 + if (this.#openBtn) { 79 + this.#openBtn.addEventListener('click', this.openModal) 80 + this.#openBtn.disabled = false 81 + } else { 82 + console.warn('Select theme button not found') 83 + } 84 + 85 + if (this.#closeBtn) { 86 + this.#closeBtn.addEventListener('click', this.closeModal) 87 + } else { 88 + console.warn('Close button not found') 89 + } 90 + 91 + if (this.#dialog) { 92 + this.#dialog.addEventListener('close', () => { 93 + window.removeEventListener('click', this.onWindowClick) 94 + const body = document.querySelector('body') 95 + body?.classList.remove('overflow-hidden') 96 + }) 97 + } else { 98 + console.warn('Dialog not found') 99 + } 100 + 101 + let themeChangeButtons = this.querySelectorAll('#theme-change-list button') 102 + themeChangeButtons?.forEach((button) => { 103 + button.addEventListener('click', (ev) => { 104 + ev.preventDefault() 105 + let themeId = button.getAttribute('data-theme') 106 + if (themeId) { 107 + document.documentElement.setAttribute('data-theme', themeId) 108 + localStorage.setItem('data-theme', themeId) 109 + this.closeModal() 110 + } 111 + }) 112 + }) 113 + } 114 + 115 + connectedCallback() { 116 + // window events, requires cleanup 117 + window.addEventListener('keydown', this.onWindowKeydown, { 118 + signal: this.#controller.signal, 119 + }) 120 + } 121 + 122 + disconnectedCallback() { 123 + this.#controller.abort() 124 + } 125 + 126 + openModal = (event?: MouseEvent) => { 127 + if (!this.#dialog) { 128 + console.warn('Dialog not found') 129 + return 130 + } 131 + this.highlightCurrentTheme() 132 + const body = document.querySelector('body') 133 + body?.classList.add('overflow-hidden') 134 + this.#dialog.showModal() 135 + event?.stopPropagation() 136 + window.addEventListener('click', this.onWindowClick, { 137 + signal: this.#controller.signal, 138 + }) 139 + } 140 + 141 + closeModal = () => { 142 + this.#dialog?.close() 143 + } 144 + 145 + onWindowClick = (event: MouseEvent) => { 146 + // check if it's a link 147 + const isLink = 'href' in (event.target || {}) 148 + // make sure the click is either a link or outside of the dialog 149 + if ( 150 + isLink || 151 + (document.body.contains(event.target as Node) && 152 + !this.#dialogFrame?.contains(event.target as Node)) 153 + ) { 154 + this.closeModal() 155 + } 156 + } 157 + 158 + onWindowKeydown = (e: KeyboardEvent) => { 159 + if (!this.#dialog) { 160 + console.warn('Dialog not found') 161 + return 162 + } 163 + // check if it's the Control+K or ⌘+K shortcut 164 + if ((e.metaKey === true || e.ctrlKey === true) && e.key === 'k') { 165 + this.#dialog.open ? this.closeModal() : this.openModal() 166 + e.preventDefault() 167 + } 168 + } 169 + 170 + highlightCurrentTheme() { 171 + const currentTheme = document.documentElement.getAttribute('data-theme') 172 + if (!currentTheme) { 173 + console.warn('No theme set in data-theme attribute.') 174 + return 175 + } 176 + const themeChangeListItems = this.querySelectorAll('#theme-change-list li') 177 + themeChangeListItems?.forEach((listItem) => { 178 + let button = listItem.querySelector('button') 179 + if (!button) { 180 + console.warn('No button found in theme change list item.') 181 + return 182 + } 183 + if (button.getAttribute('data-theme') === currentTheme) { 184 + button.classList.add('current-theme') 185 + } else { 186 + button.classList.remove('current-theme') 187 + } 188 + }) 189 + } 190 + } 191 + 192 + customElements.define('select-theme', SelectTheme) 193 + </script>
+25
src/components/SelectThemeLoader.astro
··· 1 + --- 2 + 3 + --- 4 + 5 + <script is:inline> 6 + ;(function loadTheme() { 7 + const pageDefaultTheme = document.documentElement.getAttribute('data-theme') 8 + const pageThemeHash = document.documentElement.getAttribute('data-theme-hash') 9 + if (!pageDefaultTheme || !pageThemeHash) { 10 + throw new Error('Theme attributes are required.') 11 + } 12 + const storedTheme = localStorage.getItem('data-theme') 13 + const storedThemeHash = localStorage.getItem('data-theme-hash') 14 + const themeHashMatches = storedThemeHash === pageThemeHash 15 + if (!storedTheme || !storedThemeHash || !themeHashMatches) { 16 + // Should be the first time loading the website 17 + localStorage.setItem('data-theme', pageDefaultTheme) 18 + localStorage.setItem('data-theme-hash', pageThemeHash) 19 + } 20 + if (themeHashMatches && storedTheme && storedTheme !== pageDefaultTheme) { 21 + // The stored theme is different from the default theme, apply it 22 + document.documentElement.setAttribute('data-theme', storedTheme) 23 + } 24 + })() 25 + </script>
+30
src/components/SeriesSection.astro
··· 1 + --- 2 + import type { CollectionEntry } from 'astro:content' 3 + import { SeriesGroup } from '~/utils' 4 + 5 + interface Props { 6 + posts: CollectionEntry<'posts'>[] 7 + } 8 + 9 + const { posts } = Astro.props 10 + 11 + const seriesGroup = await SeriesGroup.build(posts) 12 + --- 13 + 14 + <ul class="flex flex-wrap gap-x-3 gap-y-4 my-5"> 15 + { 16 + seriesGroup.sortCollationsMostRecent().map((series) => ( 17 + <li> 18 + <a 19 + href={series.url} 20 + class="flex items-start gap-2.5 py-2 pl-4 pr-3 bg-accent/7 rounded-3xl border-transparent hover:border-accent/20 border-1 text-foreground/90" 21 + > 22 + {series.title} 23 + <span class="rounded-full bg-foreground/7 text-foreground/90 px-2 py-1 text-xs font-semibold"> 24 + {series.entries.length} 25 + </span> 26 + </a> 27 + </li> 28 + )) 29 + } 30 + </ul>
+105
src/components/SocialLinks.astro
··· 1 + --- 2 + import type { SocialLinks } from '~/types' 3 + import IconGithub from '~/icons/github.svg' 4 + import IconMastodon from '~/icons/mastodon.svg' 5 + import IconTwitter from '~/icons/twitter.svg' 6 + import IconLinkedin from '~/icons/linkedin.svg' 7 + import IconBluesky from '~/icons/bluesky.svg' 8 + import IconEmail from '~/icons/email.svg' 9 + import IconRss from '~/icons/rss.svg' 10 + 11 + interface Props { 12 + socialLinks: SocialLinks 13 + } 14 + 15 + const { socialLinks } = Astro.props 16 + --- 17 + 18 + <div class="flex w-full max-w-md items-center justify-between"> 19 + { 20 + socialLinks.github && ( 21 + <a 22 + href={socialLinks.github} 23 + target="_blank" 24 + rel="noopener noreferrer" 25 + class="social-link" 26 + > 27 + <span class="sr-only">GitHub</span> 28 + <IconGithub class="size-7" /> 29 + </a> 30 + ) 31 + } 32 + { 33 + socialLinks.mastodon && ( 34 + <a 35 + href={socialLinks.mastodon} 36 + target="_blank" 37 + rel="noopener noreferrer" 38 + class="social-link" 39 + > 40 + <span class="sr-only">Mastodon</span> 41 + <IconMastodon class="size-7" /> 42 + </a> 43 + ) 44 + } 45 + { 46 + socialLinks.twitter && ( 47 + <a 48 + href={socialLinks.twitter} 49 + target="_blank" 50 + rel="noopener noreferrer" 51 + class="social-link" 52 + > 53 + <span class="sr-only">Twitter</span> 54 + <IconTwitter class="size-7" /> 55 + </a> 56 + ) 57 + } 58 + { 59 + socialLinks.linkedin && ( 60 + <a 61 + href={socialLinks.linkedin} 62 + target="_blank" 63 + rel="noopener noreferrer" 64 + class="social-link" 65 + > 66 + <span class="sr-only">LinkedIn</span> 67 + <IconLinkedin class="size-7" /> 68 + </a> 69 + ) 70 + } 71 + { 72 + socialLinks.bluesky && ( 73 + <a 74 + href={socialLinks.bluesky} 75 + target="_blank" 76 + rel="noopener noreferrer" 77 + class="social-link" 78 + > 79 + <span class="sr-only">Bluesky</span> 80 + <IconBluesky class="size-7" /> 81 + </a> 82 + ) 83 + } 84 + { 85 + socialLinks.email && ( 86 + <a 87 + href={`mailto:${socialLinks.email}`} 88 + target="_blank" 89 + rel="noopener noreferrer" 90 + class="social-link" 91 + > 92 + <span class="sr-only">Email</span> 93 + <IconEmail class="size-7" /> 94 + </a> 95 + ) 96 + } 97 + { 98 + socialLinks.rss && ( 99 + <a href="/rss.xml" class="social-link"> 100 + <span class="sr-only">RSS</span> 101 + <IconRss class="size-7" /> 102 + </a> 103 + ) 104 + } 105 + </div>
+54
src/components/TableOfContents.astro
··· 1 + --- 2 + import type { MarkdownHeading } from 'astro' 3 + import TOCHeading from '~/components/TableOfContentsHeading.astro' 4 + 5 + interface Props { 6 + headings: MarkdownHeading[] 7 + } 8 + 9 + const { headings } = Astro.props 10 + 11 + const filteredHeadings = headings.filter(({ depth }) => depth >= 2 && depth <= 3) 12 + --- 13 + 14 + <details 15 + open 16 + class="toc relative md:mx-2 xl:mx-0 text-foreground/90 text-sm bg-foreground/5 xl:bg-transparent px-8 xl:pr-0 py-6 mt-5 xl:mt-0 xl:w-full rounded-xl border-3 xl:border-none border-accent/10 xl:sticky xl:top-10 xl:basis-[274px] 2xl:basis-[320px] xl:order-2 xl:shrink-0 xl:opacity-90" 17 + > 18 + <summary 19 + class="list-none marker:hidden marker:content-[''] before:content-['>'] before:text-accent before:font-semibold before:absolute before:left-3 cursor-pointer" 20 + >Table of Contents</summary 21 + > 22 + <nav class="w-full text-sm xl:-ml-1"> 23 + <ul class="mt-4 flex flex-col max-w-full"> 24 + {filteredHeadings.map((heading) => <TOCHeading heading={heading} />)} 25 + </ul> 26 + </nav> 27 + </details> 28 + 29 + <script> 30 + const anchors = document.querySelectorAll('h2[id], h3[id]') 31 + const links = document.querySelectorAll('details.toc > nav > ul > li') 32 + if (anchors.length === links.length && anchors.length > 0) { 33 + window.addEventListener('scroll', (_event) => { 34 + let scrollTop = window.scrollY 35 + let highlighted = false 36 + // then iterate backwards, on the first match highlight it and break 37 + for (var i = anchors.length - 1; i >= 0; i--) { 38 + const anchor = anchors[i] as HTMLElement 39 + if (!highlighted && scrollTop > anchor.offsetTop - 75) { 40 + links[i].classList.add('active-heading') 41 + highlighted = true 42 + } else { 43 + links[i].classList.remove('active-heading') 44 + } 45 + } 46 + }) 47 + } 48 + </script> 49 + 50 + <style> 51 + details[open] summary:before { 52 + transform: rotate(90deg); 53 + } 54 + </style>
+41
src/components/TableOfContentsHeading.astro
··· 1 + --- 2 + import type { MarkdownHeading } from 'astro' 3 + 4 + interface Props { 5 + heading: MarkdownHeading 6 + } 7 + 8 + const { 9 + heading: { depth, slug, text }, 10 + } = Astro.props 11 + --- 12 + 13 + <li class="flex items-stretch border-foreground/20"> 14 + <div class="flex items-stretch"> 15 + { 16 + Array.from({ length: depth - 1 }, (_v, _k) => ( 17 + <div class="toc-lines flex flex-col items-stretch"> 18 + <span class="top-box w-4 xl:w-3 basis-4 border-b-1 border-foreground/20 xl:border-foreground/15" /> 19 + <span class="bottom-box w-4 min-h-1/2 xl:w-3 flex-1 border-t-1 border-foreground/20 xl:border-foreground/15" /> 20 + </div> 21 + )) 22 + } 23 + </div> 24 + <a 25 + class="inline-block line-clamp-2 ml-3 xl:ml-2 py-1 ps-1 hover:text-accent" 26 + href={`#${slug}`}>{text}</a 27 + > 28 + </li> 29 + 30 + <style> 31 + .toc-lines:first-child span { 32 + border-left-width: 2px; 33 + } 34 + li:last-child .toc-lines:first-child span.bottom-box { 35 + border-left-width: 0 !important; 36 + } 37 + li.active-heading a { 38 + color: var(--theme-accent); 39 + font-weight: 600; 40 + } 41 + </style>
+22
src/components/Tags.astro
··· 1 + --- 2 + import type { Collation } from '~/types' 3 + 4 + interface Props { 5 + tags: Collation<'posts'>[] 6 + } 7 + 8 + const { tags } = Astro.props 9 + --- 10 + 11 + <div class="flex flex-wrap gap-3 text-sm"> 12 + { 13 + tags.map((tag) => ( 14 + <a 15 + href={tag.url} 16 + class="py-1 px-3 bg-accent/1 hover:bg-accent/8 border-1 border-accent/20 text-accent/90 rounded-2xl transition-colors" 17 + > 18 + {tag.title} 19 + </a> 20 + )) 21 + } 22 + </div>
+29
src/components/TagsSection.astro
··· 1 + --- 2 + import type { CollectionEntry } from 'astro:content' 3 + import { TagsGroup } from '~/utils' 4 + 5 + interface Props { 6 + posts: CollectionEntry<'posts'>[] 7 + } 8 + 9 + const { posts } = Astro.props 10 + const tagsGroup = await TagsGroup.build(posts) 11 + --- 12 + 13 + <ul class="flex flex-wrap gap-x-3 gap-y-4 my-5"> 14 + { 15 + tagsGroup.sortCollationsLargest().map((tag) => ( 16 + <li> 17 + <a 18 + href={tag.url} 19 + class="flex items-start gap-2.5 py-2 pl-4 pr-3 bg-accent/7 rounded-3xl border-transparent hover:border-accent/20 border-1 text-foreground/90" 20 + > 21 + {tag.title} 22 + <span class="rounded-full bg-foreground/7 text-foreground/90 px-2 py-1 text-xs font-semibold"> 23 + {tag.entries.length} 24 + </span> 25 + </a> 26 + </li> 27 + )) 28 + } 29 + </ul>
+57
src/content.config.ts
··· 1 + import { defineCollection, z } from 'astro:content' 2 + import { glob } from 'astro/loaders' 3 + 4 + const postsCollection = defineCollection({ 5 + loader: glob({ pattern: ['**/*.md', '**/*.mdx'], base: './src/content/posts' }), 6 + schema: ({ image }) => 7 + z.object({ 8 + title: z.string(), 9 + published: z.coerce.date(), 10 + // updated: z.coerce.date().optional(), 11 + draft: z.boolean().optional().default(false), 12 + description: z.string().optional(), 13 + author: z.string().optional(), 14 + series: z.string().optional(), 15 + tags: z.array(z.string()).optional().default([]), 16 + coverImage: z 17 + .strictObject({ 18 + src: image(), 19 + alt: z.string(), 20 + }) 21 + .optional(), 22 + toc: z.boolean().optional().default(true), 23 + }), 24 + }) 25 + 26 + const homeCollection = defineCollection({ 27 + loader: glob({ pattern: ['home.md', 'home.mdx'], base: './src/content' }), 28 + schema: ({ image }) => 29 + z.object({ 30 + avatarImage: z 31 + .object({ 32 + src: image(), 33 + alt: z.string().optional().default('My avatar'), 34 + }) 35 + .optional(), 36 + // githubCalendar: z.string().optional(), // GitHub username for calendar 37 + }), 38 + }) 39 + 40 + const addendumCollection = defineCollection({ 41 + loader: glob({ pattern: ['addendum.md', 'addendum.mdx'], base: './src/content' }), 42 + schema: ({ image }) => 43 + z.object({ 44 + avatarImage: z 45 + .object({ 46 + src: image(), 47 + alt: z.string().optional().default('My avatar'), 48 + }) 49 + .optional(), 50 + }), 51 + }) 52 + 53 + export const collections = { 54 + posts: postsCollection, 55 + home: homeCollection, 56 + addendum: addendumCollection, 57 + }
+7
src/content/addendum.md
··· 1 + --- 2 + avatarImage: 3 + src: './avatar.jpg' 4 + alt: 'My avatar' 5 + --- 6 + 7 + Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.
src/content/avatar.jpg

This is a binary file and will not be displayed.

+7
src/content/home.md
··· 1 + --- 2 + avatarImage: 3 + src: './avatar.jpg' 4 + alt: 'My avatar' 5 + --- 6 + 7 + Welcome to my website and watch me ramble on and on....
src/content/old-avatar.jpg

This is a binary file and will not be displayed.

+21
src/content/posts/#hello.md#
··· 1 + --- 2 + title: "Hello" 3 + published: 2025-10-30 4 + draft: false 5 + --- 6 + 7 + 8 + 9 + # Hello 10 + 11 + 12 + ## Everyone 13 + 14 + ```python 15 + print("HELLO!") 16 + print("World!") 17 + ``` 18 + :::caution 19 + Use caution while using python 20 + ::: 21 +
+22
src/content/posts/hello.md
··· 1 + --- 2 + title: "Hello" 3 + published: 2025-10-30 4 + draft: false 5 + --- 6 + 7 + 8 + 9 + # Hello 10 + 11 + 12 + ## Everyone 13 + 14 + ```python 15 + print("HELLO!") 16 + print("World!") 17 + ``` 18 + 19 + :::caution 20 + Use caution while using python 21 + ::: 22 +
+20
src/content/posts/hello.md~
··· 1 + --- 2 + title: "Hello" 3 + published: 2025-10-30 4 + draft: false 5 + --- 6 + 7 + 8 + 9 + # Hello 10 + 11 + 12 + ## Everyone 13 + 14 + print("HELLO!") 15 + print("World!") 16 + 17 + :::caution 18 + Use caution while using python 19 + ::: 20 +
+15
src/content/posts/hello.org
··· 1 + #+title: Hello 2 + #+author: Akshit Gaur 3 + #+description: First Blog! 4 + #+TAGS: emacs, org, astro 5 + #+OPTIONS: toc:nil 6 + * Hello 7 + ** Everyone 8 + #+begin_src python 9 + print("HELLO!") 10 + print("World!") 11 + #+end_src 12 + 13 + :::caution 14 + Use caution while using python 15 + :::
+10
src/content/posts/hello.org~
··· 1 + #+title: Hello 2 + #+author: Akshit Gaur 3 + #+DATE: 2025-10-30 4 + #+TAGS: emacs, org, astro 5 + * Hello 6 + ** Everyone 7 + #+begin_src python 8 + print("HELLO!") 9 + print("World!") 10 + #+end_src
+27
src/content/posts/pythons-generators-and-yield.md
··· 1 + --- 2 + title: "Python's Generators and Yield" 3 + published: 2025-07-11 4 + draft: false 5 + description: 'Learn how to use generators and the yield keyword in Python for efficient iteration.' 6 + series: 'Python Basics' 7 + tags: ['python'] 8 + --- 9 + 10 + Generators in Python are a way to create iterators using the `yield` keyword. Here's an example: 11 + 12 + ```python 13 + def count_up_to(n): 14 + count = 1 15 + while count <= n: 16 + yield count 17 + count += 1 18 + 19 + for number in count_up_to(5): 20 + print(number) 21 + ``` 22 + 23 + Generators are memory-efficient and allow you to work with large datasets without loading them entirely into memory. 24 + 25 + ```shell title="Running Python Generators" 26 + python -c "def count_up_to(n):\n count = 1\n while count <= n:\n yield count\n count += 1\nfor number in count_up_to(5):\n print(number)" 27 + ```
src/content/posts/showing-off-blog-features/PixelatedGreenTreeSide.png

This is a binary file and will not be displayed.

src/content/posts/showing-off-blog-features/cover.jpg

This is a binary file and will not be displayed.

+279
src/content/posts/showing-off-blog-features/index.md
··· 1 + --- 2 + title: 'Showing Off Blog Features' 3 + published: 2025-07-20 4 + draft: true 5 + tags: ['astro', 'demo', 'markdown'] 6 + toc: true 7 + coverImage: 8 + src: './cover.jpg' 9 + alt: 'A person with short, thick hair and prescription glasses sits at an organized workstation, using a magnification app to navigate a webpage. Their posture is proper and relaxed. On the desk: a computer, a mouse, a large desk lamp and a small notebook.' 10 + --- 11 + 12 + Since the post does not have a description in the frontmatter, the first paragraph is used. 13 + 14 + ## Theming 15 + 16 + > Use your favorite editor theme for your blog! 17 + 18 + Theming for the website comes from builtin Shiki themes found in Expressive Code. You can view them [here](https://expressive-code.com/guides/themes/#available-themes). A website can have one or more themes, defined in `src/site.config.ts`. There are three theming modes to choose from: 19 + 20 + 1. `single`: Choose a single theme for the website. Simple. 21 + 2. `light-dark-auto`: Choose two themes for the website to use for light and dark mode. The header will include a button for toggling between light/dark/auto. For example, you could choose `github-dark` and `github-light` with a default of `"auto"` and the user's experience will match their operating system theme straight away. 22 + 3. `select`: Choose two or more themes for the website and include a button in the header to change between any of these themes. You could include as many Shiki themes from Expressive Code as you like. Allow users to find their favorite theme! 23 + 24 + > When the user changes the theme, their preference is stored in `localStorage` to persist across page navigation. 25 + 26 + ## Code Blocks 27 + 28 + Let's look at some code block styles: 29 + 30 + ```python 31 + def hello_world(): 32 + print("Hello, world!") 33 + 34 + hello_world() 35 + ``` 36 + 37 + ```python title="hello.py" 38 + def hello_world(): 39 + print("Hello, world!") 40 + 41 + hello_world() 42 + ``` 43 + 44 + ```shell 45 + python hello.py 46 + ``` 47 + 48 + Also some inline code: `1 + 2 = 3`. Or maybe even `(= (+ 1 2) 3)`. 49 + 50 + See the [Expressive Code Docs](https://expressive-code.com/key-features/syntax-highlighting/) for more information on available features like wrapping text, line highlighting, diffs, etc. 51 + 52 + ## Basic Markdown Elements 53 + 54 + - List item 1 55 + - List item 2 56 + 57 + **Bold text** 58 + 59 + _Italic text_ 60 + 61 + ~~Strikethrough text~~ 62 + 63 + [Link](https://www.example.com) 64 + 65 + > In life, as in art, some endings are bittersweet. Especially when it comes to love. Sometimes fate throws two lovers together only to rip them apart. Sometimes the hero finally makes the right choice but the timing is all wrong. And, as they say, timing is everything. 66 + > 67 + > \- Gossip Girl 68 + 69 + | Name | Age | City | 70 + | ------- | --- | ----------- | 71 + | Alice | 30 | New York | 72 + | Bob | 25 | Los Angeles | 73 + | Charlie | 35 | Chicago | 74 + 75 + --- 76 + 77 + ## Images 78 + 79 + Images can include a title string after the URL to render as a `<figure>` with a `<figcaption>`. 80 + 81 + ![Pixel art of a tree](./PixelatedGreenTreeSide.png 'Pixel art renders poorly without proper CSS') 82 + 83 + ```md title="Pixel art markdown" wrap 84 + ![Pixel art of a tree](./PixelatedGreenTreeSide.png 'Pixel art renders poorly without proper CSS') 85 + ``` 86 + 87 + I've also added a special tag for pixel art that adds the correct CSS to render properly. Just add `#pixelated` to the very end of the alt string. 88 + 89 + ![Pixel art of a tree #pixelated](./PixelatedGreenTreeSide.png 'But adding #pixelated to the end of the alt string fixes this') 90 + 91 + ```md title="Pixel art markdown with #pixelated" wrap 92 + ![Pixel art of a tree #pixelated](./PixelatedGreenTreeSide.png 'But adding #pixelated to the end of the alt string fixes this') 93 + ``` 94 + 95 + ## Admonitions 96 + 97 + ```md title="Admonition example in markdown" 98 + :::note 99 + testing123 100 + ::: 101 + ``` 102 + 103 + :::note 104 + testing123 105 + ::: 106 + 107 + :::tip 108 + testing123 109 + ::: 110 + 111 + :::important 112 + testing123 113 + ::: 114 + 115 + :::caution 116 + testing123 117 + ::: 118 + 119 + :::warning 120 + testing123 121 + ::: 122 + 123 + ## Character Chats 124 + 125 + ```md title="Custom character chat" wrap 126 + :::duck 127 + **Did you know?** You can easily create custom character chats for your blog with MultiTerm! 128 + ::: 129 + ``` 130 + 131 + :::duck 132 + **Did you know?** You can easily create custom character chats for your blog with MultiTerm! 133 + ::: 134 + 135 + ### Adding Your Own 136 + 137 + To add your own character, first add an image file to the top-level `/public` directory in your cloned MultiTerm repo. Astro cannot automatically optimize image assets from markdown plugins, so make sure to compress the image to a web-friendly size (<100kb). 138 + 139 + I recommend Google's free [Squoosh](https://squoosh.app) web app for creating super small webp files. The characters here have been resized to 300 pixels wide and exported to webp with 75% quality using Squoosh. 140 + 141 + After you've added your image, update the `characters` option in `site.config.ts` with your newly added image file and restart the development server. 142 + 143 + ### Character Conversations 144 + 145 + When there are multiple character chats in a row, the order of the chat image and chat bubble reverses to give the chat more of a back-and-forth appearance. 146 + 147 + ```md title="Sequential character chats" 148 + :::owl 149 + This is a cool feature! 150 + ::: 151 + 152 + :::unicorn 153 + I agree! 154 + ::: 155 + ``` 156 + 157 + :::owl 158 + This is a cool feature! 159 + ::: 160 + 161 + :::unicorn 162 + I agree! 163 + ::: 164 + 165 + You can specify the alignment (`left` or `right`) to override the default `left, right, left, ...` ordering. 166 + 167 + ```md wrap title="Character chats with specific alignment" 168 + :::unicorn{align="right"} 169 + Over here, to the right! 170 + ::: 171 + ``` 172 + 173 + :::unicorn{align="right"} 174 + Over here, to the right! 175 + ::: 176 + 177 + ## GitHub Cards 178 + 179 + GitHub overview cards heavily inspired by [Astro Cactus](https://github.com/chrismwilliams/astro-theme-cactus). 180 + 181 + ```md title="GitHub repo card example in markdown" 182 + ::github{repo="stelcodes/multiterm-astro"} 183 + ``` 184 + 185 + ::github{repo="stelcodes/multiterm-astro"} 186 + 187 + ```md wrap=true title="GitHub user card example in markdown" 188 + ::github{user="withastro"} 189 + ``` 190 + 191 + ::github{user="withastro"} 192 + 193 + ## Emoji :star_struck: 194 + 195 + Emojis can be added in markdown by including a literal emoji character or a GitHub shortcode. You can browse an unofficial database [here](https://emojibase.dev/emojis?shortcodePresets=github). 196 + 197 + ```md title="Example markdown with GitHub emoji shortcodes" 198 + Good morning! :sleeping: :coffee: :pancakes: 199 + ``` 200 + 201 + Good morning! :sleeping: :coffee: :pancakes: 202 + 203 + > All emojis \(both literal and shortcoded\) are made more accessible by wrapping them in a `span` tag like this: 204 + > 205 + > ```html 206 + > <span role="img" aria-label="coffee">☕️</span> 207 + > ``` 208 + > 209 + > At the time of writing, [emoji v16](https://emojipedia.org/emoji-16.0) is not supported yet. These emojis can be included literally but they do not have shortcodes and will not be wrapped. 210 + 211 + ## LaTeX/KaTeX Math Support 212 + 213 + You can also display inline math via [remark-math and rehype-katex](https://github.com/remarkjs/remark-math). 214 + 215 + ```txt title="Rendering inline math with KaTeX" 216 + Make those equations pretty! $ \frac{a}{b} \cdot b = a $ 217 + ``` 218 + 219 + Make those equations pretty! $ \frac{a}{b} \cdot b = a $ 220 + 221 + Check out the [KaTeX docs](https://katex.org/docs/supported) to learn about the syntax. 222 + 223 + ```md title="Rendering a block of KaTeX" wrap 224 + $$ 225 + a + ar + ar^2 + ar^3 + \dots + ar^{n-1} = \displaystyle\sum_{k=0}^{n - 1}ar^k = a \bigg(\dfrac{1 - r^n}{1 -r}\bigg) 226 + $$ 227 + ``` 228 + 229 + $$ 230 + a + ar + ar^2 + ar^3 + \dots + ar^{n-1} = \displaystyle\sum_{k=0}^{n - 1}ar^k = a \bigg(\dfrac{1 - r^n}{1 -r}\bigg) 231 + $$ 232 + 233 + ## HTML Elements 234 + 235 + <button>A Button</button> 236 + 237 + ### Fieldset with Inputs 238 + 239 + <fieldset> 240 + <input type="text" placeholder="Type something"><br> 241 + <input type="number" placeholder="Insert number"><br> 242 + <input type="text" value="Input value"><br> 243 + <select> 244 + <option value="1">Option 1</option> 245 + <option value="2">Option 2</option> 246 + <option value="3">Option 3</option> 247 + </select><br> 248 + <textarea placeholder="Insert a comment..."></textarea><br> 249 + <label><input type="checkbox"> I understand<br></label> 250 + <button type="submi">Submit</button> 251 + </fieldset> 252 + 253 + ### Form with Labels 254 + 255 + <form> 256 + <label> 257 + <input type="radio" name="fruit" value="apple"> 258 + Apple 259 + </label><br> 260 + 261 + <label> 262 + <input type="radio" name="fruit" value="banana"> 263 + Banana 264 + </label><br> 265 + 266 + <label> 267 + <input type="radio" name="fruit" value="orange"> 268 + Orange 269 + </label><br> 270 + 271 + <label> 272 + <input type="radio" name="fruit" value="grape"> 273 + Grape 274 + </label><br> 275 + 276 + <label> 277 + <input type="checkbox" name="terms" value="agree"> 278 + I agree to the terms and conditions 279 + </label><br>
+5
src/env.d.ts
··· 1 + declare module '@pagefind/default-ui' { 2 + declare class PagefindUI { 3 + constructor(arg: unknown) 4 + } 5 + }
+1
src/icons/bluesky.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6.335 5.144C4.681 3.945 2 3.017 2 5.97c0 .59.35 4.953.556 5.661C3.269 14.094 5.686 14.381 8 14c-4.045.665-4.889 3.208-2.667 5.41C6.363 20.428 7.246 21 8 21c2 0 3.134-2.769 3.5-3.5q.5-1 .5-1.5q0 .5.5 1.5c.366.731 1.5 3.5 3.5 3.5c.754 0 1.637-.571 2.667-1.59C20.889 17.207 20.045 14.664 16 14c2.314.38 4.73.094 5.444-2.369c.206-.708.556-5.072.556-5.661c0-2.953-2.68-2.025-4.335-.826C15.372 6.806 12.905 10.192 12 12c-.905-1.808-3.372-5.194-5.665-6.856"/></svg>
+1
src/icons/chevron-up.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-up-icon lucide-chevron-up"><path d="m18 15-6-6-6 6"/></svg>
+1
src/icons/chevrons-left.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevrons-left-icon lucide-chevrons-left"><path d="m11 17-5-5 5-5"/><path d="m18 17-5-5 5-5"/></svg>
+1
src/icons/chevrons-right.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevrons-right-icon lucide-chevrons-right"><path d="m6 17 5-5-5-5"/><path d="m13 17 5-5-5-5"/></svg>
+1
src/icons/circle-x.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-x-icon lucide-circle-x"><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6"/><path d="m9 9 6 6"/></svg>
+1
src/icons/email.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mail-icon lucide-mail"><path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7"/><rect x="2" y="4" width="20" height="16" rx="2"/></svg>
+1
src/icons/github.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github-icon lucide-github"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"/><path d="M9 18c-4.51 2-5-2-7-2"/></svg>
+1
src/icons/linkedin.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-linkedin-icon lucide-linkedin"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"/><rect width="4" height="12" x="2" y="9"/><circle cx="4" cy="4" r="2"/></svg>
+1
src/icons/mastodon.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M15.5 21.5c-10.5 2.5 -12.5 -2.5 -12.5 -8.5v-3c0 -6 2.5 -7 7 -7h4c4.5 0 7 1.5 7 5.5v4c0 6.5 -10 4 -13.5 4c-1 0 -1.5 7 8 5Z"/><path d="M7 13.5l0 -5.5c0 0 0.5 -2 2.5 -2c2 0 2.5 2 2.5 2l0 2.5l0 -2.5c0 0 0.5 -2 2.5 -2c2 0 2.5 2 2.5 2l0 5.5"/></g></svg>
+1
src/icons/moon.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon-icon lucide-moon"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg>
+1
src/icons/palette.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-palette-icon lucide-palette"><path d="M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z"/><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/></svg>
+1
src/icons/rss.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rss-icon lucide-rss"><path d="M4 11a9 9 0 0 1 9 9"/><path d="M4 4a16 16 0 0 1 16 16"/><circle cx="5" cy="19" r="1"/></svg>
+1
src/icons/search.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search-icon lucide-search"><path d="m21 21-4.34-4.34"/><circle cx="11" cy="11" r="8"/></svg>
+1
src/icons/sun-moon.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun-moon-icon lucide-sun-moon"><path d="M12 2v2"/><path d="M13 8.129A4 4 0 0 1 15.873 11"/><path d="m19 5-1.256 1.256"/><path d="M20 12h2"/><path d="M9 8a5 5 0 1 0 7 7 7 7 0 1 1-7-7"/></svg>
+1
src/icons/sun.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun-icon lucide-sun"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg>
+1
src/icons/twitter.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-twitter-icon lucide-twitter"><path d="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z"/></svg>
+168
src/layouts/Layout.astro
··· 1 + --- 2 + import '~/styles/global.css' 3 + import Header from '~/components/Header.astro' 4 + import Footer from '~/components/Footer.astro' 5 + import LightDarkAutoThemeLoader from '~/components/LightDarkAutoThemeLoader.astro' 6 + import SelectThemeLoader from '~/components/SelectThemeLoader.astro' 7 + import siteConfig from '~/site.config' 8 + import { pick, resolveThemeColorStyles } from '~/utils' 9 + import crypto from 'crypto' 10 + 11 + interface Props { 12 + title?: string 13 + description?: string 14 + tags?: string[] 15 + author?: string 16 + } 17 + 18 + const { title, description, tags, author } = Astro.props 19 + const pageUrl = new URL(Astro.url.pathname, Astro.site).href.replace(/\/$/, '') // Remove trailing slash for consistency 20 + const pageType = Astro.url.pathname.startsWith('/posts') ? 'article' : 'website' 21 + const pageTitle = title ? `${title} - ${siteConfig.title}` : siteConfig.title 22 + const pageDescription = description || siteConfig.description 23 + const pageAuthor = author || siteConfig.author 24 + const pageImage = 25 + pageType === 'article' 26 + ? Astro.url.origin + 27 + Astro.url.pathname.replace(/\/posts\//, '/social-cards/') + 28 + '.png' 29 + : `${Astro.url.origin}/social-cards/__default.png` 30 + const pageKeywords = [ 31 + ...new Set(siteConfig.tags.concat(tags || []).map((word) => word.toLowerCase())), 32 + ].join(', ') 33 + const baseCssVars: { [key: string]: string } = { 34 + 'theme-font': siteConfig.font, 35 + 'ec-frm-frameBoxShdCssVal': 'none', 36 + 'ec-frm-edTabBrdRad': '0', 37 + 'ec-frm-edTabBarBrdCol': 38 + 'color-mix(in srgb, var(--theme-foreground), 10%, transparent)', 39 + 'ec-brdCol': 'color-mix(in srgb, var(--theme-foreground), 10%, transparent)', 40 + } 41 + 42 + let themeMode = siteConfig.themes.mode 43 + if (siteConfig.themes.include.length < 1) { 44 + throw new Error('No themes defined in site.config. Please add at least one theme.') 45 + } 46 + if (themeMode === 'light-dark-auto' && siteConfig.themes.include.length < 2) { 47 + console.warn( 48 + 'Theme mode "dark-light-auto" requires at least two themes. Defaulting to "single".', 49 + ) 50 + themeMode = 'single' 51 + } 52 + let defaultTheme = siteConfig.themes.default || siteConfig.themes.include[0] 53 + let includedThemes = siteConfig.themes.include as string[] 54 + const themeNotIncluded = !includedThemes.includes(defaultTheme) 55 + if ( 56 + (themeMode !== 'light-dark-auto' && themeNotIncluded) || 57 + (themeMode === 'light-dark-auto' && defaultTheme !== 'auto' && themeNotIncluded) 58 + ) { 59 + console.warn( 60 + `Default theme "${defaultTheme}" not found in themes. Using first theme: "${siteConfig.themes.include[0]}".`, 61 + ) 62 + defaultTheme = siteConfig.themes.include[0] 63 + } 64 + let lightTheme = themeMode === 'light-dark-auto' ? includedThemes[0] : undefined 65 + let darkTheme = themeMode === 'light-dark-auto' ? includedThemes[1] : undefined 66 + 67 + // Generate a hash to use for cache busting the theme settings in localStorage. 68 + const themeHash = crypto 69 + .createHash('md5') 70 + .update(themeMode + defaultTheme + includedThemes.join('')) 71 + .digest('hex') 72 + .slice(0, 8) // Truncate to the first 8 characters 73 + 74 + const resolvedThemes = await resolveThemeColorStyles( 75 + siteConfig.themes.include, 76 + siteConfig.themes.overrides, 77 + ) 78 + 79 + let cssLines: string[] = [] 80 + for (const [themeId, themeStyles] of Object.entries(resolvedThemes)) { 81 + const relevantStyles = pick(themeStyles, [ 82 + 'foreground', 83 + 'background', 84 + 'accent', 85 + 'heading1', 86 + 'heading2', 87 + 'heading3', 88 + 'heading4', 89 + 'heading5', 90 + 'heading6', 91 + 'list', 92 + 'italic', 93 + 'link', 94 + 'separator', 95 + 'note', 96 + 'tip', 97 + 'important', 98 + 'caution', 99 + 'warning', 100 + 'blue', 101 + 'green', 102 + 'red', 103 + 'yellow', 104 + 'magenta', 105 + 'cyan', 106 + ]) 107 + cssLines.push(`:root[data-theme="${themeId}"] {`) 108 + for (const [key, value] of Object.entries(relevantStyles)) { 109 + cssLines.push(`--theme-${key}: ${value};`) 110 + } 111 + cssLines.push(`}`) 112 + } 113 + let generatedCss: string = cssLines.join('\n') 114 + --- 115 + 116 + <!doctype html> 117 + <html 118 + lang="en" 119 + data-theme={defaultTheme} 120 + data-dark-theme={darkTheme} 121 + data-light-theme={lightTheme} 122 + data-theme-mode={themeMode} 123 + data-theme-hash={themeHash} 124 + > 125 + <head> 126 + <meta charset="UTF-8" /> 127 + <meta content="width=device-width, initial-scale=1.0" name="viewport" /> 128 + <meta name="generator" content={Astro.generator} /> 129 + <meta name="title" content={pageTitle} /> 130 + <meta name="description" content={pageDescription} /> 131 + <meta name="author" content={pageAuthor} /> 132 + <meta property="og:title" content={pageTitle} /> 133 + <meta property="og:description" content={pageDescription} /> 134 + <meta property="og:url" content={pageUrl} /> 135 + <meta property="og:type" content={pageType} /> 136 + {pageImage && <meta property="og:image" content={pageImage} />} 137 + <meta name="twitter:card" content="summary_large_image" /> 138 + <meta name="twitter:title" content={pageTitle} /> 139 + <meta name="twitter:description" content={pageDescription} /> 140 + {pageImage && <meta name="twitter:image" content={pageImage} />} 141 + <meta name="keywords" content={pageKeywords} /> 142 + <link rel="canonical" href={pageUrl} /> 143 + <link rel="sitemap" href="/sitemap-index.xml" /> 144 + <link rel="icon" href="/favicon.svg" type="image/svg+xml" /> 145 + <link 146 + rel="alternate" 147 + type="application/rss+xml" 148 + title={siteConfig.title} 149 + href={new URL('rss.xml', Astro.site)} 150 + /> 151 + <title>{pageTitle}</title> 152 + <style is:global define:vars={baseCssVars}></style> 153 + <style is:inline set:html={generatedCss}></style> 154 + {themeMode === 'light-dark-auto' && <LightDarkAutoThemeLoader />} 155 + {themeMode === 'select' && <SelectThemeLoader />} 156 + </head> 157 + <body class="w-full h-full m-0 bg-background text-foreground"> 158 + <div 159 + class="flex flex-col max-w-3xl min-h-screen border-accent/10 m-auto p-3 sm:py-5 sm:px-6 md:py-10" 160 + > 161 + <Header /> 162 + <main class="flex flex-col py-1"> 163 + <slot /> 164 + </main> 165 + <Footer /> 166 + </div> 167 + </body> 168 + </html>
+25
src/layouts/MarkdownLayout.astro
··· 1 + --- 2 + import Layout from '~/layouts/Layout.astro' 3 + import type { MarkdownLayoutProps } from 'astro' 4 + 5 + type Props = MarkdownLayoutProps<{ 6 + // Define frontmatter props here 7 + title: string 8 + description?: string 9 + }> 10 + 11 + // Now, `frontmatter`, `url`, and other Markdown layout properties 12 + // are accessible with type safety 13 + const { frontmatter } = Astro.props 14 + --- 15 + 16 + <Layout title={frontmatter.title} description={frontmatter.description}> 17 + <div class="max-w-full py-7.5"> 18 + <h1 class="md:mx-2 mb-3 text-[1.75rem] text-heading1 font-semibold"> 19 + # {frontmatter.title} 20 + </h1> 21 + <div class="mb-5 prose"> 22 + <slot /> 23 + </div> 24 + </div> 25 + </Layout>
+7
src/pages/404.astro
··· 1 + --- 2 + import Layout from '~/layouts/Layout.astro' 3 + --- 4 + 5 + <Layout> 6 + <h1 class="inline-block m-auto p-4 text-accent text-4xl">404</h1> 7 + </Layout>
+6
src/pages/about.md
··· 1 + --- 2 + layout: '~/layouts/MarkdownLayout.astro' 3 + title: About Me 4 + --- 5 + 6 + The laughing kookaburra (Dacelo novaeguineae) is a bird in the kingfisher subfamily Halcyoninae. It is a large robust kingfisher with a whitish head and a brown eye-stripe. The upperparts are mostly dark brown but there is a mottled light-blue patch on the wing coverts. The underparts are cream-white and the tail is barred with rufous and black. The plumage of the male and female birds is similar. The territorial call is a distinctive laugh that is often delivered by several birds at the same time, and is widely used as a stock sound effect in situations that involve a jungle setting.
+219
src/pages/giscus/[theme].css.ts
··· 1 + import { type BundledShikiTheme } from 'astro-expressive-code' 2 + import siteConfig from '~/site.config' 3 + import type { APIContext } from 'astro' 4 + import { resolveThemeColorStyles } from '~/utils' 5 + import Color from 'color' 6 + import type { ColorStyles } from '~/types' 7 + 8 + interface Props { 9 + theme: BundledShikiTheme 10 + colorStyles: ColorStyles 11 + } 12 + 13 + const createCss = (styles: ColorStyles) => { 14 + const muted = (color: string, amount: number) => { 15 + const x = Color(color) 16 + return x.alpha(amount / 100).rgb() 17 + } 18 + const foreground = styles.foreground 19 + const background = styles.background 20 + const link = styles.link 21 + const accent = styles.accent 22 + const comment = styles.comment 23 + const constant = styles.foreground 24 + const entity = styles.entity 25 + const storageModifierImport = foreground 26 + const tag = styles.tag 27 + const keyword = styles.keyword 28 + const string = styles.string 29 + const variable = styles.variable 30 + const brackethighlighterUnmatched = styles.comment 31 + const invalidIllegalText = styles.red 32 + const carriageReturnText = styles.comment 33 + const regexp = styles.regexp 34 + const markupList = foreground 35 + const markupHeading = styles.foreground 36 + const markupItalic = styles.italic 37 + const markupBold = styles.foreground 38 + const changedText = foreground 39 + const ignoredText = styles.comment 40 + const red = styles.red 41 + const green = styles.green 42 + const blue = styles.blue 43 + const yellow = styles.yellow 44 + // const magenta = styles.magenta 45 + // const cyan = styles.cyan 46 + 47 + const altBackground = muted(foreground, 5).mix(Color(background), 0.5).hex() 48 + return ` 49 + /*! 50 + * Modified from GitHub's Dark Dimmed theme, licensed under the MIT License 51 + * Copyright (c) 2018 GitHub Inc. 52 + * https://github.com/primer/primitives/blob/main/LICENSE 53 + */ 54 + 55 + main { 56 + --color-prettylights-syntax-comment: ${comment}; 57 + --color-prettylights-syntax-constant: ${constant}; 58 + --color-prettylights-syntax-entity: ${entity}; 59 + --color-prettylights-syntax-storage-modifier-import: ${storageModifierImport}; 60 + --color-prettylights-syntax-entity-tag: ${tag}; 61 + --color-prettylights-syntax-keyword: ${keyword}; 62 + --color-prettylights-syntax-string: ${string}; 63 + --color-prettylights-syntax-variable: ${variable}; 64 + --color-prettylights-syntax-brackethighlighter-unmatched: ${brackethighlighterUnmatched}; 65 + --color-prettylights-syntax-invalid-illegal-text: ${invalidIllegalText}; 66 + --color-prettylights-syntax-carriage-return-text: ${carriageReturnText}; 67 + --color-prettylights-syntax-string-regexp: ${regexp}; 68 + --color-prettylights-syntax-markup-list: ${markupList}; 69 + --color-prettylights-syntax-markup-heading: ${markupHeading}; 70 + --color-prettylights-syntax-markup-italic: ${markupItalic}; 71 + --color-prettylights-syntax-markup-bold: ${markupBold}; 72 + --color-prettylights-syntax-markup-deleted-text: ${red}; 73 + --color-prettylights-syntax-markup-inserted-text: ${green}; 74 + --color-prettylights-syntax-markup-changed-text: ${changedText}; 75 + --color-prettylights-syntax-markup-ignored-text: ${ignoredText}; 76 + --color-btn-text: ${foreground}; 77 + --color-btn-bg: transparent; 78 + --color-btn-border: ${altBackground}; 79 + --color-btn-shadow: 0 0 transparent; 80 + --color-btn-inset-shadow: 0 0 transparent; 81 + --color-btn-hover-bg: ${muted(accent, 70)}; 82 + --color-btn-hover-border: transparent; 83 + --color-btn-active-bg: ${muted(accent, 70)}; 84 + --color-btn-active-border: transparent; 85 + --color-btn-selected-bg: ${muted(accent, 70)}; 86 + --color-btn-primary-text: ${background}; 87 + --color-btn-primary-bg: ${muted(accent, 80)}; 88 + --color-btn-primary-border: transparent; 89 + --color-btn-primary-shadow: 0 0 transparent; 90 + --color-btn-primary-inset-shadow: 0 0 transparent; 91 + --color-btn-primary-hover-bg: var(--color-btn-primary-bg); 92 + --color-btn-primary-hover-border: var(--color-btn-primary-border); 93 + --color-btn-primary-selected-bg: var(--color-btn-primary-bg); 94 + --color-btn-primary-selected-shadow: 0 0 transparent; 95 + --color-btn-primary-disabled-text: ${background}; 96 + --color-btn-primary-disabled-bg: ${muted(accent, 60)}; 97 + --color-btn-primary-disabled-border: transparent; 98 + --color-action-list-item-default-hover-bg: ${muted(foreground, 4)}; 99 + --color-segmented-control-bg: ${altBackground}; 100 + --color-segmented-control-button-bg: transparent; 101 + --color-segmented-control-button-selected-border: ${muted(accent, 70)}; 102 + --color-fg-default: ${foreground}; 103 + --color-fg-muted: ${muted(foreground, 80)}; 104 + --color-fg-subtle: ${muted(foreground, 70)}; 105 + --color-canvas-default: ${background}; 106 + --color-canvas-overlay: ${altBackground}; 107 + --color-canvas-inset: ${altBackground}; 108 + --color-canvas-subtle: ${background}; 109 + --color-border-default: ${muted(foreground, 20)}; 110 + --color-border-muted: ${muted(foreground, 10)}; 111 + --color-neutral-muted: ${altBackground}; 112 + --color-accent-fg: ${link}; 113 + --color-accent-emphasis: ${muted(accent, 70)}; 114 + --color-accent-muted: var(--color-border-default); 115 + --color-accent-subtle: ${altBackground}; 116 + --color-success-fg: ${green}; 117 + --color-attention-fg: ${yellow}; 118 + --color-attention-muted: ${muted(yellow, 80)}; 119 + --color-attention-subtle: ${muted(yellow, 70)}; 120 + --color-danger-fg: ${red}; 121 + --color-danger-muted: ${muted(red, 80)}; 122 + --color-danger-subtle: ${muted(red, 70)}; 123 + --color-primer-shadow-inset: 0 0 transparent; 124 + --color-scale-gray-7: ${muted(foreground, 50)}; 125 + --color-scale-blue-8: ${blue}; 126 + 127 + /*! Extensions from @primer/css/alerts/flash.scss */ 128 + --color-social-reaction-bg-hover: var(--color-scale-gray-7); 129 + --color-social-reaction-bg-reacted-hover: ${muted(accent, 10)}; 130 + } 131 + 132 + main .pagination-loader-container { 133 + background-image: url("https://github.com/images/modules/pulls/progressive-disclosure-line-dark.svg"); 134 + } 135 + 136 + /*! Custom CSS */ 137 + 138 + textarea::placeholder, 139 + input::placeholder { 140 + color: ${muted(foreground, 80)} !important; 141 + } 142 + 143 + .gsc-reactions-count { 144 + display: none; 145 + } 146 + 147 + .gsc-timeline { 148 + flex-direction: column-reverse; 149 + } 150 + 151 + .gsc-header { 152 + padding-bottom: 1rem; 153 + } 154 + 155 + .gsc-comment-header { 156 + padding-top: 0.75rem !important; 157 + } 158 + 159 + .gsc-comments > .gsc-header { 160 + order: 1; 161 + } 162 + 163 + .gsc-comments > .gsc-comment-box { 164 + order: 2; 165 + margin-bottom: 1rem; 166 + } 167 + 168 + .gsc-replies { 169 + padding-top: 0 !important; 170 + } 171 + 172 + .gsc-comments > .gsc-timeline { 173 + order: 3; 174 + } 175 + 176 + div.gsc-comment-content div.highlight pre { 177 + border-radius: 0.75rem; 178 + border: 1px solid ${muted(foreground, 8)}; 179 + } 180 + 181 + div.gsc-comment-content code { 182 + border-radius: 0.375rem; 183 + } 184 + 185 + .gsc-homepage-bg { 186 + background-color: ${background}; 187 + } 188 + 189 + main .gsc-loading-image { 190 + background-image: url("https://github.githubassets.com/images/mona-loading-dimmed.gif"); 191 + } 192 + ` 193 + } 194 + 195 + export async function GET(context: APIContext) { 196 + const { colorStyles } = context.props as Props 197 + const css = createCss(colorStyles) 198 + return new Response(css, { 199 + headers: { 200 + 'Access-Control-Allow-Origin': 'https://giscus.app', 201 + 'Access-Control-Allow-Methods': 'GET OPTIONS', 202 + 'Cache-Control': 'public, max-age=31536000, immutable', 203 + 'Content-Type': 'text/css', 204 + }, 205 + }) 206 + } 207 + 208 + export async function getStaticPaths() { 209 + const resolvedColorStyles = await resolveThemeColorStyles( 210 + siteConfig.themes.include, 211 + siteConfig.themes.overrides, 212 + ) 213 + return siteConfig.themes.include.map((theme) => { 214 + return { 215 + params: { theme }, 216 + props: { colorStyles: resolvedColorStyles[theme] }, 217 + } 218 + }) 219 + }
+77
src/pages/index.astro
··· 1 + --- 2 + import Layout from '~/layouts/Layout.astro' 3 + import { getSortedPosts } from '~/utils' 4 + import { getCollection, render } from 'astro:content' 5 + import PostPreview from '~/components/PostPreview.astro' 6 + import Pagination from '~/components/Pagination.astro' 7 + import BlockHeader from '~/components/BlockHeader.astro' 8 + import HomeBanner from '~/components/HomeBanner.astro' 9 + import siteConfig from '~/site.config' 10 + import TagsSection from '~/components/TagsSection.astro' 11 + import SeriesSection from '~/components/SeriesSection.astro' 12 + 13 + const home = await getCollection('home') 14 + let HomeContent 15 + let homeAvatarImage 16 + // let homeGithubCalendar 17 + if (home.length > 0) { 18 + const homeEntry = home[0] 19 + const { Content } = await render(homeEntry) 20 + HomeContent = Content 21 + homeAvatarImage = homeEntry.data.avatarImage 22 + // homeGithubCalendar = homeEntry.data.githubCalendar 23 + } 24 + const sortedPosts = await getSortedPosts() 25 + const postsHaveTags = sortedPosts.some( 26 + (post) => post.data.tags && post.data.tags.length > 0, 27 + ) 28 + 29 + const postsHaveSeries = sortedPosts.some((post) => post.data.series) 30 + --- 31 + 32 + <Layout> 33 + { 34 + HomeContent && ( 35 + // <HomeBanner avatarImage={homeAvatarImage} githubCalendar={homeGithubCalendar}> 36 + <HomeBanner avatarImage={homeAvatarImage}> 37 + <HomeContent /> 38 + </HomeBanner> 39 + ) 40 + } 41 + { 42 + postsHaveSeries && ( 43 + <section> 44 + <BlockHeader>Series</BlockHeader> 45 + <SeriesSection posts={sortedPosts} /> 46 + </section> 47 + ) 48 + } 49 + { 50 + postsHaveTags && ( 51 + <section> 52 + <BlockHeader>Tags</BlockHeader> 53 + <TagsSection posts={sortedPosts} /> 54 + </section> 55 + ) 56 + } 57 + { 58 + sortedPosts.length > 0 && ( 59 + <section> 60 + <BlockHeader>Latest Posts</BlockHeader> 61 + {sortedPosts 62 + .reverse() 63 + .slice(0, Math.floor(siteConfig.pageSize / 2)) 64 + .map((post) => ( 65 + <PostPreview post={post} /> 66 + ))} 67 + <Pagination nextLink="/posts" nextText="Archive" /> 68 + </section> 69 + ) 70 + } 71 + </Layout> 72 + 73 + <style is:global> 74 + a.heading-anchor { 75 + display: none !important; 76 + } 77 + </style>
+31
src/pages/posts/[...page].astro
··· 1 + --- 2 + import type { GetStaticPaths } from 'astro' 3 + import Layout from '~/layouts/Layout.astro' 4 + import { getSortedPosts } from '~/utils' 5 + import Pagination from '~/components/Pagination.astro' 6 + import siteConfig from '~/site.config' 7 + import PostPreview from '~/components/PostPreview.astro' 8 + import PageHeader from '~/components/PageHeader.astro' 9 + 10 + // Note: Pagination like '/', '/2', '/3' only works with spread param like [...page] 11 + export const getStaticPaths = (async ({ paginate }) => { 12 + const sortedPosts = await getSortedPosts() 13 + return paginate(sortedPosts.reverse(), { pageSize: siteConfig.pageSize }) 14 + }) satisfies GetStaticPaths 15 + 16 + const { page } = Astro.props 17 + const pageTitle = 'Archive' + (page.currentPage > 1 ? ` - Page ${page.currentPage}` : '') 18 + --- 19 + 20 + <Layout title={pageTitle} description="All posts in the archive"> 21 + <div class="mt-2 sm:mt-0"> 22 + <PageHeader /> 23 + {page.data.map((post) => <PostPreview post={post} />)} 24 + <Pagination 25 + prevLink={page.url.prev ? page.url.prev : undefined} 26 + prevText="Newer Posts" 27 + nextLink={page.url.next ? page.url.next : undefined} 28 + nextText="Older Posts" 29 + /> 30 + </div> 31 + </Layout>
+153
src/pages/posts/[slug].astro
··· 1 + --- 2 + import type { GetStaticPaths } from 'astro' 3 + import Layout from '~/layouts/Layout.astro' 4 + import { SeriesGroup, TagsGroup, getSortedPosts } from '~/utils' 5 + import PostPreview from '~/components/PostPreview.astro' 6 + import DividerText from '~/components/DividerText.astro' 7 + import { getCollection, render, type CollectionEntry } from 'astro:content' 8 + import PostAddendum from '~/components/PostAddendum.astro' 9 + import TableOfContents from '~/components/TableOfContents.astro' 10 + import { Image } from 'astro:assets' 11 + import GiscusLoader from '~/components/GiscusLoader.astro' 12 + import siteConfig from '~/site.config' 13 + import Tags from '~/components/Tags.astro' 14 + import PostInfo from '~/components/PostInfo.astro' 15 + import ScrollUpButton from '~/components/ScrollUpButton.astro' 16 + import type { Collation } from '~/types' 17 + import ChevronsRight from '~/icons/chevrons-right.svg' 18 + import { getPostSequenceContext } from '~/utils' 19 + 20 + export const getStaticPaths = (async () => { 21 + const posts = await getSortedPosts() 22 + return posts.map((post) => { 23 + // Get sequence context for the post 24 + const { prev, next } = getPostSequenceContext(post, posts) 25 + return { 26 + params: { slug: post.id }, 27 + props: { post, prev, next }, 28 + } 29 + }) 30 + }) satisfies GetStaticPaths 31 + 32 + const { post, prev, next } = Astro.props 33 + const postData = post.data 34 + const { headings, Content: PostContent } = await render(post) 35 + const addendum = await getCollection('addendum') 36 + let AddendumContent 37 + let addendumAvatarImage 38 + if (addendum.length > 0) { 39 + const addendumEntry = addendum[0] 40 + const { Content } = await render(addendumEntry) 41 + AddendumContent = Content 42 + addendumAvatarImage = addendumEntry.data.avatarImage 43 + } 44 + 45 + const sortedPosts = await getSortedPosts() 46 + 47 + // Get series posts if this post is part of a series 48 + let series: Collation<'posts'> | undefined 49 + let nextPostInSeries: CollectionEntry<'posts'> | undefined 50 + if (postData.series) { 51 + const seriesGroup = await SeriesGroup.build(sortedPosts) 52 + series = seriesGroup.match(postData.series) 53 + if (!series) { 54 + // This should not happen if series data is correct 55 + throw new Error(`Series "${postData.series}" not found`) 56 + } 57 + const sequenceContext = getPostSequenceContext(post, series.entries) 58 + nextPostInSeries = sequenceContext.next 59 + } 60 + const showSeries = series && series.entries.length > 1 61 + 62 + let tags: Collation<'posts'>[] | undefined 63 + if (postData.tags && postData.tags.length > 0) { 64 + const tagsGroup = await TagsGroup.build(sortedPosts) 65 + tags = tagsGroup.matchMany(postData.tags) 66 + } 67 + --- 68 + 69 + <Layout 70 + title={postData.title} 71 + description={postData.description} 72 + author={postData.author} 73 + tags={postData.tags} 74 + > 75 + <article class="max-w-full py-7.5" data-pagefind-body> 76 + { 77 + postData.coverImage && ( 78 + <Image 79 + priority 80 + layout="constrained" 81 + src={postData.coverImage.src} 82 + alt={postData.coverImage.alt} 83 + class="w-full rounded-xl mb-5" 84 + /> 85 + ) 86 + } 87 + <div class="md:mx-2"> 88 + <h1 id={post.id} class="mb-4 text-[1.75rem] text-heading1 font-semibold"> 89 + # {postData.title} 90 + </h1> 91 + <div class="my-2 border-l-2 border-accent/80 pl-4 py-2"> 92 + <PostInfo post={post} class="mb-1" /> 93 + { 94 + tags && ( 95 + <div class="mt-4"> 96 + <Tags tags={tags} /> 97 + </div> 98 + ) 99 + } 100 + </div> 101 + </div> 102 + <!-- <hr class="border-accent/10 border-2 rounded-xl hidden lg:block" /> --> 103 + <div class="flex flex-col xl:gap-1 2xl:gap-18 xl:flex-row xl:items-start"> 104 + {postData.toc && headings.length > 0 && <TableOfContents headings={headings} />} 105 + <div class="mb-5 xl:min-w-full 2xl:min-w-full prose"> 106 + <PostContent /> 107 + </div> 108 + </div> 109 + </article> 110 + { 111 + nextPostInSeries && ( 112 + <a 113 + href={`/posts/${nextPostInSeries.id}`} 114 + class="button justify-center -mt-8 mb-8 !whitespace-normal text-center flex gap-2 sm:gap-3 items-center" 115 + > 116 + <span>Next: {nextPostInSeries.data.title}</span> 117 + <ChevronsRight class="size-5 hidden sm:block" /> 118 + </a> 119 + ) 120 + } 121 + { 122 + AddendumContent && ( 123 + <PostAddendum avatarImage={addendumAvatarImage}> 124 + <AddendumContent /> 125 + </PostAddendum> 126 + ) 127 + } 128 + { 129 + showSeries && series ? ( 130 + <section> 131 + <DividerText text={`${series.title} Series`} /> 132 + {series.entries.map((seriesPost) => ( 133 + <PostPreview post={seriesPost} /> 134 + ))} 135 + </section> 136 + ) : prev || next ? ( 137 + <section> 138 + <DividerText text="More Posts" /> 139 + {prev && <PostPreview post={prev} />} 140 + {next && <PostPreview post={next} />} 141 + </section> 142 + ) : null 143 + } 144 + { 145 + siteConfig.giscus && ( 146 + <section> 147 + <DividerText text="Comments" /> 148 + <GiscusLoader /> 149 + </section> 150 + ) 151 + } 152 + <ScrollUpButton /> 153 + </Layout>
+13
src/pages/robots.txt.ts
··· 1 + import type { APIRoute } from 'astro' 2 + 3 + const getRobotsTxt = (sitemapURL: URL) => `\ 4 + User-agent: * 5 + Allow: / 6 + 7 + Sitemap: ${sitemapURL.href} 8 + ` 9 + 10 + export const GET: APIRoute = ({ site }) => { 11 + const sitemapURL = new URL('sitemap-index.xml', site) 12 + return new Response(getRobotsTxt(sitemapURL)) 13 + }
+35
src/pages/rss.xml.ts
··· 1 + import rss from '@astrojs/rss' 2 + import siteConfig from '~/site.config' 3 + import type { AstroGlobal } from 'astro' 4 + import { getSortedPosts } from '~/utils' 5 + import sanitizeHtml from 'sanitize-html' 6 + import MarkdownIt from 'markdown-it' 7 + const parser = new MarkdownIt() 8 + 9 + // https://docs.astro.build/en/recipes/rss/ 10 + export async function GET(_context: AstroGlobal) { 11 + if (!siteConfig.site) { 12 + console.warn( 13 + 'Site URL is required for RSS feed generation. Skipping RSS feed generation.', 14 + ) 15 + return 16 + } 17 + const posts = await getSortedPosts() 18 + return rss({ 19 + stylesheet: '/rss.xsl', 20 + title: siteConfig.title, 21 + description: siteConfig.description, 22 + site: siteConfig.site, 23 + items: posts.map((post) => ({ 24 + title: post.data.title, 25 + pubDate: post.data.published, 26 + description: post.data.description, 27 + author: post.data.author || siteConfig.author, 28 + link: `/posts/${post.id}`, 29 + content: sanitizeHtml(parser.render(post.body || ''), { 30 + allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']), 31 + }), 32 + })), 33 + trailingSlash: false, 34 + }) 35 + }
+29
src/pages/series/[slug].astro
··· 1 + --- 2 + import type { GetStaticPaths } from 'astro' 3 + import Layout from '~/layouts/Layout.astro' 4 + import { SeriesGroup } from '~/utils' 5 + import PageHeader from '~/components/PageHeader.astro' 6 + import PostPreview from '~/components/PostPreview.astro' 7 + 8 + export const getStaticPaths = (async () => { 9 + const seriesGroup = await SeriesGroup.build() 10 + return seriesGroup.collations.map((series) => { 11 + return { 12 + params: { slug: series.titleSlug }, 13 + props: { posts: series.entries, seriesTitle: series.title }, 14 + } 15 + }) 16 + }) satisfies GetStaticPaths 17 + 18 + const { posts, seriesTitle } = Astro.props 19 + --- 20 + 21 + <Layout 22 + title={`Series: ${seriesTitle}`} 23 + description={`All posts in the ${seriesTitle} series`} 24 + > 25 + <div class="mt-2 sm:mt-0"> 26 + <PageHeader titlePieces={['series', seriesTitle]} /> 27 + {posts.map((post) => <PostPreview post={post} />)} 28 + </div> 29 + </Layout>
+109
src/pages/social-cards/[slug].png.ts
··· 1 + import siteConfig from '~/site.config' 2 + import { Resvg } from '@resvg/resvg-js' 3 + import type { APIContext, InferGetStaticPropsType } from 'astro' 4 + import satori, { type SatoriOptions } from 'satori' 5 + import { html } from 'satori-html' 6 + import { dateString, getSortedPosts, resolveThemeColorStyles } from '~/utils' 7 + import path from 'path' 8 + import fs from 'fs' 9 + import type { ReactNode } from 'react' 10 + 11 + // Load the font file as binary data 12 + const fontPath = path.resolve( 13 + './node_modules/@expo-google-fonts/jetbrains-mono/400Regular/JetBrainsMono_400Regular.ttf', 14 + ) 15 + const fontData = fs.readFileSync(fontPath) // Reads the file as a Buffer 16 + 17 + const avatarPath = path.resolve(siteConfig.socialCardAvatarImage) 18 + let avatarData: Buffer | undefined 19 + let avatarBase64: string | undefined 20 + if ( 21 + fs.existsSync(avatarPath) && 22 + (path.extname(avatarPath).toLowerCase() === '.jpg' || 23 + path.extname(avatarPath).toLowerCase() === '.jpeg') 24 + ) { 25 + avatarData = fs.readFileSync(avatarPath) 26 + avatarBase64 = `data:image/jpeg;base64,${avatarData.toString('base64')}` 27 + } 28 + 29 + const defaultTheme = 30 + siteConfig.themes.default === 'auto' 31 + ? siteConfig.themes.include[0] 32 + : siteConfig.themes.default 33 + 34 + const themeStyles = await resolveThemeColorStyles( 35 + [defaultTheme], 36 + siteConfig.themes.overrides, 37 + ) 38 + const bg = themeStyles[defaultTheme]?.background 39 + const fg = themeStyles[defaultTheme]?.foreground 40 + const accent = themeStyles[defaultTheme]?.accent 41 + 42 + if (!bg || !fg || !accent) { 43 + throw new Error(`Theme ${defaultTheme} does not have required colors`) 44 + } 45 + 46 + const ogOptions: SatoriOptions = { 47 + // debug: true, 48 + fonts: [ 49 + { 50 + data: fontData, 51 + name: 'JetBrains Mono', 52 + style: 'normal', 53 + weight: 400, 54 + }, 55 + ], 56 + height: 630, 57 + width: 1200, 58 + } 59 + 60 + const markup = (title: string, pubDate: string | undefined, author: string) => 61 + html(`<div tw="flex flex-col max-w-full justify-center h-full bg-[${bg}] text-[${fg}] p-12"> 62 + <div style="border-width: 12px; border-radius: 80px;" tw="flex items-center max-w-full p-8 border-[${accent}]/30"> 63 + ${ 64 + avatarBase64 65 + ? `<div tw="flex flex-col justify-center items-center w-1/3 h-100"> 66 + <img src="${avatarBase64}" tw="flex w-full rounded-full border-[${accent}]/30" /> 67 + </div>` 68 + : '' 69 + } 70 + <div tw="flex flex-1 flex-col max-w-full justify-center items-center"> 71 + ${pubDate ? `<p tw="text-3xl max-w-full text-[${accent}]">${pubDate}</p>` : ''} 72 + <h1 tw="text-6xl my-14 text-center leading-snug">${title}</h1> 73 + ${author !== title ? `<p tw="text-4xl text-[${accent}]">${author}</p>` : ''} 74 + </div> 75 + </div> 76 + </div>`) 77 + 78 + type Props = InferGetStaticPropsType<typeof getStaticPaths> 79 + 80 + export async function GET(context: APIContext) { 81 + const { pubDate, title, author } = context.props as Props 82 + const svg = await satori(markup(title, pubDate, author) as ReactNode, ogOptions) 83 + const png = new Resvg(svg).render().asPng() 84 + return new Response(png, { 85 + headers: { 86 + 'Cache-Control': 'public, max-age=31536000, immutable', 87 + 'Content-Type': 'image/png', 88 + }, 89 + }) 90 + } 91 + 92 + export async function getStaticPaths() { 93 + const posts = await getSortedPosts() 94 + return posts 95 + .map((post) => ({ 96 + params: { slug: post.id }, 97 + props: { 98 + pubDate: post.data.published ? dateString(post.data.published) : undefined, 99 + title: post.data.title, 100 + author: post.data.author || siteConfig.author, 101 + }, 102 + })) 103 + .concat([ 104 + { 105 + params: { slug: '__default' }, 106 + props: { pubDate: undefined, title: siteConfig.title, author: siteConfig.author }, 107 + }, 108 + ]) 109 + }
+40
src/pages/tags/[tag]/[...page].astro
··· 1 + --- 2 + import type { GetStaticPaths } from 'astro' 3 + import Layout from '~/layouts/Layout.astro' 4 + import { TagsGroup } from '~/utils' 5 + import Pagination from '~/components/Pagination.astro' 6 + import siteConfig from '~/site.config' 7 + import PostPreview from '~/components/PostPreview.astro' 8 + import PageHeader from '~/components/PageHeader.astro' 9 + 10 + // Note: Pagination like '/', '/2', '/3' only works with spread param like [...page] 11 + export const getStaticPaths = (async ({ paginate }) => { 12 + const tagsGroup = await TagsGroup.build() 13 + const pages = tagsGroup.collations.flatMap((tags) => { 14 + // Use flatMap to lift the posts for each tag into a single array 15 + return paginate(tags.entries.reverse(), { 16 + props: { tagTitle: tags.title }, 17 + params: { tag: tags.titleSlug }, 18 + pageSize: siteConfig.pageSize, 19 + }) 20 + }) 21 + return pages 22 + }) satisfies GetStaticPaths 23 + 24 + const { page, tagTitle } = Astro.props 25 + const pageTitle = 26 + `Tag: ${tagTitle}` + (page.currentPage > 1 ? ` - Page ${page.currentPage}` : '') 27 + --- 28 + 29 + <Layout title={pageTitle} description={`All posts tagged with ${tagTitle}`}> 30 + <div class="mt-2 sm:mt-0"> 31 + <PageHeader titlePieces={['tags', tagTitle]} /> 32 + {page.data.map((post) => <PostPreview post={post} />)} 33 + <Pagination 34 + prevLink={page.url.prev ? encodeURI(page.url.prev) : undefined} 35 + prevText="Newer Posts" 36 + nextLink={page.url.next ? encodeURI(page.url.next) : undefined} 37 + nextText="Older Posts" 38 + /> 39 + </div> 40 + </Layout>
+19
src/plugins/rehype-pixelated.ts
··· 1 + import { visit } from 'unist-util-visit' 2 + import type { Plugin } from 'unified' 3 + import type { Root } from 'hast' 4 + 5 + const plugin: Plugin<[], Root> = () => { 6 + return function transformer(tree) { 7 + visit(tree, 'element', (el) => { 8 + if (el.tagName === 'img') { 9 + const alt = el.properties?.alt 10 + if (alt && typeof alt === 'string' && alt.endsWith('#pixelated')) { 11 + el.properties['data-pixelated'] = true 12 + el.properties.alt = alt.substring(0, alt.length - '#pixelated'.length).trim() 13 + } 14 + } 15 + }) 16 + } 17 + } 18 + 19 + export default plugin
+34
src/plugins/rehype-title-figure.ts
··· 1 + import type * as hast from 'hast' 2 + import type { RehypePlugin } from '@astrojs/markdown-remark' 3 + import { h } from 'hastscript' 4 + 5 + export const rehypeTitleFigure: RehypePlugin = (_options?) => { 6 + function buildFigure(el: hast.Element) { 7 + const title = `${el.properties?.title || ''}` 8 + if (!title) return el 9 + const figure = h('figure', [h('img', { ...el.properties }), h('figcaption', title)]) 10 + return figure 11 + } 12 + function isElement(content: hast.RootContent): content is hast.Element { 13 + return content.type === 'element' 14 + } 15 + function transformTree(node: hast.Root | hast.Element) { 16 + if (node.children) { 17 + node.children = node.children.map((child) => { 18 + if (isElement(child)) { 19 + if (child.tagName === 'img') { 20 + return buildFigure(child) 21 + } else { 22 + transformTree(child) // Recursively process child nodes 23 + } 24 + } 25 + return child 26 + }) 27 + } 28 + } 29 + return function (tree: hast.Root) { 30 + transformTree(tree) // Start the recursive transformation 31 + } 32 + } 33 + 34 + export default rehypeTitleFigure
+73
src/plugins/remark-admonitions.ts
··· 1 + import type { PhrasingContent, Root } from 'mdast' 2 + import { toString as mdastToString } from 'mdast-util-to-string' 3 + import type { Plugin } from 'unified' 4 + import { visit } from 'unist-util-visit' 5 + import type { AdmonitionType } from '~/types' 6 + import { h as _h, type Properties } from 'hastscript' 7 + import type { Paragraph as P } from 'mdast' 8 + 9 + /** From Astro Starlight: Function that generates an mdast HTML tree ready for conversion to HTML by rehype. */ 10 + function h(el: string, attrs: Properties = {}, children: any[] = []): P { 11 + const { properties, tagName } = _h(el, attrs) 12 + return { 13 + children, 14 + data: { hName: tagName, hProperties: properties }, 15 + type: 'paragraph', 16 + } 17 + } 18 + 19 + // Supported admonition types 20 + const Admonitions = new Set<AdmonitionType>([ 21 + 'tip', 22 + 'note', 23 + 'important', 24 + 'caution', 25 + 'warning', 26 + ]) 27 + 28 + /** Checks if a string is a supported admonition type. */ 29 + function isAdmonition(s: string): s is AdmonitionType { 30 + return Admonitions.has(s as AdmonitionType) 31 + } 32 + 33 + export const remarkAdmonitions: Plugin<[], Root> = () => (tree) => { 34 + visit(tree, (node, index, parent) => { 35 + if (!parent || index === undefined || node.type !== 'containerDirective') return 36 + 37 + const admonitionType = node.name 38 + if (!isAdmonition(admonitionType)) return 39 + 40 + let title: string = admonitionType 41 + let titleNode: PhrasingContent[] = [{ type: 'text', value: title }] 42 + 43 + // Check if there's a custom title 44 + const firstChild = node.children[0] 45 + if ( 46 + firstChild?.type === 'paragraph' && 47 + firstChild.data && 48 + 'directiveLabel' in firstChild.data && 49 + firstChild.children.length > 0 50 + ) { 51 + titleNode = firstChild.children 52 + title = mdastToString(firstChild.children) 53 + // The first paragraph contains a custom title, we can safely remove it. 54 + node.children.splice(0, 1) 55 + } 56 + 57 + // Do not change prefix to AD, ADM, or similar, adblocks will block the content inside. 58 + const admonition = h( 59 + 'aside', 60 + { 61 + 'aria-label': title, 62 + class: 'admonition', 63 + 'data-admonition-type': admonitionType, 64 + }, 65 + [ 66 + h('p', { class: 'admonition-title', 'aria-hidden': 'true' }, [...titleNode]), 67 + h('div', { class: 'admonition-content' }, node.children), 68 + ], 69 + ) 70 + 71 + parent.children[index] = admonition 72 + }) 73 + }
+62
src/plugins/remark-character-dialogue.ts
··· 1 + import type { Root } from 'mdast' 2 + import type { Plugin } from 'unified' 3 + import { visit } from 'unist-util-visit' 4 + import { h as _h, type Properties } from 'hastscript' 5 + import type { Paragraph as P } from 'mdast' 6 + 7 + /** From Astro Starlight: Function that generates an mdast HTML tree ready for conversion to HTML by rehype. */ 8 + function h(el: string, attrs: Properties = {}, children: any[] = []): P { 9 + const { properties, tagName } = _h(el, attrs) 10 + return { 11 + children, 12 + data: { hName: tagName, hProperties: properties }, 13 + type: 'paragraph', 14 + } 15 + } 16 + 17 + const remarkCharacterDialogue: Plugin<[{ characters: Record<string, string> }], Root> = 18 + (opts) => (tree) => { 19 + // Type guard to check if a string is a valid character dialogue key 20 + function isCharacterDialogue(s: string): s is keyof typeof opts.characters { 21 + return opts.characters.hasOwnProperty(s) && opts.characters[s] !== undefined 22 + } 23 + 24 + // Do nothing if no characters are defined 25 + if (!opts.characters || Object.keys(opts.characters).length === 0) { 26 + return 27 + } 28 + 29 + visit(tree, (node, index, parent) => { 30 + if (!parent || index === undefined || node.type !== 'containerDirective') return 31 + 32 + const characterName = node.name 33 + if (!isCharacterDialogue(characterName)) return 34 + 35 + const align = node.attributes?.align ?? null 36 + const alignClass = align === 'left' || align === 'right' ? ` align-${align}` : '' 37 + 38 + // Do not change prefix to AD, ADM, or similar, adblocks will block the content inside. 39 + const admonition = h( 40 + 'aside', 41 + { 42 + 'aria-label': `Character dialogue: ${characterName}`, 43 + class: 'character-dialogue' + alignClass, 44 + 'data-character': characterName, 45 + }, 46 + [ 47 + h('img', { 48 + class: 'character-dialogue-image', 49 + alt: characterName, 50 + loading: 'lazy', 51 + src: opts.characters[characterName], 52 + width: 100, 53 + }), 54 + h('div', { class: 'character-dialogue-content' }, node.children), 55 + ], 56 + ) 57 + 58 + parent.children[index] = admonition 59 + }) 60 + } 61 + 62 + export default remarkCharacterDialogue
+43
src/plugins/remark-description.ts
··· 1 + import type * as mdast from 'mdast' 2 + import type { RemarkPlugin } from '@astrojs/markdown-remark' 3 + import { toString } from 'mdast-util-to-string' 4 + 5 + const remarkDescription: RemarkPlugin = (options?: { maxChars?: number }) => { 6 + const maxChars = (options && options.maxChars) || 200 7 + return function (tree, { data }) { 8 + function findFirstParagraph( 9 + node: mdast.Root | mdast.RootContent, 10 + ): string | undefined { 11 + if ('children' in node && Array.isArray(node.children)) { 12 + for (const child of node.children) { 13 + if ( 14 + child.type === 'paragraph' && 15 + child.children.length > 0 && 16 + child.children[0].type !== 'image' 17 + ) { 18 + const s = toString(child).trim() 19 + if (s.length > 0) { 20 + return s 21 + } 22 + } else { 23 + const result = findFirstParagraph(child) 24 + if (result) { 25 + return result 26 + } 27 + } 28 + } 29 + } 30 + return undefined 31 + } 32 + let description = data.astro?.frontmatter?.description || findFirstParagraph(tree) 33 + if (description && data.astro?.frontmatter) { 34 + if (description.length > maxChars) { 35 + const lastSpace = description.slice(0, maxChars).lastIndexOf(' ') 36 + description = description.slice(0, lastSpace) + '…' 37 + } 38 + data.astro.frontmatter.description = description 39 + } 40 + } 41 + } 42 + 43 + export default remarkDescription
+44
src/plugins/remark-gemoji.ts
··· 1 + import type { Root, Text } from 'mdast' 2 + import type { Plugin } from 'unified' 3 + import { nameToEmoji, emojiToName } from 'gemoji' 4 + import emojiRegex from 'emoji-regex' 5 + import { findAndReplace } from 'mdast-util-find-and-replace' 6 + 7 + function emojiSpan(emojiLiteral: string, emojiDescription: string): Text { 8 + return { 9 + type: 'text', 10 + value: emojiLiteral, 11 + data: { 12 + hName: 'span', 13 + hProperties: { role: 'img', ariaLabel: emojiDescription.replace(/_/g, ' ') }, 14 + hChildren: [{ type: 'text', value: emojiLiteral }], 15 + }, 16 + } 17 + } 18 + 19 + /** 20 + * Plugin to replace emoji shortcodes with their corresponding emoji characters. 21 + * It uses the `gemoji` package to map shortcode names to emoji characters. 22 + */ 23 + const plugin: Plugin<[], Root> = () => (tree) => { 24 + findAndReplace(tree, [ 25 + [ 26 + /:(\+1|[-\w]+):/g, 27 + (_: string, emojiShortcode: string) => { 28 + return Object.hasOwn(nameToEmoji, emojiShortcode) 29 + ? emojiSpan(nameToEmoji[emojiShortcode], emojiShortcode) 30 + : false 31 + }, 32 + ], 33 + [ 34 + emojiRegex(), 35 + (emojiLiteral: string) => { 36 + return Object.hasOwn(emojiToName, emojiLiteral) 37 + ? emojiSpan(emojiLiteral, emojiToName[emojiLiteral]) 38 + : false 39 + }, 40 + ], 41 + ]) 42 + } 43 + 44 + export default plugin
+159
src/plugins/remark-github-card.ts
··· 1 + import type { Root, RootContent } from 'mdast' 2 + import type { Plugin } from 'unified' 3 + import type { Directives } from 'mdast-util-directive' 4 + import type { Node, Paragraph as P } from 'mdast' 5 + import { h as _h, type Properties } from 'hastscript' 6 + 7 + /** Checks if a node is a directive. */ 8 + function isNodeDirective(node: Node): node is Directives { 9 + return ( 10 + node.type === 'containerDirective' || 11 + node.type === 'leafDirective' || 12 + node.type === 'textDirective' 13 + ) 14 + } 15 + 16 + /** From Astro Starlight: Function that generates an mdast HTML tree ready for conversion to HTML by rehype. */ 17 + function h(el: string, attrs: Properties = {}, children: any[] = []): P { 18 + const { properties, tagName } = _h(el, attrs) 19 + return { 20 + children: children.filter((child) => !!child), 21 + data: { hName: tagName, hProperties: properties }, 22 + type: 'paragraph', 23 + } 24 + } 25 + 26 + const DIRECTIVE_NAME = 'github' 27 + const USER_AGENT = 'nodejs' 28 + // 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:137.0) Gecko/20100101 Firefox/137.0', 29 + 30 + export const remarkGithubCard: Plugin<[], Root> = () => async (tree) => { 31 + tree.children = await Promise.all( 32 + tree.children.map(async (node): Promise<RootContent> => { 33 + if (!isNodeDirective(node)) return node 34 + 35 + // We only want a leaf directive named DIRECTIVE_NAME 36 + if (node.type !== 'leafDirective' || node.name !== DIRECTIVE_NAME) return node 37 + 38 + let repoName = node.attributes?.repo ?? node.attributes?.user ?? null 39 + if (!repoName) return node // Leave the directive as-is if no repo is provided 40 + 41 + repoName = repoName.endsWith('/') ? repoName.slice(0, -1) : repoName // Remove trailing slash 42 + repoName = repoName.startsWith('https://github.com/') 43 + ? repoName.replace('https://github.com/', '') 44 + : repoName // Remove leading URL 45 + 46 + const repoParts = repoName.split('/') 47 + const realUrl = `https://github.com/${repoName}` 48 + 49 + // If its a repo link 50 + if (repoParts.length > 1) { 51 + const res = await fetch(`https://api.github.com/repos/${repoName}`, { 52 + headers: { 53 + 'User-Agent': USER_AGENT, 54 + }, 55 + }) 56 + if (!res || res.status !== 200) { 57 + throw new Error(`Fetching GitHub repo data for "${repoName}" failed`) 58 + } 59 + const data = await res.json() 60 + const description = data.description 61 + ? data.description.replace(/:[a-zA-Z0-9_]+:/g, '') 62 + : undefined 63 + const backgroundImage = data.owner?.avatar_url 64 + const language = data.language 65 + const forks = Intl.NumberFormat(undefined, { 66 + notation: 'compact', 67 + maximumFractionDigits: 1, 68 + }) 69 + .format(data.forks) 70 + .replaceAll('\u202f', '') 71 + const stars = Intl.NumberFormat(undefined, { 72 + notation: 'compact', 73 + maximumFractionDigits: 1, 74 + }) 75 + .format(data.stargazers_count) 76 + .replaceAll('\u202f', '') 77 + const license = data.license?.spdx_id 78 + 79 + return h('div', { class: 'github-card' }, [ 80 + h('div', { class: 'gh-title' }, [ 81 + h('span', { 82 + class: 'gh-avatar', 83 + style: `background-image: url('${backgroundImage}')`, 84 + }), 85 + h('a', { class: 'gh-text', href: realUrl }, [ 86 + { type: 'text', value: `${repoParts[0]}/${repoParts[1]}` }, 87 + ]), 88 + h('span', { class: 'gh-icon' }), 89 + ]), 90 + description && 91 + h('div', { class: 'gh-description' }, [ 92 + { 93 + type: 'text', 94 + value: description, 95 + }, 96 + ]), 97 + h('div', { class: 'gh-chips' }, [ 98 + h('span', { class: 'gh-stars' }, [{ type: 'text', value: stars }]), 99 + h('span', { class: 'gh-forks' }, [{ type: 'text', value: forks }]), 100 + license && 101 + h('span', { class: 'gh-license' }, [{ type: 'text', value: license }]), 102 + language && 103 + h('span', { class: 'gh-language' }, [{ type: 'text', value: language }]), 104 + ]), 105 + ]) 106 + } 107 + 108 + // If its a user link 109 + else if (repoParts.length === 1) { 110 + const res = await fetch(`https://api.github.com/users/${repoName}`, { 111 + headers: { 112 + 'User-Agent': USER_AGENT, 113 + }, 114 + }) 115 + if (!res || res.status !== 200) { 116 + throw new Error(`Fetching GitHub user data for "${repoName}" failed`) 117 + } 118 + const data = await res.json() 119 + const backgroundImage = data.avatar_url 120 + const followers = Intl.NumberFormat(undefined, { 121 + notation: 'compact', 122 + maximumFractionDigits: 1, 123 + }) 124 + .format(data.followers) 125 + .replaceAll('\u202f', '') 126 + const repositories = Intl.NumberFormat(undefined, { 127 + notation: 'compact', 128 + maximumFractionDigits: 1, 129 + }) 130 + .format(data.public_repos) 131 + .replaceAll('\u202f', '') 132 + const region = data.location 133 + 134 + return h('div', { class: 'github-card' }, [ 135 + h('div', { class: 'gh-title' }, [ 136 + h('span', { 137 + class: 'gh-avatar', 138 + style: `background-image: url('${backgroundImage}')`, 139 + }), 140 + h('a', { class: 'gh-text', href: realUrl }, [ 141 + { type: 'text', value: repoParts[0] }, 142 + ]), 143 + h('span', { class: 'gh-icon' }), 144 + ]), 145 + h('div', { class: 'gh-chips' }, [ 146 + h('span', { class: 'gh-followers' }, [{ type: 'text', value: followers }]), 147 + h('span', { class: 'gh-repositories' }, [ 148 + { type: 'text', value: repositories }, 149 + ]), 150 + region && 151 + h('span', { class: 'gh-region' }, [{ type: 'text', value: region }]), 152 + ]), 153 + ]) 154 + } 155 + 156 + return node 157 + }), 158 + ) 159 + }
+17
src/plugins/remark-reading-time.ts
··· 1 + import type { RemarkPlugin } from '@astrojs/markdown-remark' 2 + import getReadingTime from 'reading-time' 3 + import { toString } from 'mdast-util-to-string' 4 + 5 + const remarkReadingTime: RemarkPlugin = (_options?) => { 6 + return function (tree, { data }) { 7 + if (data.astro?.frontmatter) { 8 + const textOnPage = toString(tree) 9 + const readingTime = getReadingTime(textOnPage) 10 + // readingTime.text will give us minutes read as a friendly string, 11 + // i.e. "3 min read" 12 + data.astro.frontmatter.minutesRead = readingTime.text 13 + } 14 + } 15 + } 16 + 17 + export default remarkReadingTime
+52
src/plugins/remark-unknown-directives.ts
··· 1 + import type { Parent, Root } from 'mdast' 2 + import type { LeafDirective, TextDirective } from 'mdast-util-directive' 3 + import { directiveToMarkdown } from 'mdast-util-directive' 4 + import { toMarkdown } from 'mdast-util-to-markdown' 5 + import type { Plugin } from 'unified' 6 + import { visit } from 'unist-util-visit' 7 + import { h as _h } from 'hastscript' 8 + import type { Node } from 'mdast' 9 + import type { Directives } from 'mdast-util-directive' 10 + 11 + /** Checks if a node is a directive. */ 12 + function isNodeDirective(node: Node): node is Directives { 13 + return ( 14 + node.type === 'containerDirective' || 15 + node.type === 'leafDirective' || 16 + node.type === 'textDirective' 17 + ) 18 + } 19 + 20 + /** 21 + * From Astro Starlight: 22 + * Transforms directives not supported back to original form as it can break user content and result in 'broken' output. 23 + */ 24 + function transformUnhandledDirective( 25 + node: LeafDirective | TextDirective, 26 + index: number, 27 + parent: Parent, 28 + ) { 29 + const textNode = { 30 + type: 'text', 31 + value: toMarkdown(node, { extensions: [directiveToMarkdown()] }), 32 + } as const 33 + if (node.type === 'textDirective') { 34 + parent.children[index] = textNode 35 + } else { 36 + parent.children[index] = { 37 + children: [textNode], 38 + type: 'paragraph', 39 + } 40 + } 41 + } 42 + 43 + const remarkUnknownAdmonitions: Plugin<[], Root> = () => (tree) => { 44 + visit(tree, (node, index, parent) => { 45 + if (!parent || index === undefined || !isNodeDirective(node)) return 46 + if (node.type === 'textDirective' || node.type === 'leafDirective') { 47 + transformUnhandledDirective(node, index, parent) 48 + } 49 + }) 50 + } 51 + 52 + export default remarkUnknownAdmonitions
+185
src/site.config.ts
··· 1 + import type { SiteConfig } from '~/types' 2 + 3 + const config: SiteConfig = { 4 + // Absolute URL to the root of your published site, used for generating links and sitemaps. 5 + site: 'https://multiterm.stelclementine.com', 6 + // The name of your site, used in the title and for SEO. 7 + title: 'Gaur', 8 + // The description of your site, used for SEO and RSS feed. 9 + description: 10 + 'Blog feed of an up-and-coming coder', 11 + // The author of the site, used in the footer, SEO, and RSS feed. 12 + author: 'Akshit Gaur', 13 + // Keywords for SEO, used in the meta tags. 14 + tags: ['Operating Systems', 'rust', 'python', 'machine learning', 'nix', 'guix', 'linux'], 15 + // Path to the image used for generating social media previews. 16 + // Needs to be a square JPEG file due to limitations of the social card generator. 17 + // Try https://squoosh.app/ to easily convert images to JPEG. 18 + socialCardAvatarImage: './src/content/avatar.jpg', 19 + // Font imported from @fontsource or elsewhere, used for the entire site. 20 + // To change this see src/styles/global.css and import a different font. 21 + font: 'JetBrains Mono Variable', 22 + // For pagination, the number of posts to display per page. 23 + // The homepage will display half this number in the "Latest Posts" section. 24 + pageSize: 6, 25 + // Whether Astro should resolve trailing slashes in URLs or not. 26 + // This value is used in the astro.config.mjs file and in the "Search" component to make sure pagefind links match this setting. 27 + // It is not recommended to change this, since most links existing in the site currently do not have trailing slashes. 28 + trailingSlashes: false, 29 + // The navigation links to display in the header. 30 + navLinks: [ 31 + { 32 + name: 'Home', 33 + url: '/', 34 + }, 35 + { 36 + name: 'About', 37 + url: '/about', 38 + }, 39 + { 40 + name: 'Archive', 41 + url: '/posts', 42 + }, 43 + { 44 + name: 'Codeberg', 45 + url: 'https://codeberg.org/akshitgaur2005/', 46 + external: true, 47 + }, 48 + ], 49 + // The theming configuration for the site. 50 + themes: { 51 + // The theming mode. One of "single" | "select" | "light-dark-auto". 52 + mode: 'select', 53 + // The default theme identifier, used when themeMode is "select" or "light-dark-auto". 54 + // Make sure this is one of the themes listed in `themes` or "auto" for "light-dark-auto" mode. 55 + default: 'catppuccin-mocha', 56 + // Shiki themes to bundle with the site. 57 + // https://expressive-code.com/guides/themes/#using-bundled-themes 58 + // These will be used to theme the entire site along with syntax highlighting. 59 + // To use light-dark-auto mode, only include a light and a dark theme in that order. 60 + // include: [ 61 + // 'github-light', 62 + // 'github-dark', 63 + // ] 64 + include: [ 65 + 'andromeeda', 66 + 'aurora-x', 67 + 'ayu-dark', 68 + 'catppuccin-frappe', 69 + 'catppuccin-latte', 70 + 'catppuccin-macchiato', 71 + 'catppuccin-mocha', 72 + 'dark-plus', 73 + 'dracula', 74 + 'dracula-soft', 75 + 'everforest-dark', 76 + 'everforest-light', 77 + 'github-dark', 78 + 'github-dark-default', 79 + 'github-dark-dimmed', 80 + 'github-dark-high-contrast', 81 + 'github-light', 82 + 'github-light-default', 83 + 'github-light-high-contrast', 84 + 'gruvbox-dark-hard', 85 + 'gruvbox-dark-medium', 86 + 'gruvbox-dark-soft', 87 + 'gruvbox-light-hard', 88 + 'gruvbox-light-medium', 89 + 'gruvbox-light-soft', 90 + 'houston', 91 + 'kanagawa-dragon', 92 + 'kanagawa-lotus', 93 + 'kanagawa-wave', 94 + 'laserwave', 95 + 'light-plus', 96 + 'material-theme', 97 + 'material-theme-darker', 98 + 'material-theme-lighter', 99 + 'material-theme-ocean', 100 + 'material-theme-palenight', 101 + 'min-dark', 102 + 'min-light', 103 + 'monokai', 104 + 'night-owl', 105 + 'nord', 106 + 'one-dark-pro', 107 + 'one-light', 108 + 'plastic', 109 + 'poimandres', 110 + 'red', 111 + 'rose-pine', 112 + 'rose-pine-dawn', 113 + 'rose-pine-moon', 114 + 'slack-dark', 115 + 'slack-ochin', 116 + 'snazzy-light', 117 + 'solarized-dark', 118 + 'solarized-light', 119 + 'synthwave-84', 120 + 'tokyo-night', 121 + 'vesper', 122 + 'vitesse-black', 123 + 'vitesse-dark', 124 + 'vitesse-light', 125 + ], 126 + // Optional overrides for specific themes to customize colors. 127 + // Their values can be either a literal color (hex, rgb, hsl) or another theme key. 128 + // See themeKeys list in src/types.ts for available keys to override and reference. 129 + overrides: { 130 + // Improve readability for aurora-x theme 131 + // 'aurora-x': { 132 + // background: '#292929FF', 133 + // foreground: '#DDDDDDFF', 134 + // warning: '#FF7876FF', 135 + // important: '#FF98FFFF', 136 + // note: '#83AEFFFF', 137 + // }, 138 + // Make the GitHub dark theme a little cuter 139 + // 'github-light': { 140 + // accent: 'magenta', 141 + // heading1: 'magenta', 142 + // heading2: 'magenta', 143 + // heading3: 'magenta', 144 + // heading4: 'magenta', 145 + // heading5: 'magenta', 146 + // heading6: 'magenta', 147 + // separator: 'magenta', 148 + // link: 'list', 149 + // }, 150 + }, 151 + }, 152 + // Social links to display in the footer. 153 + socialLinks: { 154 + github: 'https://codeberg.org/akshitgaur2005/', 155 + //github: 'https://github.com/akshitgaur2005', 156 + email: 'mailto:akshitgaur@proton.me', 157 + linkedin: 'https://www.linkedin.com/in/akshit-gaur-a602902a6/', 158 + rss: true, // Set to true to include an RSS feed link in the footer 159 + }, 160 + // Configuration for Giscus comments. 161 + // To set up Giscus, follow the instructions at https://giscus.app/ 162 + // You'll need a GitHub repository with discussions enabled and the Giscus app installed. 163 + // Take the values from the generated script tag at https://giscus.app and fill them in here. 164 + // IMPORTANT: Update giscus.json in the root of the project with your own website URL 165 + // If you don't want to use Giscus, set this to undefined. 166 + // giscus: { 167 + // repo: 'stelcodes/multiterm-astro', 168 + // repoId: 'R_kgDOPNnBig', 169 + // category: 'Giscus', 170 + // categoryId: 'DIC_kwDOPNnBis4CteOc', 171 + // reactionsEnabled: true, // Enable reactions on post itself 172 + // }, 173 + giscus: undefined, 174 + // These are characters available for the character chat feature. 175 + // To add your own character, add an image file to the top-level `/public` directory 176 + // Make sure to compress the image to a web-friendly size (<100kb) 177 + // Try using the excellent https://squoosh.app web app for creating small webp files 178 + characters: { 179 + owl: '/owl.webp', 180 + unicorn: '/unicorn.webp', 181 + duck: '/duck.webp', 182 + }, 183 + } 184 + 185 + export default config
+612
src/styles/global.css
··· 1 + @import 'tailwindcss'; 2 + @import 'katex/dist/katex.css'; 3 + 4 + /* https://fontsource.org/fonts/jetbrains-mono/install */ 5 + /* jetbrains-mono-latin-wght-normal */ 6 + @font-face { 7 + font-family: 'JetBrains Mono Variable'; 8 + font-style: normal; 9 + font-display: swap; 10 + font-weight: 100 800; 11 + src: url(@fontsource-variable/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2) 12 + format('woff2-variations'); 13 + unicode-range: 14 + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, 15 + U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 16 + } 17 + 18 + @theme { 19 + --color-accent: var(--theme-accent); 20 + --color-foreground: var(--theme-foreground); 21 + --color-background: var(--theme-background); 22 + --color-heading1: var(--theme-heading1); 23 + --color-heading2: var(--theme-heading2); 24 + --color-heading3: var(--theme-heading3); 25 + --color-heading4: var(--theme-heading4); 26 + --color-heading5: var(--theme-heading5); 27 + --color-heading6: var(--theme-heading6); 28 + --color-list: var(--theme-list); 29 + --color-link: var(--theme-link); 30 + --color-separator: var(--theme-separator); 31 + --color-note: var(--theme-note); 32 + --color-tip: var(--theme-tip); 33 + --color-important: var(--theme-important); 34 + --color-caution: var(--theme-caution); 35 + --color-warning: var(--theme-warning); 36 + --color-blue: var(--theme-blue); 37 + --color-green: var(--theme-green); 38 + --color-red: var(--theme-red); 39 + --color-yellow: var(--theme-yellow); 40 + --color-magenta: var(--theme-magenta); 41 + --color-cyan: var(--theme-cyan); 42 + --default-font-family: var(--theme-font), monospace; 43 + --default-mono-font-family: var(--theme-font), monospace; 44 + } 45 + 46 + header { 47 + view-transition-name: none; 48 + } 49 + 50 + @view-transition { 51 + navigation: auto; 52 + } 53 + 54 + * { 55 + /* Custom scrollbar styles */ 56 + scrollbar-width: thin; 57 + scrollbar-color: color-mix(in oklab, var(--theme-accent) 20%, transparent) transparent; 58 + } 59 + 60 + html { 61 + /* Slightly more accented scrollbar for better visibility */ 62 + scrollbar-color: color-mix(in oklab, var(--theme-accent) 30%, transparent) transparent !important; 63 + /* Prevents layout from jumping when opening theme select or search dialog menus */ 64 + scrollbar-gutter: stable; 65 + scroll-behavior: smooth; 66 + } 67 + 68 + body { 69 + @apply transition-colors; 70 + font-display: block; 71 + font-size-adjust: from-font var(--theme-font); 72 + } 73 + 74 + input:focus-visible, 75 + textarea:focus-visible, 76 + select:focus-visible, 77 + button:focus-visible, 78 + a:focus-visible, 79 + input:active, 80 + textarea:active, 81 + select:active, 82 + button:active { 83 + @apply outline-1 outline-accent outline-offset-2; 84 + } 85 + 86 + a, 87 + button { 88 + @apply hover:cursor-pointer; 89 + } 90 + 91 + a { 92 + @apply underline-offset-2; 93 + } 94 + 95 + a.button { 96 + @apply inline-flex text-accent border-3 border-accent/30 border-double py-1.5 px-3 whitespace-nowrap hover:bg-accent/8 rounded-xl transition-colors; 97 + } 98 + 99 + header button, 100 + header input { 101 + @apply !outline-none; 102 + } 103 + 104 + button { 105 + @apply cursor-pointer; 106 + } 107 + 108 + article img { 109 + @apply block max-w-full border-8 border-foreground/10 rounded-xl overflow-hidden mx-auto; 110 + 111 + &[data-pixelated] { 112 + image-rendering: pixelated; 113 + } 114 + } 115 + 116 + .prose { 117 + @apply text-base/7; 118 + 119 + code:not(.expressive-code code) { 120 + @apply text-sm text-foreground/90 bg-foreground/5 px-2 py-1 rounded-lg whitespace-nowrap; 121 + } 122 + 123 + & > *:not(div.expressive-code, img, figure, video, hr, blockquote, aside), 124 + figcaption { 125 + @apply md:mx-2; 126 + } 127 + 128 + div.expressive-code { 129 + @apply my-8; 130 + 131 + --ec-codeFontFml: var(--default-mono-font-family); 132 + 133 + /* Prevent italics in code blocks */ 134 + /* Feel free to remove this if you want italics */ 135 + div.code span { 136 + font-style: normal !important; 137 + } 138 + 139 + div.copy { 140 + --button-spacing: 9px; 141 + 142 + button { 143 + @apply hidden sm:flex; 144 + --code-background: var(--theme-background); 145 + } 146 + } 147 + 148 + figure { 149 + @apply border-2 border-foreground/8 !rounded-xl; 150 + box-shadow: none !important; 151 + 152 + &.has-title div.copy, 153 + &.is-terminal div.copy { 154 + --button-spacing: 28px; 155 + } 156 + 157 + &.has-title.is-terminal { 158 + span.title { 159 + @apply !px-15; 160 + } 161 + --button-spacing: 30px !important; 162 + } 163 + 164 + figcaption { 165 + border-radius: 10px 10px 0 0 !important; 166 + background: transparent !important; 167 + padding-block: 0 !important; 168 + border: none !important; 169 + 170 + &::after, 171 + &::before { 172 + border: none !important; 173 + } 174 + 175 + span.title { 176 + @apply !text-foreground/90 !bg-foreground/8 text-center !border-b-2 !border-t-0 !border-r-0 !border-l-0 !border-foreground/10; 177 + width: 100%; 178 + font-family: var(--theme-font); 179 + font-size: var(--ec-codeFontSize); 180 + border-radius: 10px 10px 0 0 !important; 181 + border-bottom-width: 0 !important; 182 + padding: 0 12px !important; 183 + 184 + &::after, 185 + &::before { 186 + border: none !important; 187 + } 188 + } 189 + } 190 + 191 + & > pre { 192 + border-radius: 10px !important; 193 + border: none !important; 194 + scrollbar-width: thin; 195 + background: transparent !important; 196 + } 197 + } 198 + } 199 + 200 + blockquote, 201 + aside { 202 + div.expressive-code { 203 + @apply my-3; 204 + } 205 + } 206 + 207 + h1, 208 + h2, 209 + h3, 210 + h4, 211 + h5, 212 + h6 { 213 + @apply my-6.5 font-semibold; 214 + 215 + a { 216 + @apply underline-offset-3 text-inherit no-underline; 217 + } 218 + } 219 + 220 + h1 { 221 + @apply text-[1.75rem] text-heading1 mt-8; 222 + 223 + &::before { 224 + @apply mr-2 content-['#']; 225 + } 226 + 227 + .heading-anchor svg { 228 + @apply size-5.5; 229 + } 230 + } 231 + 232 + h2 { 233 + @apply text-[1.6rem] text-heading2 mt-12; 234 + 235 + &::before { 236 + @apply mr-2 content-['##']; 237 + } 238 + 239 + .heading-anchor svg { 240 + @apply size-5.5; 241 + } 242 + } 243 + 244 + h3 { 245 + @apply text-2xl text-heading3 mt-10; 246 + 247 + &::before { 248 + @apply mr-2 content-['###']; 249 + } 250 + 251 + .heading-anchor svg { 252 + @apply size-5; 253 + } 254 + } 255 + 256 + h4 { 257 + @apply text-2xl text-heading4 mt-8; 258 + 259 + &::before { 260 + @apply mr-2 content-['####']; 261 + } 262 + 263 + .heading-anchor svg { 264 + @apply size-5; 265 + } 266 + } 267 + 268 + h5 { 269 + @apply text-lg text-heading5; 270 + 271 + &::before { 272 + @apply mr-2 content-['#####']; 273 + } 274 + 275 + .heading-anchor svg { 276 + @apply size-4.5; 277 + } 278 + } 279 + 280 + h6 { 281 + @apply text-lg text-heading6; 282 + 283 + &::before { 284 + @apply mr-2 content-['######']; 285 + } 286 + 287 + .heading-anchor svg { 288 + @apply size-4.5; 289 + } 290 + } 291 + 292 + p, 293 + ul, 294 + ol, 295 + img, 296 + figure, 297 + video, 298 + table, 299 + blockquote, 300 + aside, 301 + .github-card { 302 + @apply my-6.5; 303 + } 304 + 305 + b, 306 + strong, 307 + th, 308 + button { 309 + @apply font-semibold; 310 + } 311 + 312 + a { 313 + @apply text-link underline hover:underline; 314 + 315 + &.heading-anchor { 316 + text-decoration: none; 317 + color: inherit; 318 + 319 + &:hover { 320 + text-decoration: underline; 321 + } 322 + } 323 + } 324 + 325 + button { 326 + @apply font-bold text-center text-accent py-1 px-4.5 border-4 border-accent rounded-xl cursor-pointer hover:bg-accent/15 transition-colors; 327 + } 328 + 329 + figure:not(.expressive-code figure) { 330 + @apply block mx-auto rounded-xl py-2; 331 + 332 + figcaption { 333 + @apply text-center italic; 334 + } 335 + } 336 + 337 + ul, 338 + ol { 339 + @apply pl-8 sm:pl-9.5; 340 + } 341 + 342 + li { 343 + @apply pl-2 my-4 marker:text-list; 344 + } 345 + 346 + ul li { 347 + list-style-type: '-'; 348 + } 349 + 350 + ol li { 351 + @apply list-decimal; 352 + } 353 + 354 + hr { 355 + @apply h-0.5 my-16 bg-separator border-none rounded-xl; 356 + } 357 + 358 + blockquote, 359 + aside { 360 + @apply px-7 md:px-6 rounded-xl py-6; 361 + 362 + & > *:not(div.expressive-code, img, figure, video, hr), 363 + figcaption { 364 + @apply md:mx-2; 365 + } 366 + 367 + p:first-child { 368 + @apply mt-0; 369 + } 370 + 371 + p:last-child { 372 + @apply mb-0; 373 + } 374 + } 375 + 376 + blockquote { 377 + @apply relative bg-foreground/5 before:content-['>'] before:block before:absolute before:text-accent before:font-bold before:left-3; 378 + } 379 + 380 + aside { 381 + @apply bg-foreground/7; 382 + 383 + &.character-dialogue { 384 + @apply sm:bg-transparent flex items-center sm:items-start justify-center sm:justify-start gap-3 py-4 px-2 md:px-5; 385 + 386 + &:has(+ aside.character-dialogue) { 387 + @apply mb-4 sm:mb-0 sm:pb-0; 388 + } 389 + 390 + & + aside.character-dialogue:nth-of-type(even):not(.align-left), 391 + &.align-right { 392 + @apply flex-row-reverse; 393 + 394 + .character-dialogue-content:after { 395 + @apply -right-3 -rotate-90; 396 + left: initial; 397 + } 398 + } 399 + 400 + & + aside.character-dialogue { 401 + @apply mt-4 sm:mt-3 sm:pt-0; 402 + } 403 + 404 + img.character-dialogue-image { 405 + @apply m-0 border-none shrink-1 w-20 sm:w-25; 406 + } 407 + 408 + .character-dialogue-content { 409 + @apply relative shrink-5 sm:bg-foreground/6 px-1 mx-1.5 sm:px-6 sm:mt-0.5 rounded-xl sm:py-6 max-w-full sm:min-w-1/8; 410 + 411 + /* Add pointy part of speech bubble to the bottom left corner */ 412 + &:after { 413 + @apply hidden sm:block absolute top-8 -left-3 rotate-90 w-0 h-0 border-l-8 border-r-8 border-t-8 border-l-transparent border-r-transparent border-t-foreground/6; 414 + content: ''; 415 + } 416 + } 417 + } 418 + 419 + p.admonition-title { 420 + @apply mb-2 inline-block font-semibold relative ml-6.5 md:ml-8.5; 421 + 422 + &:before { 423 + @apply size-4 bg-blue -left-6 top-1.5 absolute; 424 + content: ''; 425 + mask-size: contain; 426 + mask-position: center; 427 + mask-repeat: no-repeat; 428 + } 429 + } 430 + 431 + p:not(.admonition-title):first-child { 432 + @apply mt-0; 433 + } 434 + 435 + &[data-admonition-type='note'] { 436 + @apply bg-note/7; 437 + 438 + p.admonition-title { 439 + @apply text-note; 440 + } 441 + 442 + p.admonition-title:before { 443 + @apply bg-note; 444 + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'%3E%3C/path%3E%3C/svg%3E"); 445 + } 446 + } 447 + 448 + &[data-admonition-type='tip'] { 449 + @apply bg-tip/7; 450 + 451 + p.admonition-title { 452 + @apply text-tip; 453 + } 454 + 455 + p.admonition-title:before { 456 + @apply bg-tip; 457 + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z'%3E%3C/path%3E%3C/svg%3E"); 458 + } 459 + } 460 + 461 + &[data-admonition-type='important'] { 462 + @apply bg-important/7; 463 + 464 + p.admonition-title { 465 + @apply text-important; 466 + } 467 + 468 + p.admonition-title:before { 469 + @apply bg-important; 470 + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'%3E%3C/path%3E%3C/svg%3E"); 471 + } 472 + } 473 + 474 + &[data-admonition-type='caution'] { 475 + @apply bg-caution/7; 476 + 477 + p.admonition-title { 478 + @apply text-caution; 479 + } 480 + 481 + p.admonition-title:before { 482 + @apply bg-caution; 483 + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'%3E%3C/path%3E%3C/svg%3E"); 484 + } 485 + } 486 + 487 + &[data-admonition-type='warning'] { 488 + @apply bg-warning/7; 489 + 490 + p.admonition-title { 491 + @apply text-warning; 492 + } 493 + 494 + p.admonition-title:before { 495 + @apply bg-warning; 496 + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'%3E%3C/path%3E%3C/svg%3E"); 497 + } 498 + } 499 + } 500 + 501 + .github-card { 502 + @apply bg-foreground/5 rounded-xl px-4 py-3; 503 + 504 + .gh-title { 505 + @apply relative flex items-center gap-2 text-base; 506 + 507 + .gh-avatar { 508 + @apply bg-foreground/20 h-6 w-6 flex-none rounded-full bg-none bg-cover bg-center; 509 + } 510 + .gh-text { 511 + @apply line-clamp-2; 512 + &:after { 513 + @apply absolute inset-0 content-['']; 514 + } 515 + } 516 + .gh-icon { 517 + @apply bg-foreground pointer-events-none ms-auto h-6 w-6 flex-none; 518 + mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='31' height='32' viewBox='0 0 496 512'><path fill='%23a1f7cb' d='M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9c1.6 2.3 4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2'/%3E%3C/svg%3E") 519 + center center / 24px auto no-repeat; 520 + } 521 + } 522 + .gh-description { 523 + @apply mt-4 leading-tight; 524 + } 525 + .gh-chips { 526 + @apply mt-4 flex flex-wrap items-center gap-4; 527 + 528 + .gh-stars, 529 + .gh-forks, 530 + .gh-license, 531 + .gh-followers, 532 + .gh-repositories { 533 + @apply flex items-center gap-x-1; 534 + &:before { 535 + @apply bg-foreground block h-5 w-5 content-['']; 536 + mask: var(--chip-image) center center/16px auto no-repeat; 537 + } 538 + } 539 + .gh-stars { 540 + --chip-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' height='16' viewBox='0 0 16 16' version='1.1' width='16'><path d='M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z'/></svg>"); 541 + } 542 + .gh-forks { 543 + --chip-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' height='16' viewBox='0 0 16 16' version='1.1' width='16'><path d='M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z'/></svg>"); 544 + } 545 + .gh-license { 546 + --chip-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' height='16' viewBox='0 0 16 16' version='1.1' width='16'><path d='M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z'/></svg>"); 547 + } 548 + .gh-followers { 549 + --chip-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' text='muted' height='16' viewBox='0 0 16 16' version='1.1' width='16'><path d='M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z'/></svg>"); 550 + } 551 + .gh-repositories { 552 + --chip-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' height='16' viewBox='0 0 16 16' version='1.1' width='16'><path d='M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z'/></svg>"); 553 + } 554 + .gh-language, 555 + .gh-region { 556 + @apply ms-auto; 557 + } 558 + } 559 + } 560 + 561 + table, 562 + th, 563 + td { 564 + @apply border-2 border-foreground/80 p-2.5; 565 + } 566 + 567 + th { 568 + @apply uppercase text-left; 569 + } 570 + 571 + .katex-display { 572 + @apply overflow-x-auto py-2 my-4; 573 + } 574 + 575 + fieldset { 576 + @apply inline-block border-2 border-accent/80 p-2.5 rounded-xl; 577 + } 578 + 579 + fieldset *:first-child { 580 + @apply mb-0; 581 + } 582 + 583 + fieldset input, 584 + fieldset select, 585 + fieldset textarea, 586 + fieldset label, 587 + fieldset button { 588 + @apply mt-3 w-full; 589 + } 590 + 591 + label { 592 + @apply inline-block; 593 + } 594 + 595 + label input { 596 + @apply mt-0; 597 + } 598 + 599 + input, 600 + textarea, 601 + select { 602 + @apply bg-transparent text-foreground border-1 border-foreground p-2.5 rounded-xl; 603 + } 604 + 605 + input[type='checkbox'] { 606 + @apply w-auto; 607 + } 608 + 609 + input[type='submit'] { 610 + @apply border-accent cursor-pointer; 611 + } 612 + }
+183
src/types.ts
··· 1 + import type { MarkdownHeading } from 'astro' 2 + import type { BundledShikiTheme } from 'astro-expressive-code' 3 + import type { CollectionEntry, DataEntryMap } from 'astro:content' 4 + 5 + export type WeekdayIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6 // 0 = Sunday, 1 = Monday etc. 6 + 7 + export type GitHubActivityDay = { 8 + date: string 9 + count: number 10 + level: 0 | 1 | 2 | 3 | 4 11 + } 12 + 13 + export type GitHubActivityWeek = Array<GitHubActivityDay | undefined> 14 + 15 + export type GitHubActivityApiResponse = { 16 + total: { 17 + [year: number]: number 18 + [year: string]: number // 'lastYear; 19 + } 20 + contributions: Array<GitHubActivityDay> 21 + error?: string 22 + } 23 + 24 + export type GitHubActivityMonthLabel = { 25 + weekIndex: number 26 + label: string 27 + } 28 + 29 + export interface TocItem extends MarkdownHeading { 30 + children: TocItem[] 31 + } 32 + 33 + export interface TocOpts { 34 + maxHeadingLevel?: number | undefined 35 + minHeadingLevel?: number | undefined 36 + } 37 + 38 + export interface FrontmatterImage { 39 + alt: string 40 + src: { 41 + height: number 42 + src: string 43 + width: number 44 + format: 'avif' | 'png' | 'webp' | 'jpeg' | 'jpg' | 'svg' | 'tiff' | 'gif' 45 + } 46 + } 47 + 48 + export interface Collation<CollectionType extends keyof DataEntryMap> { 49 + title: string 50 + url: string 51 + titleSlug: string 52 + entries: CollectionEntry<CollectionType>[] 53 + } 54 + 55 + export interface CollationGroup<CollectionType extends keyof DataEntryMap> { 56 + title: string 57 + url: string 58 + collations: Collation<CollectionType>[] 59 + // Return this.collations to allow chaining 60 + sortCollationsAlpha(): Collation<CollectionType>[] 61 + sortCollationsMostRecent(): Collation<CollectionType>[] 62 + sortCollationsLargest(): Collation<CollectionType>[] 63 + add(item: CollectionEntry<CollectionType>, rawKey: string): void 64 + match(title: string): Collation<CollectionType> | undefined 65 + matchMany(titles: string[]): Collation<CollectionType>[] | undefined 66 + } 67 + 68 + export type NavLink = { 69 + name: string 70 + url: string 71 + external?: boolean 72 + } 73 + 74 + export type AdmonitionType = 'tip' | 'note' | 'important' | 'caution' | 'warning' 75 + 76 + export const themeKeys = [ 77 + 'foreground', 78 + 'background', 79 + 'accent', 80 + // Markdown styles 81 + 'heading1', 82 + 'heading2', 83 + 'heading3', 84 + 'heading4', 85 + 'heading5', 86 + 'heading6', 87 + 'list', 88 + 'separator', 89 + 'italic', 90 + 'link', 91 + // For admonition styling 92 + 'note', 93 + 'tip', 94 + 'important', 95 + 'caution', 96 + 'warning', 97 + // For Giscus syntax highlighting only 98 + 'comment', 99 + 'constant', 100 + 'entity', 101 + 'tag', 102 + 'keyword', 103 + 'string', 104 + 'variable', 105 + 'regexp', 106 + // Terminal colors for user customization only, not used by default 107 + 'blue', 108 + 'green', 109 + 'red', 110 + 'yellow', 111 + 'magenta', 112 + 'cyan', 113 + ] as const 114 + 115 + export type ThemeKey = (typeof themeKeys)[number] 116 + 117 + // const example: TextmateStyles = { 118 + // foreground: ['editor.foreground'], 119 + // background: ['editor.background'], 120 + // } 121 + export type TextmateStyles = { 122 + [key in ThemeKey]: string[] 123 + } 124 + 125 + // const example: ColorStyles = { 126 + // foreground: '#000000', 127 + // background: '#ffffff', 128 + // } 129 + export type ColorStyles = { 130 + [key in ThemeKey]: string 131 + } 132 + 133 + // const example: ThemesWithColorStyles = { 134 + // 'github-light': { 135 + // foreground: '#24292e', 136 + // background: '#ffffff', 137 + // }, 138 + // } 139 + export type ThemesWithColorStyles = Partial<Record<BundledShikiTheme, ColorStyles>> 140 + export type ThemeOverrides = Partial<Record<BundledShikiTheme, Partial<ColorStyles>>> 141 + 142 + export interface ThemesConfig { 143 + default: BundledShikiTheme | 'auto' 144 + mode: 'single' | 'light-dark-auto' | 'select' 145 + include: BundledShikiTheme[] 146 + overrides?: ThemeOverrides 147 + } 148 + 149 + export type SocialLinks = { 150 + codeberg?: string 151 + github?: string 152 + twitter?: string 153 + mastodon?: string 154 + bluesky?: string 155 + linkedin?: string 156 + email?: string 157 + rss?: boolean 158 + } 159 + 160 + export type GiscusConfig = { 161 + repo: string 162 + repoId: string 163 + category: string 164 + categoryId: string 165 + reactionsEnabled: boolean 166 + } 167 + 168 + export interface SiteConfig { 169 + site: string 170 + font: string 171 + title: string 172 + description: string 173 + author: string 174 + socialCardAvatarImage: string 175 + tags: string[] 176 + pageSize: number 177 + trailingSlashes: boolean 178 + themes: ThemesConfig 179 + socialLinks: SocialLinks 180 + navLinks: NavLink[] 181 + giscus: GiscusConfig | undefined, 182 + characters: Record<string, string> 183 + }
+331
src/utils.ts
··· 1 + import { 2 + type TextmateStyles, 3 + type ThemesWithColorStyles, 4 + type ThemeKey, 5 + themeKeys, 6 + type ThemeOverrides, 7 + type Collation, 8 + type CollationGroup, 9 + } from '~/types' 10 + import { 11 + loadShikiTheme, 12 + type BundledShikiTheme, 13 + type ExpressiveCodeTheme, 14 + } from 'astro-expressive-code' 15 + import { getCollection, type CollectionEntry } from 'astro:content' 16 + import Color from 'color' 17 + import { slug } from 'github-slugger' 18 + 19 + export function dateString(date: Date) { 20 + return date.toISOString().split('T')[0] 21 + } 22 + 23 + export function pick(obj: Record<string, any>, keys: string[]) { 24 + return Object.fromEntries( 25 + keys.filter((key) => key in obj).map((key) => [key, obj[key]]), 26 + ) 27 + } 28 + 29 + export function flattenThemeColors(theme: ExpressiveCodeTheme): { 30 + [key: string]: string 31 + } { 32 + const scopedThemeSettings = theme.settings.reduce( 33 + (acc, item) => { 34 + const { scope, settings } = item 35 + const { foreground } = settings 36 + if (scope && foreground) { 37 + for (const s of scope) { 38 + acc[s] = foreground.toLowerCase().trim() 39 + } 40 + } 41 + return acc 42 + }, 43 + {} as { [key: string]: string }, 44 + ) 45 + return { ...theme.colors, ...scopedThemeSettings } 46 + } 47 + 48 + const unresolvedStyles: TextmateStyles = { 49 + // VSCode Command: Inspect Editor Tokens And Scopes 50 + foreground: ['editor.foreground'], 51 + background: ['editor.background'], 52 + accent: [ 53 + 'heading.1.markdown entity.name', 54 + 'heading.1.markdown', 55 + 'markup.heading.markdown', 56 + 'markup.heading', 57 + 'editor.foreground', 58 + ], 59 + // Markdown styles 60 + heading1: [ 61 + 'heading.1.markdown entity.name', 62 + 'heading.1.markdown', 63 + 'markup.heading.markdown', 64 + 'markup.heading', 65 + 'editor.foreground', 66 + ], 67 + heading2: [ 68 + 'heading.2.markdown entity.name', 69 + 'heading.2.markdown', 70 + 'markup.heading.markdown', 71 + 'markup.heading', 72 + 'editor.foreground', 73 + ], 74 + heading3: [ 75 + 'heading.3.markdown entity.name', 76 + 'heading.3.markdown', 77 + 'markup.heading.markdown', 78 + 'markup.heading', 79 + 'editor.foreground', 80 + ], 81 + heading4: [ 82 + 'heading.4.markdown entity.name', 83 + 'heading.4.markdown', 84 + 'markup.heading.markdown', 85 + 'markup.heading', 86 + 'editor.foreground', 87 + ], 88 + heading5: [ 89 + 'heading.5.markdown entity.name', 90 + 'heading.5.markdown', 91 + 'markup.heading.markdown', 92 + 'markup.heading', 93 + 'editor.foreground', 94 + ], 95 + heading6: [ 96 + 'heading.6.markdown entity.name', 97 + 'heading.6.markdown', 98 + 'markup.heading.markdown', 99 + 'markup.heading', 100 + 'editor.foreground', 101 + ], 102 + list: [ 103 + 'markup.list.bullet', 104 + 'punctuation.definition.list.begin.markdown', 105 + 'editor.foreground', 106 + ], 107 + italic: [ 108 + 'markup.italic.markdown', 109 + 'markup.italic', 110 + 'punctuation.definition.italic.markdown', 111 + 'editor.foreground', 112 + ], 113 + link: ['string.other.link.title.markdown', 'markup.link', 'editor.foreground'], 114 + separator: ['meta.separator.markdown', 'meta.separator', 'editor.foreground'], 115 + // For admonition styling 116 + note: ['terminal.ansiBlue', 'terminal.ansiBrightBlue'], 117 + tip: ['terminal.ansiGreen', 'terminal.ansiBrightGreen'], 118 + important: ['terminal.ansiMagenta', 'terminal.ansiBrightMagenta'], 119 + caution: ['terminal.ansiYellow', 'terminal.ansiBrightYellow'], 120 + warning: ['terminal.ansiRed', 'terminal.ansiBrightRed'], 121 + // For Giscus syntax highlighting only 122 + comment: ['comment', 'punctuation.definition.comment', 'foreground'], 123 + constant: ['constant.language.boolean', 'constant.language', 'foreground'], 124 + entity: ['entity.name.function', 'support.function', 'function', 'foreground'], 125 + tag: [ 126 + 'entity.name.tag', 127 + 'punctuation.definition.tag', 128 + 'punctuation.definition.tag.html', 129 + 'meta.tag', 130 + 'foreground', 131 + ], 132 + keyword: [ 133 + 'keyword', 134 + 'punctuation.definition.keyword', 135 + 'keyword.operator', 136 + 'foreground', 137 + ], 138 + string: ['string', 'string.quoted', 'string.value', 'string variable', 'foreground'], 139 + variable: [ 140 + 'variable', 141 + 'variable.language', 142 + 'variable.other', 143 + 'support.variable', 144 + 'foreground', 145 + ], 146 + regexp: [ 147 + 'string.regexp', 148 + 'string.regexp.source', 149 + 'constant.other.character-class.regexp', 150 + 'string', 151 + 'foreground', 152 + ], 153 + // Terminal colors for user customization only, not used by default 154 + blue: ['terminal.ansiBlue', 'terminal.ansiBrightBlue'], 155 + green: ['terminal.ansiGreen', 'terminal.ansiBrightGreen'], 156 + red: ['terminal.ansiRed', 'terminal.ansiBrightRed'], 157 + yellow: ['terminal.ansiYellow', 'terminal.ansiBrightYellow'], 158 + magenta: ['terminal.ansiMagenta', 'terminal.ansiBrightMagenta'], 159 + cyan: ['terminal.ansiCyan', 'terminal.ansiBrightCyan'], 160 + } 161 + 162 + export async function resolveThemeColorStyles( 163 + themes: BundledShikiTheme[], 164 + overrides?: ThemeOverrides, 165 + ): Promise<ThemesWithColorStyles> { 166 + const validateColor = (color: string) => { 167 + // Check if the color is a valid hex, rgb, or hsl color via regex 168 + const colorRegex = /^(#|rgb|hsl)/i 169 + if (!colorRegex.test(color)) return undefined 170 + try { 171 + return new Color(color).hex() 172 + } catch { 173 + return undefined 174 + } 175 + } 176 + const resolvedThemes = themes.map(async (theme) => { 177 + const loadedTheme = await loadShikiTheme(theme) 178 + const flattenedTheme = flattenThemeColors(loadedTheme) 179 + const result = {} as { [key in ThemeKey]: string } 180 + for (const themeKey of Object.keys(unresolvedStyles) as ThemeKey[]) { 181 + if (overrides?.[theme]?.[themeKey]) { 182 + const override = overrides[theme][themeKey] 183 + const overrideColor = validateColor(override) 184 + if (overrideColor) { 185 + result[themeKey] = override 186 + continue 187 + } 188 + // If the override is not a valid color, try to resolve it as a highlight group 189 + if (themeKeys.includes(override as ThemeKey)) { 190 + for (const textmateGroup of unresolvedStyles[override as ThemeKey]) { 191 + if (flattenedTheme[textmateGroup]) { 192 + result[themeKey] = flattenedTheme[textmateGroup] 193 + break 194 + } 195 + } 196 + } 197 + if (result[themeKey]) { 198 + continue 199 + } else { 200 + console.warn( 201 + `Theme "${theme}" has an override for "${themeKey}" with value "${override}", but it is neither a theme key nor valid color.`, 202 + ) 203 + } 204 + } 205 + for (const textmateGroup of unresolvedStyles[themeKey]) { 206 + if (flattenedTheme[textmateGroup]) { 207 + result[themeKey] = flattenedTheme[textmateGroup] 208 + break 209 + } 210 + } 211 + } 212 + return [theme, result] 213 + }) 214 + return Object.fromEntries(await Promise.all(resolvedThemes)) as ThemesWithColorStyles 215 + } 216 + 217 + export async function getSortedPosts() { 218 + const allPosts = await getCollection('posts', ({ data }) => { 219 + return import.meta.env.PROD ? data.draft !== true : true 220 + }) 221 + const sortedPosts = allPosts.sort((a, b) => { 222 + return a.data.published < b.data.published ? -1 : 1 223 + }) 224 + return sortedPosts 225 + } 226 + 227 + abstract class PostsCollationGroup implements CollationGroup<'posts'> { 228 + title: string 229 + url: string 230 + collations: Collation<'posts'>[] 231 + 232 + constructor(title: string, url: string, collations: Collation<'posts'>[]) { 233 + this.title = title 234 + this.url = url 235 + this.collations = collations 236 + } 237 + 238 + sortCollationsAlpha(): Collation<'posts'>[] { 239 + this.collations.sort((a, b) => a.title.localeCompare(b.title)) 240 + return this.collations 241 + } 242 + 243 + sortCollationsLargest(): Collation<'posts'>[] { 244 + this.collations.sort((a, b) => b.entries.length - a.entries.length) 245 + return this.collations 246 + } 247 + 248 + sortCollationsMostRecent(): Collation<'posts'>[] { 249 + this.collations.sort((a, b) => { 250 + const aDate = a.entries[a.entries.length - 1].data.published 251 + const bDate = b.entries[b.entries.length - 1].data.published 252 + return aDate < bDate ? 1 : -1 253 + }) 254 + return this.collations 255 + } 256 + 257 + add(item: CollectionEntry<'posts'>, collationTitle: string): void { 258 + const collationTitleSlug = slug(collationTitle.trim()) 259 + const existing = this.collations.find((i) => i.titleSlug === collationTitleSlug) 260 + if (existing) { 261 + const alreadyHasThisPost = existing.entries.find((e) => e.id === item.id) 262 + if (!alreadyHasThisPost) { 263 + existing.entries.push(item) 264 + } 265 + } else { 266 + this.collations.push({ 267 + title: collationTitle, 268 + titleSlug: collationTitleSlug, 269 + url: `${this.url}/${encodeURIComponent(collationTitleSlug)}`, 270 + entries: [item], 271 + }) 272 + } 273 + } 274 + 275 + match(rawKey: string): Collation<'posts'> | undefined { 276 + return this.collations.find((entry) => entry.title === rawKey) 277 + } 278 + 279 + matchMany(rawKeys: string[]): Collation<'posts'>[] { 280 + return this.collations.filter((entry) => rawKeys.includes(entry.title)) 281 + } 282 + } 283 + 284 + export class SeriesGroup extends PostsCollationGroup { 285 + // Private constructor to enforce the use of the static build method 286 + private constructor(title: string, url: string, items: Collation<'posts'>[]) { 287 + super(title, url, items) 288 + } 289 + // Factory method to create a SeriesGroup instance with async data fetching 290 + static async build(posts?: CollectionEntry<'posts'>[]): Promise<SeriesGroup> { 291 + const sortedPosts = posts || (await getSortedPosts()) 292 + const seriesGroup = new SeriesGroup('Series', '/series', []) 293 + sortedPosts.forEach((post) => { 294 + const frontmatterSeries = post.data.series 295 + if (frontmatterSeries) { 296 + seriesGroup.add(post, frontmatterSeries) 297 + } 298 + }) 299 + return seriesGroup 300 + } 301 + } 302 + 303 + export class TagsGroup extends PostsCollationGroup { 304 + // Private constructor to enforce the use of the static build method 305 + private constructor(title: string, url: string, items: Collation<'posts'>[]) { 306 + super(title, url, items) 307 + } 308 + 309 + // Factory method to create a SeriesGroup instance with async data fetching 310 + static async build(posts?: CollectionEntry<'posts'>[]): Promise<SeriesGroup> { 311 + const sortedPosts = posts || (await getSortedPosts()) 312 + const tagsGroup = new TagsGroup('Tags', '/tags', []) 313 + sortedPosts.forEach((post) => { 314 + const frontmatterTags = post.data.tags || [] 315 + frontmatterTags.forEach((tag) => { 316 + tagsGroup.add(post, tag) 317 + }) 318 + }) 319 + return tagsGroup 320 + } 321 + } 322 + 323 + export function getPostSequenceContext( 324 + post: CollectionEntry<'posts'>, 325 + posts: CollectionEntry<'posts'>[], 326 + ) { 327 + const index = posts.findIndex((p) => p.id === post.id) 328 + const prev = index > 0 ? posts[index - 1] : undefined 329 + const next = index < posts.length - 1 ? posts[index + 1] : undefined 330 + return { index, prev, next } 331 + }
+19
tsconfig.json
··· 1 + { 2 + "extends": "astro/tsconfigs/strict", 3 + "include": [".astro/types.d.ts", "**/*"], 4 + "exclude": ["dist"], 5 + "compilerOptions": { 6 + "verbatimModuleSyntax": true, 7 + "baseUrl": ".", 8 + "paths": { 9 + "~/*": ["src/*"] 10 + }, 11 + "plugins": [ 12 + { 13 + "name": "@astrojs/ts-plugin" 14 + } 15 + ], 16 + "jsx": "react-jsx", 17 + "jsxImportSource": "react" 18 + } 19 + }