diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..df39287 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 + +[*.{js,ts,json,mts,css}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/.envrc b/.envrc index e3c2943..aa86cac 100644 --- a/.envrc +++ b/.envrc @@ -1,7 +1,4 @@ -export DIRENV_WARN_TIMEOUT=20s - +#!/usr/bin/env bash eval "$(devenv direnvrc)" - -# The use_devenv function supports passing flags to the devenv command -# For example: use devenv --impure --option services.postgres.enable:bool true +dotenv use devenv diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml new file mode 100644 index 0000000..6a95b30 --- /dev/null +++ b/.gitea/workflows/deploy.yaml @@ -0,0 +1,26 @@ +name: deploy +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: cachix/install-nix-action@v31 + with: + nix_path: nixpkgs=channel:nixos-unstable + - uses: cachix/cachix-action@v16 + with: + name: phundrak + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + extraPullNames: devenv + - name: Install devenv + run: nix profile add nixpkgs#devenv + - name: Deploy to Cloudflare Pages + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: devenv tasks run website:deploy diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml deleted file mode 100644 index 199984e..0000000 --- a/.github/workflows/deploy.yaml +++ /dev/null @@ -1,40 +0,0 @@ -name: deploy -on: - push: - branches: - - main - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: purcell/setup-emacs@master - with: - version: 29.1 - - name: "Export org to md" - run: emacs -Q --script export.el - - uses: actions/setup-node@v4 - with: - node-version: 20.x - - run: corepack enable - - run: npm ci - - run: npm run build - - name: "Deploy to Cloudflare Pages" - uses: cloudflare/pages-action@v1 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.ACCOUNT_ID }} - projectName: config-phundrak-com - directory: docs/.vuepress/dist/ - githubToken: ${{ secrets.TOKEN }} - # - name: "Deploy to remote server" - # uses: appleboy/scp-action@v0.1.4 - # with: - # host: ${{ secrets.HOST }} - # username: ${{ secrets.USERNAME }} - # key: ${{ secrets.KEY }} - # port: ${{ secrets.PORT }} - # source: docs/.vuepress/dist/* - # target: ${{ secrets.DESTPATH }} - # strip_components: 3 diff --git a/.gitignore b/.gitignore index 03be8a9..f1355ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,31 @@ node_modules +/docs/**/*.md + +# Vitepress +/.vitepress/cache/ +/.vitepress/dist/ +/docs/.vitepress/ +/docs/img +/docs/eittlandic/img +/docs/proto-nyqy/img .temp .cache -/docs/**/*.md -/docs/.vuepress/dist/ -/.yarn/ # Devenv .devenv* devenv.local.nix +devenv.local.yaml + +# direnv +.direnv + +# pre-commit +.pre-commit-config.yaml + +# Devenv +.devenv* +devenv.local.nix +devenv.local.yaml # direnv .direnv diff --git a/.prettierrc.json b/.prettierrc.json index d137ad0..79fbfe4 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,9 +1,13 @@ { + "$schema": "https://json.schemastore.org/prettierrc", + "semi": true, "tabWidth": 2, "useTabs": false, - "semi": true, "singleQuote": true, - "trailingComma": "all", + "quoteProps": "as-needed", + "printWidth": 100, + "trailingComma": "es5", "bracketSpacing": true, + "bracketSameLine": true, "arrowParens": "always" } diff --git a/.vitepress/components/ImgFigure.vue b/.vitepress/components/ImgFigure.vue new file mode 100644 index 0000000..d6b401d --- /dev/null +++ b/.vitepress/components/ImgFigure.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/.vitepress/config.mts b/.vitepress/config.mts new file mode 100644 index 0000000..c8f4cc9 --- /dev/null +++ b/.vitepress/config.mts @@ -0,0 +1,33 @@ +// -*- mode: typescript; -*- +import { defineConfig, HeadConfig } from 'vitepress'; +import appHead from './head'; +import { sidebar } from './sidebar'; +import { nav } from './nav'; + +export default defineConfig({ + title: "P’undrak’s Dotfiles", + cleanUrls: true, + description: 'P’undrak’s Linux configuration', + head: appHead as HeadConfig[], + srcDir: './docs', + themeConfig: { + sidebar, + nav, + outline: { + level: 'deep' + }, + search: { + provider: 'local' + }, + }, + markdown: { + image: { + lazyLoading: true + }, + linkify: true, + typographer: true, + headers: { + level: [1, 2, 3, 4, 5] + } + }, +}) diff --git a/.vitepress/head.ts b/.vitepress/head.ts new file mode 100644 index 0000000..76d2d99 --- /dev/null +++ b/.vitepress/head.ts @@ -0,0 +1,79 @@ +interface Head { + type?: 'image/png'; + async?: boolean, + src?: string, + 'data-website-id'?: string +} + +interface Favicon extends Head { + rel: 'apple-touch-icon' | 'icon' | 'manifest'; + href: string; + sizes?: string; +} + +interface Meta extends Head { + property?: string, + name?: string, + content: string +} + +const favicons: Favicon[] = [ + { rel: 'apple-touch-icon', sizes: '57x57', href: '/img/meta/apple-icon-57x57.png' }, + { rel: 'apple-touch-icon', sizes: '60x60', href: '/img/meta/apple-icon-60x60.png' }, + { rel: 'apple-touch-icon', sizes: '72x72', href: '/img/meta/apple-icon-72x72.png' }, + { rel: 'apple-touch-icon', sizes: '76x76', href: '/img/meta/apple-icon-76x76.png' }, + { rel: 'apple-touch-icon', sizes: '114x114', href: '/img/meta/apple-icon-114x114.png' }, + { rel: 'apple-touch-icon', sizes: '120x120', href: '/img/meta/apple-icon-120x120.png' }, + { rel: 'apple-touch-icon', sizes: '144x144', href: '/img/meta/apple-icon-144x144.png' }, + { rel: 'apple-touch-icon', sizes: '152x152', href: '/img/meta/apple-icon-152x152.png' }, + { rel: 'apple-touch-icon', sizes: '180x180', href: '/img/meta/apple-icon-180x180.png' }, + { rel: 'icon', type: 'image/png', sizes: '192x192', href: '/img/meta/android-icon-192x192.png' }, + { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/img/meta/favicon-32x32.png' }, + { rel: 'icon', type: 'image/png', sizes: '96x96', href: '/img/meta/favicon-96x96.png' }, + { rel: 'icon', type: 'image/png', sizes: '16x16', href: '/img/meta/favicon-16x16.png' }, + { rel: 'manifest', href: '/img/meta/manifest.json' }, +]; + +const meta: Meta[] = [ + { + name: 'author', + content: 'Lucien Cartier-Tilet', + }, + { + property: 'og:image', + content: 'https://cdn.phundrak.com/img/rich_preview.png', + }, + { + property: 'og:title', + content: 'P’undrak’s Dotfiles', + }, + { + property: 'og:description', + content: 'P’undrak’s Linux configuration', + }, + { + name: 'fediverse:creator', + content: '@phundrak@mastodon.phundrak.com', + }, + { + name: 'twitter:card', + content: 'summary', + }, + { + name: 'twitter:site', + content: '@phundrak', + }, + { + name: 'twitter:creator', + content: '@phundrak', + }, + { name: 'msapplication-TileColor', content: '#3b4252' }, + { name: 'msapplication-TileImage', content: '/ms-icon-144x144.png' }, + { name: 'theme-color', content: '#3b4252' }, + +] + +const appHead: (string | Head)[][] = favicons.map((head) => ['link', head]) +meta.map((item) => appHead.push(['meta', item])) + +export default appHead; diff --git a/.vitepress/nav.ts b/.vitepress/nav.ts new file mode 100644 index 0000000..fefc0ec --- /dev/null +++ b/.vitepress/nav.ts @@ -0,0 +1,8 @@ +import { DefaultTheme } from "vitepress"; + +export const nav: DefaultTheme.NavItem[] = [ + { text: 'About', link: '/about' }, + { text: 'Configs', link: '/' }, + { text: 'Deprecated Configs', link: '/deprecated/', activeMatch: '/deprecated/*' }, + { text: 'Source', link: 'https://labs.phundrak.com/phundrak/config.phundrak.com' }, +] diff --git a/.vitepress/sidebar.ts b/.vitepress/sidebar.ts new file mode 100644 index 0000000..de4cb24 --- /dev/null +++ b/.vitepress/sidebar.ts @@ -0,0 +1,59 @@ +import { DefaultTheme } from "vitepress"; + +export const sidebar: DefaultTheme.Sidebar = { + '/': [ + { text: 'Index', link: '/' }, + { text: 'Custom Scripts', link: '/scripts' }, + { text: 'Desktop', link: '/desktop' }, + { text: 'General Shell Config', link: '/shell' }, + { text: 'Fish', link: '/fish' }, + { text: 'Git', link: '/git' }, + { text: 'Hyprland', link: '/hyprland' }, + { text: 'MPD', link: '/mpd' }, + { text: 'Tmux', link: '/tmux' }, + { + text: 'Emacs', + items: [ + { text: 'Index', link: '/emacs/' }, + { text: 'Basic Config', link: '/emacs/basic-config' }, + { text: 'Custom Elisp', link: '/emacs/custom-elisp' }, + { text: 'Package Managers', link: '/emacs/package-manager' }, + { text: 'Keybind Managers', link: '/emacs/keybinding-managers' }, + { text: 'Autocompletion', link: '/emacs/packages/autocompletion' }, + { text: 'Applications', link: '/emacs/packages/applications' }, + { text: 'Editing', link: '/emacs/packages/editing' }, + { text: 'Built-in', link: '/emacs/packages/emacs-builtin' }, + { text: 'Making My Life Easier', link: '/emacs/packages/helpful' }, + { text: 'LaTeX', link: '/emacs/packages/latex' }, + { text: 'Org Mode', link: '/emacs/packages/org' }, + { text: 'Programming', link: '/emacs/packages/programming' }, + { text: 'Visual Config', link: '/emacs/packages/visual-config' }, + { text: 'Misc', link: '/emacs/packages/misc' }, + { text: 'Keybindings', link: '/emacs/keybindings' }, + ] + } + ], + '/deprecated/': [ + { text: 'AwesomeWM', link: '/deprecated/awesome' }, + { text: 'Bootstrap Script', link: '/deprecated/bootstrap' }, + { text: 'EXWM', link: '/emacs/packages/exwm' }, + { text: 'i3', link: '/deprecated/i3' }, + { text: 'Nano', link: '/deprecated/nano' }, + { text: 'Neofetch', link: '/neofetch' }, + { text: 'Picom', link: '/picom' }, + { text: 'Polybar', link: '/deprecated/polybar' }, + { + text: 'StumpWM', items: [ + { text: 'Index', link: '/stumpwm/' }, + { text: 'Basic Configuration', link: '/stumpwm/init' }, + { text: 'Colours', link: '/stumpwm/colours' }, + { text: 'Modeline', link: '/stumpwm/mode-line' }, + { text: 'Groups and Placement', link: '/stumpwm/groups' }, + { text: 'Theme', link: '/stumpwm/theme' }, + { text: 'Commands', link: '/stumpwm/commands' }, + { text: 'Keybinds', link: '/stumpwm/keybindings' }, + { text: 'Utilities', link: '/stumpwm/utilities' }, + ] + } + ] +} diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts new file mode 100644 index 0000000..e9c13ac --- /dev/null +++ b/.vitepress/theme/index.ts @@ -0,0 +1,10 @@ +import { Theme } from "vitepress"; +import DefaultTheme from "vitepress/theme"; +import ImgFigure from "../components/ImgFigure.vue"; + +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + app.component('ImgFigure', ImgFigure); + } +} satisfies Theme; diff --git a/devenv.lock b/devenv.lock index 1804daf..9a9fbca 100644 --- a/devenv.lock +++ b/devenv.lock @@ -3,11 +3,11 @@ "devenv": { "locked": { "dir": "src/modules", - "lastModified": 1777679510, - "narHash": "sha256-uG8LPb1useAwa0cjO5sEkYhCSPjbWiCH3DyNxQLVSck=", + "lastModified": 1783538213, + "narHash": "sha256-jNjKlmrejUrBgVAeiavlMLlkmC7ZEv1D9nhfuwMW5Q8=", "owner": "cachix", "repo": "devenv", - "rev": "bc8b21628907c726c74094cedc439c10a455cdb7", + "rev": "d1fb321e73048d0e1e2b523580268ebb3df2ae90", "type": "github" }, "original": { @@ -22,11 +22,11 @@ "nixpkgs-src": "nixpkgs-src" }, "locked": { - "lastModified": 1776852779, - "narHash": "sha256-WwO/ITisCXwyiRgtktZgv3iGhAGO+IB5Av4kKCwezR0=", + "lastModified": 1783345554, + "narHash": "sha256-LZhOm4kqjHUnwP4CNHpaqqEVcumGNd1PvOEOad8LkS0=", "owner": "cachix", "repo": "devenv-nixpkgs", - "rev": "ec3063523dcd911aeadb50faa589f237cdab5853", + "rev": "6004ea8c229fe9d41b21c6f4c76bf6c2e10771dd", "type": "github" }, "original": { @@ -39,11 +39,11 @@ "nixpkgs-src": { "flake": false, "locked": { - "lastModified": 1776329215, - "narHash": "sha256-a8BYi3mzoJ/AcJP8UldOx8emoPRLeWqALZWu4ZvjPXw=", + "lastModified": 1783279667, + "narHash": "sha256-/NAkDSsve+GNM0Bt6tleJdCGfsTlK89nPjkVOzZMo0s=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b86751bc4085f48661017fa226dee99fab6c651b", + "rev": "f205b5574fd0cb7da5b702a2da51507b7f4fdd1b", "type": "github" }, "original": { diff --git a/devenv.nix b/devenv.nix index d21d803..d79436f 100644 --- a/devenv.nix +++ b/devenv.nix @@ -1,9 +1,40 @@ -{ pkgs, ... }: - -{ - languages.typescript.enable = true; - packages = [ pkgs.nodejs_20 ]; - scripts.export.exec = '' - ${pkgs.emacs}/bin/emacs -Q --script export.el - ''; +{ pkgs, ... }: { + languages.javascript = { + enable = true; + npm.enable = false; + pnpm.enable = true; + }; + dotenv.enable = true; + processes.dev.exec = "pnpm dev"; + cachix = { + push = "phundrak"; + pull = [ + "phundrak" + "devenv" + ]; + }; + tasks = { + "website:install-deps".exec = "pnpm ci"; + "website:export-md" = { + exec = "${pkgs.emacs}/bin/emacs -Q --script export.el"; + execIfModified = [ "docs/**/*.org" ]; + }; + "website:build" = { + exec = "pnpm build"; + after = [ + "website:export-md@succeeded" + "website:install-deps@succeeded" + ]; + }; + "website:deploy" = { + exec = '' + if [[ -z "''${CLOUDFLARE_API_TOKEN:-}" ]]; then + echo "Error: CLOUDFLARE_API_TOKEN is not set. Run this in CI only." + exit 1 + fi + ${pkgs.wrangler}/bin/wrangler pages deploy + ''; + after = [ "website:build@succeeded" ]; + }; + }; } diff --git a/devenv.yaml b/devenv.yaml index 116a2ad..3dcab58 100644 --- a/devenv.yaml +++ b/devenv.yaml @@ -3,11 +3,14 @@ inputs: nixpkgs: url: github:cachix/devenv-nixpkgs/rolling -# If you're using non-OSS software, you can set allowUnfree to true. -# allowUnfree: true +# If you're using non-OSS software, you can set allow_unfree to true. +# allow_unfree: true + +# If you're not willing to allow unsupported packages: +# allow_unsupported_system: false # If you're willing to use a package that's vulnerable -# permittedInsecurePackages: +# permitted_insecure_packages: # - "openssl-1.1.1w" # If you have more than one devenv you can merge them diff --git a/docs/deprecated/spacemacs.org b/docs/deprecated/spacemacs.org deleted file mode 100644 index aed3a83..0000000 --- a/docs/deprecated/spacemacs.org +++ /dev/null @@ -1,4778 +0,0 @@ -#+title: Spacemacs -#+setupfile: ../headers -#+PROPERTY: header-args: :mkdirp yes :lexical t - -* Spacemacs -#+begin_center -*Before proceeding, be aware that I deprecated this i3 config on October 20th 2021, meaning I won’t update it anymore unless I use it again some day in the future. I will keep it on my website though.* -#+end_center - -This file is the main source file for my Spacemacs configuration which -contains most of the user code. It is exported thanks to Emacs’ code -tangling from the original Org file which you can find on my dotfiles’ -repository[fn:1] if you are reading the web version of it. You can -also find there my ~.spacemacs~[fn:2] and its code which isn’t part of -the present file. As you can see in my ~.spacemacs~, at init-time, if -Emacs detects the tangled configuration files are older than the Org -file, then Emacs tangles them again, and then loads them. - -** Spacemacs layers and packages -:PROPERTIES: -:header-args:emacs-lisp: :mkdirp yes :tangle ~/.emacs.spacemacs/private/spacemacs-layers.el :exports code :results silent :lexical t -:END: -#+BEGIN_SRC emacs-lisp :exports none -;; -*- lexical-binding: t -*- -#+END_SRC - -Here will be our layer configuration set. Everything here is set with a -~setq-default~ in the ~dotspacemacs/layers~ function like so: -#+BEGIN_SRC emacs-lisp :tangle no -(defun dotspacemacs/layers () - (setq-default - ;; configuration goes here - )) -#+END_SRC - -*** General configuration -First, we need to tell Spacemacs which base distribution we are using. This is a -layer contained in the directory ~+distribution~. For now, available -distributions are ~spacemacs-base~ and ~spacemacs~ (the default one). -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-distribution 'spacemacs) -#+END_SRC - -We can seet a lazy installation of layers —i.e. layers are installed only when a -file with a supported type is opened. Possible values are: -- ~all~ :: will lazy install any layer that support lazy installation even the - layers listed in ~dotspacemacs-configuration-layers~ -- ~unused~ :: will lazy install only unused layers (i.e. layers not listed in - the variable ~dotspacemacs-configuration-layers~) -- ~nil~ :: disables the lazy installation feature and you have to explicitly - list a layer in the variable ~dotspacemacs-configuration-layers~ to install - it. -The default value is ~unused~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-enable-lazy-installation nil) -#+END_SRC - -If the following variable is non-nil, Spacemacs will ask for confirmation before -installing a layer lazily. The default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-ask-for-lazy-installation t) -#+END_SRC - -*** Package management -It is possible to indicate to Spacemacs a list of additional paths where to look -for configuration layers. Paths must have a trailing slash, i.e. -=~/.mycontribs/=. As you can see, I added only one: -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-configuration-layer-path - '("~/fromGIT/emacs-packages")) -#+END_SRC - -However, I do have additional packages I installed either from the Elpa or the -Melpa. These are set in ~dotspacemacs-additional-packages~, a list of additional -packages that will be installed without being wrapped in a layer. If I need some -configuration for these packages, then I should consider creating a layer. I can -also puth the configuration in ~dotspacemacs/user-config~. To use a local -version of a package, use the ~:location~ property, for instance: -#+BEGIN_SRC emacs-lisp :tangle no -'(your-package :location "~/path/to/your-package/") -#+END_SRC - -With the variable ~dotspacemacs-additional-packages~, it is possible to install -extra packages which are not already included in any layers. Dependencies should -be explicitly included as they won’t be resolved automatically. Here is a table -of all the extra packages I use: -#+NAME: extra-packages -| name of the package | why is it installed | -|----------------------------+--------------------------------------------------------| -| caddyfile-mode | Major mode for editing Caddyfiles | -| dired-git-info | Git information in Dired buffers | -| diredfl | Extra font lock rules for a more colourful dired | -| edit-indirect | edit region in separate buffer | -| elcord | rich integration of Emacs in Discord | -| eshell-syntax-highlighting | Syntax highlighting for Eshell | -| info-colors | Extra colors for Emacs's Info-mode | -| multiple-cursors | I don’t like the layer, I prefer this package alone | -| ob-latex-as-png | Inline arbitrary LaTeX snippets as PNGs in Emacs | -| org-sidebar | display on the side the outline of an Org buffer | -| org-tree-slide | presentation tool for org-mode | -| outorg | edit comments as Org-mode buffers | -| ox-ssh | SSH config export for org-mode | -| pinentry | enter a GPG password from Emacs | -| nord-theme | An arctic, north-bluish clean and elegant Emacs theme. | -| s | The long lost Emacs string manipulation library. | -| sicp | Texinfo version of the [[https://mitpress.mit.edu/sites/default/files/sicp/index.html][SICP]] | -| visual-fill-column | allow the use of ~fill-column~ in ~visual-line-mode~ | -| wrap-region | easily wrap region with delimiters | -| wttrin | weather in Emacs | -| yasnippet-snippets | snippets for YaSnippet | - -#+name: make-extra-pkg -#+begin_src emacs-lisp :var packages=extra-packages[,0] :tangle no :exports none -(mapcar 'make-symbol packages) -#+end_src - -#+begin_src emacs-lisp :noweb yes :exports none -(setq-default dotspacemacs-additional-packages '<>) -#+end_src - -It is possible to also list packages that cannot be updated: -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-frozen-packages '(helm-icons)) -#+END_SRC - -And to list packages which won’t be installed nor loaded: -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-excluded-packages '(company-tern)) -#+END_SRC - -Finally, it is possible to define the behaviour of Spacemacs when installing -packages. Possible values are: -- ~used-only~ :: installs only explicitly used packages and deletes any unused - packages as well as their unused dependencies -- ~used-but-keep-unused~ :: installs only the used packages but won’t delete - unused ones -- ~all~ :: installs *all* packages supported by Spacemacs and never uninstalls - them. -The default value is ~used-only~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-install-packages 'used-only) -#+END_SRC - -*** Layers -All layers are set one variable: ~dotspacemacs-configuration-layers~. This -variable is a list of layers, some of them will have some custom variables. -Typically, the variable will be set like so: -#+BEGIN_SRC emacs-lisp :tangle no -(setq-default dotspacemacs-configuration-layers - '(emacs-lisp - helm - multiple-cursors - org - (shell :variables shell-default-height 30 - shell-default-position 'bottom) - treemacs)) -#+END_SRC - -# Don’t delete this code block, it wraps the layers -#+BEGIN_SRC emacs-lisp :exports none -(setq-default dotspacemacs-configuration-layers '( -#+END_SRC - -**** Checkers -The two first checkers I use are for spell and syntax checking. ~spell-checking~ -is disabled by default, however it should auto-detect the dictionary to use. -#+BEGIN_SRC emacs-lisp -(spell-checking :variables - spell-checking-enable-by-default nil - spell-checking-enable-auto-dictionary t) -syntax-checking -#+END_SRC - -**** Completion -~auto-completion~ is a layer enabled in order to provide auto-completion to all -supported language layers. It is set so that the =RET= key has no behavior with -this layer, however the =TAB= key cycles between candidates displayed by the -auto-completion toolbox. I also want the autocompletion to include snippets in -the popup, and the content of the popup is sorted by usage. It is also disabled -for two modes: magit and Org. -#+BEGIN_SRC emacs-lisp -(auto-completion :variables - auto-completion-complete-with-key-sequence-delay 0.2 - auto-completion-enable-help-tooltip 'manual - auto-completion-enable-sort-by-usage t - :disabled-for - org - git) -#+END_SRC - -~helm~ is also enabled, with its header disabled. -#+BEGIN_SRC emacs-lisp -(helm :variables helm-no-header t) -#+END_SRC - -**** Email -I use as my daily Email client ~mu4e~, so let’s enable it and tell Emacs where -mu4e is installed. I also tell mu4e to use maildirs extensions, use async -operations, where to keep attachments, and enable the mu4e modeline. -#+BEGIN_SRC emacs-lisp -(mu4e :variables - mu4e-installation-path "/usr/share/emacs/site-lisp" - mu4e-use-maildirs-extension t - mu4e-enable-mode-line t - mu4e-attachment-dir "~/Documents/mu4e") -#+END_SRC - -**** Emacs -The first layer enabled in this category is ~better-defaults~. I also made it so -that when a command equivalent to ~C-a~ or ~C-e~ is pressed, the cursor will -respectively first move to the beginning of code first before going past the -indentation and to the end of the code before going to the end of the line -before going over the end of the comments on the same line. -#+BEGIN_SRC emacs-lisp -(better-defaults :variables - better-defaults-move-to-beginning-of-code-first t - better-defaults-move-to-end-of-code-first t) -#+END_SRC - -I also enabled ~ibuffer~ and made it so that buffers are sorted by projects. -#+BEGIN_SRC emacs-lisp -(ibuffer :variables - ibuffer-group-buffers-by 'projects) -#+END_SRC - -Most important of all, the ~org~ layer is also enabled. I enabled support for -Epub exports, Github, Reveal.JS exports, and sticky headers. Project support is -also enabled through files named ~TODOs.org~. I also set the org-download folder -for images in =~/Pictures/org/=, and I set the =RET= key to follow org links if -the cursor is on one. -#+BEGIN_SRC emacs-lisp -(org :variables - org-enable-epub-support t - org-enable-github-support t - org-enable-hugo-support t - org-enable-reveal-js-support t - org-enable-sticky-header t - org-enable-appear-support t - spaceline-org-clock-p t - org-projectile-file "TODOs.org" - org-download-image-dir "~/Pictures/org/" - org-return-follows-link t) -#+END_SRC - -The ~semantic~ layer is also enabled. -#+BEGIN_SRC emacs-lisp -semantic -#+END_SRC - -**** File trees -In this category, I only enabled one layer: ~treemacs~. In this layer, I set is -so that treemacs syncs with my current buffer, and it automatically refreshes -its buffer when there is a change in the part of the file system shown by -treemacs. -#+BEGIN_SRC emacs-lisp -(treemacs :variables - treemacs-use-follow-mode t - treemacs-use-filewatch-mode t) -#+END_SRC - -**** Fonts -In this category, again, one layer is enabled: ~unicode-fonts~. This layer -addssupport for the ~unicode-fonts~ package. -#+BEGIN_SRC emacs-lisp -(unicode-fonts :variables - unicode-fonts-enable-ligatures t - unicode-fonts-ligature-modes '(prog-mode) - unicode-fonts-ligature-set '("|||>" "<|||" "<==>" "" "---" "-<<" - "<~~" "<~>" "<*>" "<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->" - "<--" "<-<" "<<=" "<<-" "<<<" "<+>" "" "###" "#_(" "..<" - "..." "+++" "/==" "///" "_|_" "www" "&&" "^=" "~~" "~@" "~=" - "~>" "~-" "**" "*>" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|" - "[|" "]#" "::" ":=" ":>" ":<" "$>" "==" "=>" "!=" "!!" ">:" - ">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:" - "<$" "<=" "<>" "<-" "<<" "<+" "" "++" "?:" - "?=" "?." "??" ";;" "/*" "/=" "/>" "//" "__" "~~" "(*" "*)" - "\\\\" "://")) -#+END_SRC - -**** Fun -In this category, I only enabled two layers: ~selectric~ and ~xkcd~. -#+BEGIN_SRC emacs-lisp -selectric xkcd -#+END_SRC - -**** Internationalization -In this category, I enabled the ~keyboard-layout~ layer to enable compatibility -with the bépo layout. This layer, however, is disabled for magit, Dired and eww. -#+BEGIN_SRC emacs-lisp -(keyboard-layout :variables - kl-layout 'bepo - kl-disabled-configurations '(magit dired eww)) -#+END_SRC - -**** Programming languages -***** Domain-specific (DSLs) -In this category, I enabled support for the ~major-modes~ layer for the Arch -Linux PKGBUILDs support, ~emacs-lisp~ and ~scheme~ layers, support for the CSV -format with the ~csv~ layer, the ~yaml~ language, shell scripting languages and -support for the ~dot~ tool with the ~graphviz~ layer. -#+BEGIN_SRC emacs-lisp -major-modes emacs-lisp scheme graphviz yaml shell-scripts -#+END_SRC - -I also added support for HTML and CSS with the ~html~ layer, with the web -formatting tool set to ~web-beautify~, and the LSP layer compatibility enabled -for CSS, less, SCSS and HTML. -#+BEGIN_SRC emacs-lisp -(html :variables - web-fmt-tool 'web-beautify - css-enable-lsp t - less-enable-lsp t - scss-enable-lsp t - html-enable-lsp t) -#+END_SRC - -The ~json~ layer is also enabled, with the format tool set to ~web-beautify~. -#+BEGIN_SRC emacs-lisp -(json :variables - json-fmt-tool 'web-beautify) -#+END_SRC - -The LaTeX layer has also been enabled, with its default compiler set to XeLaTeX. -I also enabled the auto-fill feature, the folding capacity and the “magic” -symbols. -#+BEGIN_SRC emacs-lisp -(latex :variables - latex-build-command "xelatex" - latex-enable-auto-fill t - latex-enable-folding t - latex-enable-magic t) -#+END_SRC - -The Markdown layer has been enabled, with support for live preview with ~vmd~, -and and automatic MMM-mode generation for C, C++, Python, Rust and Emacs Lisp. -#+BEGIN_SRC emacs-lisp -(markdown :variables - markdown-live-preview-engine 'vmd - markdown-mmm-auto-modes '("c" - "c++" - "python" - "rust" - ("elisp" "emacs-lisp"))) -#+END_SRC - -PlantUML is a very useful DSL for creating UML diagrams from some text -description. As you can see below, this layer will be enabled, both as a -standalone mode for opening ~.pum~ files, but also for org-mode code blocks. -#+BEGIN_SRC emacs-lisp -(plantuml :variables - plantuml-jar-path "~/.local/bin/plantuml.jar" - org-plantuml-jar-path "~/.local/bin/plantuml.jar") -#+END_SRC - -#+BEGIN_SRC emacs-lisp -(bibtex :variables - org-ref-default-bibliography '("~/Documents/Papers/references.bib") - org-ref-pdf-directory "~/Documents/Papers" - org-ref-bibliography-notes "~/Documents/Papers/notes.org") -#+END_SRC - -#+BEGIN_SRC emacs-lisp -csv -#+END_SRC - -***** Frameworks -Only one framework support has been enabled so far, and is is for the Django -framework. -#+BEGIN_SRC emacs-lisp -django -#+END_SRC - -***** General-purpose -Among the layers I activated, the only one without any specific configuration is -the ~asm~ layer for the Assembly language. -#+BEGIN_SRC emacs-lisp -asm -#+END_SRC - -Next, you can find the C/C++ layer for which I set the default language for ~.h~ -files to be C. I also enabled support for subprojects and organization of the -include directives on a file save. I also set a couple of LSP-related variables, -such as the LSP executable for C/C++ for its CCLS backend and some highlight -variables. -#+BEGIN_SRC emacs-lisp -(c-c++ :variables - c-c++-default-mode-for-headers 'c-mode - c-c++-adopt-subprojects t - c-c++-enable-c++11 t - c-c++-backend 'lsp-clangd - c-c++-lsp-enable-semantic-highlight t - c-c++-lsp-semantic-highlight-method 'overlay - c-c++-lsp-semantic-highlight-rainbow t - c++-enable-organize-includes-on-save t) -#+END_SRC - -Dart has also been enabled, with a custom path to the SDK of the Dart server, -and to the LSP server of Dart. -#+BEGIN_SRC emacs-lisp -(dart :variables - lsp-dart-project-sdk-dir "/opt/dart-sdk/" - lsp-dart-sdk-dir "/opt/dart-sdk/") -#+END_SRC - -When it comes to the Python layer, I set its backend and formatter to be bound -to the LSP layer. Its fill columnn was also set to 80 characters, imports are -sorted on save, and the tests can be run using either nose.el or pytest. -#+BEGIN_SRC emacs-lisp -(python :variables - python-fill-column 80 - python-test-runner '(pytest nose)) -#+END_SRC - -With the Rust layer, the only custom configuration set is the backend being -bound to the LSP layer. -#+BEGIN_SRC emacs-lisp -(rust :variables rust-backend 'lsp) -#+END_SRC - -As regards the JavaScript layer, I set its backend to the LSP layer, and bound -its format tool to ~web-beautify~ and its REPL is browser-based. I also want to -include ~node_modules/.bin~ to be automatically added to the buffer local -~exec_path~. -#+BEGIN_SRC emacs-lisp -(javascript :variables - javascript-backend 'lsp - javascript-fmt-tool 'web-beautify - javascript-repl 'skewer - node-add-modules-path t) -#+END_SRC - -Alternatively, I also use Typescript which is a sort of better Javascript as it -should have been, with the LSP backend. -#+BEGIN_SRC emacs-lisp -(typescript :variables - typescript-backend 'lsp) -#+END_SRC - -I am also currently using the Awesome window manager which requires the Lua -programming language, so here it is. -#+BEGIN_SRC emacs-lisp -(lua :variables - lua-backend 'lsp-emmy - lua-lsp-emmy-jar-path "~/.config/awesome/EmmyLua-LS-all.jar" - lua-lsp-emmy-java-path "java" - lua-lsp-emmy-enable-file-watchers t) -#+END_SRC - -#+BEGIN_SRC emacs-lisp -(php :variables php-backend 'lsp) -#+END_SRC - -**** Readers -***** Epub and Pdf readers -In this category, only the ~epub~ and ~pdf~ layers are enabled without any -special configuration, so I can read these files from Emacs directly. -#+BEGIN_SRC emacs-lisp -epub pdf -#+END_SRC - -***** Elfeed -Elfeed is an Emacs feeed and RSS reader which can be managed through org files. -Actually, through only one file in my case, located in my =~/org= directory. -#+BEGIN_SRC emacs-lisp -(elfeed :variables - rmh-elfeed-org-files '("~/org/elfeed.org")) -#+END_SRC - -**** Version control -Only the ~git~ layer is enabled in this category. -#+BEGIN_SRC emacs-lisp -git -#+END_SRC - -**** Themes -Here, the ~colors~ layer is the only one enabled. It activates support for -identifiers colorization, and strings representing colors. -#+BEGIN_SRC emacs-lisp -colors -#+END_SRC - -**** Tools -In this category, the first layer to be enabled is the CMake layer for which I -enabled support for the ~cmake-ide~ package. -#+BEGIN_SRC emacs-lisp -(cmake :variables - cmake-enable-cmake-ide-support t) -#+END_SRC - -Next, we have the Docker, Nginx, Pass (the standard Unix password manager), -Prettier, Systemd, Meson, Imenu-list, Web-beautify, Dap, and Helpful. -#+BEGIN_SRC emacs-lisp -dap docker helpful imenu-list meson nginx pass prettier systemd web-beautify -#+END_SRC - -Of course, let’s not forget about the awesome LSP layer: -#+BEGIN_SRC emacs-lisp -(lsp :variables lsp-lens-enable t - lsp-use-lsp-ui t - lsp-rust-server 'rust-analyzer) -#+END_SRC - -We also have the RestClient layer enabled for which I enabled the Org -compatibility support. -#+BEGIN_SRC emacs-lisp -(restclient :variables - restclient-use-org t) -#+END_SRC - -LanguageTool works with Flyspell and will check for grammatical issues in my -english texts. -#+BEGIN_SRC emacs-lisp -(languagetool :variables - langtool-default-language "en-US" - languagetool-show-error-on-jump t - langtool-java-classpath "/usr/share/languagetool:/usr/share/java/languagetool/*") -#+END_SRC - - -And finally, we also have the Shell layer for which I specified its default -height when spawning at the bottom of the screen should be 40 lines high, and -the default shell to invoke is Eshell. -#+BEGIN_SRC emacs-lisp -(shell :variables - shell-default-height 40 - shell-default-position 'bottom - shell-default-shell 'eshell) -#+END_SRC - -**** Web Services -In this category, I have only enabled a layer for Twitter support. -#+BEGIN_SRC emacs-lisp -twitter -#+END_SRC - -**** Custom layers -Lastly, one custom layers have been enabled: my custom layer for conlanging -tools. -#+BEGIN_SRC emacs-lisp -conlanging -#+END_SRC - -# Don’t delete this code block, it wraps the layers -#+BEGIN_SRC emacs-lisp :exports none -)) -#+END_SRC - -** Init -:PROPERTIES: -:header-args:emacs-lisp: :mkdirp yes :tangle ~/.emacs.spacemacs/private/spacemacs-init.el :exports code :results silent :lexical t -:END: -#+BEGIN_SRC emacs-lisp :exports none -;; -*- lexical-binding: t -*- -#+END_SRC - -The ~dotspacemacs/init~ function is the one called at the very begining of the -Spacemacs startup, before any kind of configuration, including the layer -configuration. Only the values of the Spacemacs settings should be modified -here. By default, every values are set in a ~setq-default~ sexp, and they -represent all the supported Spacemacs settings. Hence, the function looks like -this: -#+BEGIN_SRC emacs-lisp :tangle no -(defun dotspacemacs/init () - (setq-default - ;; default Spacemacs configuration here - )) -#+END_SRC - -*** Handling my Spacemacs litterate config -:PROPERTIES: -:header-args:emacs-lisp: :tangle no :exports code :results silent :lexical t -:END: -Just before we get onto the usual content of the ~dotspacemacs/init~ function -you would find in a typical Spacemacs installation, I would like to talk a bit -about how I manage writing a litterate config for Spacemacs and ensure Emacs -starts with an up-to-date configuration from said litterate config. For that, I -actually declared a couple of variables: -#+BEGIN_SRC emacs-lisp -(defvar phundrak--dotspacemacs-src-dir "~/.emacs.spacemacs/private/" - "Directory for my exported Elisp configuration files") -(defvar phundrak--dotspacemacs-src "~/org/config/emacs.org" - "My litterate config file for Emacs") -(defvar phundrak--dotspacemacs-si (concat phundrak--dotspacemacs-src-dir "spacemacs-init")) -(defvar phundrak--dotspacemacs-sl (concat phundrak--dotspacemacs-src-dir "spacemacs-layers")) -(defvar phundrak--dotspacemacs-uc (concat phundrak--dotspacemacs-src-dir "user-config")) -(defvar phundrak--dotspacemacs-ui (concat phundrak--dotspacemacs-src-dir "user-init")) -(defvar phundrak--dotspacemacs-files (list phundrak--dotspacemacs-si phundrak--dotspacemacs-sl - phundrak--dotspacemacs-uc phundrak--dotspacemacs-ui)) -#+END_SRC -I also declared the following function that tells me if my Elisp files are more -recent than my ~emacs.org~ file. The ~compiled?~ argument lets me compare either -the ~.el~ files if it is ~nil~, or the ~.elc~ files if it is ~t~. -#+BEGIN_SRC emacs-lisp -(defun phundrak-update-config-files-p (&optional compiled?) - "Verify if any of my exported Elisp configuration files are -newer than my litterate configuration. - -If `COMPILED?' is `t', check the `.elc' files instead of the -`.el' files." - (catch 'ret - (dolist (file phundrak--dotspacemacs-files) - (when (file-newer-than-file-p phundrak--dotspacemacs-src - (format "%s.%s" - file - (if compiled? "elc" "el"))) - (throw 'ret t))))) -#+END_SRC - -Now I know a couple of my files that get exported by this document. If I compare -how recent these files are compared to my litterate config, I know if Emacs -missed tangling its configuration before launching, so if any of my ~si~, ~sl~, -~uc~, or ~ui~ files are older than my ~emacs.org~, then I’ll tangle the latter; -and since my user config is growing longer and longer, I want Emacs to be able -to parse it fast next time it boots, so let’s compile my exported ~.el~ files! -#+BEGIN_SRC emacs-lisp -(when (or (file-newer-than-file-p phundrak--dotspacemacs-src (concat phundrak--dotspacemacs-si ".el")) - (file-newer-than-file-p phundrak--dotspacemacs-src (concat phundrak--dotspacemacs-sl ".el")) - (file-newer-than-file-p phundrak--dotspacemacs-src (concat phundrak--dotspacemacs-ui ".el")) - (file-newer-than-file-p phundrak--dotspacemacs-src (concat phundrak--dotspacemacs-uc ".el"))) - (message "Exporting new Emacs configuration from spacemacs.org through org-babel...") - (with-temp-buffer - (shell-command (format "emacs -Q --batch %s %s %s" - "--eval \"(require 'ob-tangle)\"" - "--eval \"(setq org-confirm-babel-evaluate nil)\"" - (format "--eval '(org-babel-tangle-file \"%s\")'" - phundrak--dotspacemacs-src)) - (current-buffer))) - (message "Exporting new Emacs configuration from spacemacs.org through org-babel...done") - (with-temp-buffer - (byte-recompile-directory phundrak--dotspacemacs-src-dir - 0 t))) -#+END_SRC -All that’s left to do in the Spacemacs functions is to call ~load~ on ~si~, -~sl~, ~uc~, and ~ui~. Be aware this sub-chapter won’t be tangled, so it might -not be up to date with the [[https://labs.phundrak.com/phundrak/dotfiles/src/branch/master/.spacemacs][actual dotspacemacs file]]. Please check it just in -case something changed and I forgot to update this part of ~emacs.org~. - -*** Emacs with pdumper -It is possible to compile Emacs 27 from source with support for the portable -dumper, as shown in Spacemacs’ ~EXPERIMENTAL.org~ file. I do not use this -feature yet, as I am still on Emacs 26 provided from Arch Linux’s repositories, -so I’ll disable the Spacemacs support for this feature. The default value of -this variable is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-enable-emacs-pdumper t) -#+END_SRC - -In case the support for pdumper was enabled, Spacemacs needs to know the name of -the Emacs executable which supports such a feature. The executable must be in -the user’s ~PATH~. By default, the value of the variable is ~"emacs"~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-emacs-pdumper-executable-file "emacs") -#+END_SRC - -And finally, we can name the Spacemacs dump file. This is the file that will be -created by the portable dumper in the cache directory under the ~dumps~ -sub-directory. To load it when starting Emacs, the parameter ~--dump-file~ -should be added when invoking Emacs 27.1 executable from the command line, for -instance: -#+BEGIN_SRC sh :tangle no :exports code -./emacs --dump-file=~/.emacs.spacemacs/.cache/dumps/spacemacs.pdmp -#+END_SRC - -The default value of this variable is ~"spacemacs.pdmp"~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-emacs-dumper-dump-file - (format "spacemacs-%s.pdmp" emacs-version)) -#+END_SRC - -*** Package managment and updates -Spacemacs’ core configuration can be updated via git commands using Github -services. If Spacemacs is not set to the ~develop~ branch, it can check by -itself if any update is available. However, I am using said branch, therefore I -should set this variable to ~nil~. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-check-for-update nil) -#+END_SRC - -When it comes to package management, Spacemacs is able to store them in -different directories depending on the version of Emacs used or based on other -variables. I personally prefer to use the value ~emacs-version~ since it makes -it easier to upgrade or downgrade Emacs without any conflict with the already -installed packages. The default value is ~emacs-version~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-elpa-subdirectory 'emacs-version) -#+END_SRC - -Spacemacs has a capacity of performing rollbacks after updates. We can set the -maximum number of rollback slots to keep in the cache. The default value is ~5~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-max-rollback-slots 5) -#+END_SRC - -**** Elpa repository -It is possible to ask Emacs to use an HTTPS connection when contacting the Elpa -whenever possible. This value should be set to ~nil~ when the user has no way to -contact the Elpa though HTTPS, otherwise it is strongly recommended to let it -set to ~t~. This variable however has no effect if Emacs is launched with the -parameter ~--insecure~ which forces the value of this variable to ~nil~. The -default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-elpa-https t) -#+END_SRC - -We can set a maximum amount of seconds which will represent the maximum allowed -time to contact the Elpa repository. By default, this setting is set on ~5~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-elpa-timeout 5) -#+END_SRC - -**** Spacelpa repository -The Spacelpa repository is a Spacemacs-specific package repository. It is -possible to use it as the primary source to install a locked version of a -package. If the below value is set to ~nil~, then Spacemacs will install the -latest version of packages from MELPA. I personally don’t use it, so I let it -set to ~nil~. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-use-spacelpa nil) -#+END_SRC - -If the below value is not ~nil~, then the signature for the downloaded Spacelpa -packages must be verified. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-verify-spacelpa-archives t) -#+END_SRC - -*** Editing style -By default, Spacemacs encourages the use of evil-mode, which brings vim -keybinding in Emacs. Still, it has three different styles available: -- ~vim~, which goes full evil-mode usage and most adapted to Emacs newcomers, - especially if they were used to vim before, with the use of a normal mode and - an insert mode. -- ~emacs~ which keeps an Emacs-like feel to the keybindings, without any - difference between an insert or normal mode. -- ~hybrid~ is a modification of the ~vim~ mode which brings the ~emacs~ style in - insert mode, but otherwise behaves like the ~vim~ style in normal mode. This - is the style I personally use. -The value can also be a list with the ~:variables~ keyword (similar to layers). -Check the editing styles section of the documentation for details on available -variables. The default value is ~vim~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-editing-style - '(hybrid :variables - hybrid-mode-enable-evilified-state t - hybrid-mode-default-state 'normal)) -#+END_SRC - -If non-nil, the paste transient-state is enabled. While enabled, after you paste -something, pressing ~C-j~ and ~C-k~ several times cycles through the elements in -the ~kill-ring~. Default ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-enable-paste-transient-state t) -#+END_SRC - -*** Spacemacs home configuration -The value below specifies the startup banner of Spacemacs. The default value is -~official~, it displays the official Spacemacs logo. An integer value is the -index of text banner, ~random~ chooses a random text banner in the -~core/banners~ directory. A string value must be a path to an image format -supported by your Emacs build. If the value is nil, then no banner is displayed. -The default value is ~official~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-startup-banner 'official) -#+END_SRC - -On the Spacemacs homepage, a list of elements can also be shown, be it recent -files, projects, agenda items,… Each of the elements making up the list value of -the below variable are pairs in the form ~(list-type . list-size)~. If the value -is ~nil~, then it is disabled. The possible values for ~list-type~ are: -- ~recents~ :: displays recently opened files -- ~bookmarks~ :: displays saved bookmarks -- ~projects~ :: displays projectile projects recently opened -- ~agenda~ :: displays upcoming events from Org-mode agendas -- ~todos~ :: displays recent TODOs detected in projectile projects -The order in which they are set in the below list affects their order on the -Spacemacs startup page. List sikes may be ~nil~, in which case -~spacemacs-buffer-startup-lists-length~ takes effect. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-startup-lists '((recents . 15) - (projects . 15))) -#+END_SRC - -The below variable allows the startup page to respond to resize events. Its -default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-startup-buffer-responsive t) -#+END_SRC - -If non-nil show the version string in the Spacemacs buffer. It will appear as -~(spacemacs version)@(emacs version)~. Default ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-startup-buffer-show-version t) -#+END_SRC - -*** Default major modes -The below variable sets a default major mode for a new empty buffer. Possible -values are mode names such as ~text-mode~, or ~nil~ to use Fundamental mode. The -default value is ~text-mode~, but I prefer to use ~org-mode~ by default. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-new-empty-buffer-major-mode 'org-mode) -#+END_SRC - -Similarly, the below variable sets the default mode for the scratch buffer. Its -default value is ~text-mode~, but I set it to use ~emacs-lisp-mode~ by default. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-scratch-mode 'emacs-lisp-mode) -#+END_SRC - -By the way, it is possible to set a default message for the scratch buffer, such -as “Welcome to Spacemacs!”. I prefer to keep it clean. The default value is -~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-initial-scratch-message nil) -#+END_SRC - -*** Visual configuration -**** Themes -Spacemacs makes it quite easy to use themes and organize them. The below value -is a list of themes, the first of the list is loaded when Spacemacs starts. The -user can press ~SPC T n~ to cycle to the next theme in the list. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-themes '(nord doom-nord doom-vibrant spacemacs-dark - doom-one doom-opera doom-dracula doom-molokai - doom-peacock doom-sourcerer doom-spacegrey - kaolin-dark kaolin-aurora kaolin-bubblegum - kaolin-galaxy kaolin-mono-dark kaolin-temple - kaolin-valley-dark)) -#+END_SRC - -Emacs also makes use of themes for the Spaceline at the bottom of buffers. -Supported themes are: -- ~spacemacs~ -- ~all-the-icons~ -- ~custom~ -- ~doom~ (the one I use) -- ~vim-powerline~ -- ~vanilla~ -The first three are Spaceline themes. ~doom~ is the Doom-Emacs mode-line, and -~vanilla~ is the default Emacs mode-line. ~custom~ is a user defined theme, -refer to Spacemacs’ ~DOCUMENTATION.org~ file for more info on how to create your -own Spaceline theme. Value can be a symbol or list with additional properties. -The default value is ~'(spacemacs :separator wave :separator-scale 1.5))~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-mode-line-theme '(doom - :separator wave - :separator-scale 1.0)) -#+END_SRC - -It is also possible to color the cursor depending on which mode Spacemacs is in, -in order to mach the state color in GUI Emacs. The default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-colorize-cursor-according-to-state t) -#+END_SRC - -The below variable sets either the default font or a prioritized list of fonts -to be used by Emacs. The ~:size~ can be specified as a non-negative integer -(pixel size), or a floating-point (point size). Point size is recommended, -because it’s device independent (add a ~.0~ to make an integer a floating -point). The default size is ~10.0~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-default-font '("Cascadia Code" - :size 9.0)) -#+END_SRC - -I also added the following code in order to define a fallback font for emojis, -defined only on their unicode range: -#+BEGIN_SRC emacs-lisp -(set-fontset-font "fontset-default" '(#x1f600 . #x1f64f) "NotoEmoji Nerd Font") -#+END_SRC - -**** Other on-screen elements -~which-key~ is a helper which displays available keyboard shortcuts. This -variable sets in seconds the time Spacemacs should wait between a key press and -the moment ~which-key~ should be shown. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-which-key-delay 1) -#+END_SRC - -This variable sets ~which-key~'s frame position. Possible values are: -- ~right~ -- ~bottom~ -- ~right-then-bottom~ -~right-then-bottom~ tries to display the frame to the right, but if there is -insufficient space it displays it at the bottom. The default value is ~bottom~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-which-key-position 'right-then-bottom) -#+END_SRC - -This controls where ~switch-to-buffer~ displays the buffer. If the value is -~nil~, ~switch-to-buffer~ displays the buffer in the current window even if -another same-purpose window is available. If non-nil, ~switch-to-buffer~ -displays the buffer in a same-purpose window even if the buffer can be displayed -in the current window. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-switch-to-buffer-prefers-purpose nil) -#+END_SRC - -If this variable is non-nil, a progress bar is displayed when Spacemacs is -loading. This may increase the boot time on some systems and emacs builds, set -it to ~nil~ to boost the loading time. The default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-loading-progress-bar t) -#+END_SRC - -If the value is non-nil, Emacs will show the title of the transient states. The -default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-show-transient-state-title t) -#+END_SRC - -If non-nil, this will show the color guide hint for transient state keys. The -default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-show-transient-state-color-guide t) -#+END_SRC - -If non-nil, unicode symbols are displayed in the mode line. If you use Emacs as -a daemon and want unicode characters only in GUI set the value to quoted -~display-graphic-p~. The default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-mode-line-unicode-symbols t) -#+END_SRC - -If non-nil, smooth scrolling (native-scrolling) is enabled. Smooth scrolling -overrides the default behavior of Emacs which recenters point when it reaches -the top or bottom of the screen. The default value is ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-smooth-scrolling t) -#+END_SRC - -The following value controls the line number activation. If set to ~t~, -~relative~ or ~visual~ then line numbers are enabled in all ~prog-mode~ and -~text-mode~ derivatives. If set to ~relative~, line numbers are relative. If set -to ~visual~, line numbers are also relative, but only visual lines are counted. -For example, folded lines will not be counted and wrapped lines are counted as -multiple lines. This variable can also be set to a property list for finer -control: -#+BEGIN_SRC emacs-lisp :tangle no -'(:relative nil - :visual nil - :disabled-for-modes dired-mode - doc-view-mode - markdown-mode - org-mode - pdf-view-mode - text-mode - :size-limit-kb 1000) -#+END_SRC - -When used in a plist, ~visual~ takes precendence over ~relative~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-line-numbers '(:relative nil - :visual nil - :disabled-for-modes org-mode pdf-view-mode - dired-mode doc-view-mode - text-mode)) -#+END_SRC - -Select a scope to highlight delimiter. Possible values are: -- ~any~ -- ~current~ -- ~all~ -- ~nil~ -The default value is ~all~ (highlights any scope and emphasis the current one). -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-highlight-delimiters 'all) -#+END_SRC - -After a certain amount of time in seconds, Spacemacs can zone-out. The default -value is ~nil~. I set it so Spacemacs zones out after 15 minutes. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-zone-out-when-idle 900) -#+END_SRC - -Run ~spacemacs/prettify-org-buffer~ when visiting the ~README.org~ files of -Spacemacs. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-pretty-docs nil) -#+END_SRC - -If ~nil~, the home buffer shows the full path of agenda items and todos. If non -~nil~, only the file name is shown. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-home-shorten-agenda-source t) -#+END_SRC - -**** Appearance of Emacs frames -Starting from Emacs 24.4, it is possible to make the Emacs frame fullscreen when -Emacs starts up if the variable is set to a non-nil value. The default value is -~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-fullscreen-at-startup nil) -#+END_SRC - -This variable is to be used if the user does not want to use native fullscreen -with ~spacemacs/toggle-fullscreen~. This disables for instance the fullscreen -animation under OSX. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-fullscreen-use-non-native nil) -#+END_SRC - -If you do not start Emacs in fullscreen at startup, you might want it to be -maximized by default. If the value for the variable below is set to be non-nil, -the frame will be maximized. This can only work if -~dotspacemacs-fullscreen-at-startup~ is set to ~nil~, and it is only available -from Emacs 24.4 onwards. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-maximized-at-startup nil) -#+END_SRC - -If non-nil, the frame is undecorated when Emacs starts up. Combine this with the -variable ~dotspacemacs-maximized-at-startup~ in OSX to obtain borderless -fullscreen. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-undecorated-at-startup nil) -#+END_SRC - -You can also set a transparency level for Emacs when you toggle the transparency -of the frame with ~toggle-transparency~. The value of the transparency, going -from 0 to 100 in increasing opacity, describes the transparency level of a frame -when it’s active or selected. The default value is ~90~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-active-transparency 85) -#+END_SRC - -Similarly, you can set a value from 0 to 100 in increasing opacity which -describes the transparency level of a frame when it’s inactive or deselected. -The default value is ~90~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-inactive-transparency 80) -#+END_SRC - -The variable below sets the format of frame title. You can use: -- ~%a~ :: the ~abbreviated-file-name~ or ~buffer-name~ -- ~%t~ :: ~projectile-project-name~ -- ~%I~ :: ~invocation-name~ -- ~%S~ :: ~system-name~ -- ~%U~ :: contents of ~$USER~ -- ~%b~ :: buffer name -- ~%f~ :: visited file name -- ~%F~ :: frame name -- ~%s~ :: process status -- ~%p~ :: percent of buffer above top of window, or Top, Bot, or All -- ~%P~ :: percent of buffer above bottom of window, perhaps plus Top, or Bot, or - All -- ~%m~ :: mode name -- ~%n~ :: Narrow if appropriate -- ~%z~ :: mnemonics of buffer, terminal, and keyboard coding systems -- ~%Z~ :: like ~%z~, but including the end-of-line format -The default value is ~"%I@%S"~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-frame-title-format "Emacs: %b (%t) %U@%S") -#+END_SRC - -Format specification for setting the icon title format. The default value is -~nil~, same as ~frame-title-format~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-icon-title-format nil) -#+END_SRC - -*** Spacemacs leader keys and shortcuts -The below setting sets the Spacemacs leader key. By default, this is the ~SPC~ -key. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-leader-key "SPC") -#+END_SRC - -Once the leader key has been pressed, it is possible to set another key in order -to call Emacs’ command ~M-x~. By default, it is again the ~SPC~ key. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-emacs-command-key "SPC") -#+END_SRC - -It is also possible to invoke Vim Ex commands with the press of a key, and by -default it is the ~:~ key. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-ex-command-key ":") -#+END_SRC - -The below variable sets the leader key accessible in ~emacs-state~ and -~insert-state~: -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-emacs-leader-key "M-m") -#+END_SRC - -The major mode leader key is a shortcut key which is the equivalent of pressing -~ m~. Set it to ~nil~ to disable it. Its default value is ~,~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-major-mode-leader-key ",") -#+END_SRC - -In ~emacs-state~ and ~insert-state~, the same major mode leader key can be -accessible from another shortcut, which by default is ~C-M-m~ in terminal mode, -or ~M-return~ in GUI mode. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-major-mode-emacs-leader-key - (if window-system "" "C-M-m")) -#+END_SRC - -These variables control whether separate commands are bound in the GUI to the -key pairs ~C-i~ and ~TAB~, and ~C-m~ and ~RET~. Setting it to a non-nil value -allows for separate commands under ~C-i~ and ~TAB~, and ~C-m~ and ~RET~. In the -terminal, these pairs are generally indistinguishable, so this only works in the -GUI. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-distinguish-gui-tab nil) -#+END_SRC - -*** Layouts -The variable belows sets the name of the default layout. Its default value is -~"Default"~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-default-layout-name "Default") -#+END_SRC - -If non-nil, the default layout name is displayed in the mode-line. The default -value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-display-default-layout nil) -#+END_SRC - -If non-nil, then the last auto saved layouts are resumed automatically upon -start. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-auto-resume-layouts nil) -#+END_SRC - -If non-nil, the layout name will be auto-generated when creating new layouts. It -only has an effect when using the “jump to layout by number” command. The -default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-auto-generate-layout-names nil) -#+END_SRC - -*** Files-related settings -The below value sets the size in MB above which Spacemacs will prompt to open -the file literally in order to avoid preformance issues. Opening a file -literally means that no major or minor mode is active. The default value is ~1~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-large-file-size 5) -#+END_SRC - -This variable sets the location where to auto-save files. Possible values are: -- ~original~ :: auto-saves files in-place -- ~cache~ :: auto-saves files in another file stored in the cache directory -- ~nil~ :: disables auto-saving. -The default value is ~cache~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-auto-save-file-location 'original) -#+END_SRC - -*** Emacs server -Emacs can be launched as a server if the following value is set to non-nil and -if one isn’t already running. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-enable-server nil) -#+END_SRC - -You can also set a custom emacs server socket location. If the value is ~nil~, -Emacs will use whatever the Emacs default is, otherwise a directory path like -="$HOME/.config/emacs/server"=. It has no effect if ~dotspacemacs-enable-server~ -is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-server-socket-dir nil) -#+END_SRC - -It is also possible to tell Emacs that the quit function should keep the server -open when quitting. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-persistent-server t) -#+END_SRC - -*** Miscellaneous -This value changes the folding method of code blocks. The possible values are -either ~evil~, the default value, or ~origami~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-folding-method 'evil) -#+END_SRC - -If non-nil, ~smartparens-strict-mode~ will be enabled in programming modes. The -default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-smartparens-strict-mode nil) -#+END_SRC - -If non-nil, pressing the closing parenthesis ~)~ key in insert mode passes over -any automatically added closing parenthesis, bracket, quote, etc… This can -temporarily disabled by pressing ~C-q~ before ~)~. The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-smart-closing-parenthesis nil) -#+END_SRC - -List of search tool executable names. Spacemacs uses the first installed tool of -the list. Supported tools are: -- ~rg~ -- ~ag~ -- ~pt~ -- ~ack~ -- ~grep~ -The default value is ~'("rg" "ag" "pt" "ack" "grep")~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-search-tools '("rg" "grep")) -#+END_SRC - -Delete whitespace while saving buffer. Possible values are: -- ~all~ :: aggresively delete empty lines and long sequences of whitespace -- ~trailing~ :: only detele the whitespace at end of lines -- ~changed~ :: to delete only whitespace for changed lines -- ~nil~ :: disable cleanup -The default value is ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-whitespace-cleanup nil) -#+END_SRC - -Set ~gc-cons-threshold~ and ~gc-cons-percentage~ when startup finishes. This is -an advanced option and should not be changed unless you suspect performance -issues due to garbage collection operations. The default is ~'(100000000 0.1)~ -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-gc-cons '(100000000 0.1)) -#+END_SRC - -If non nil activate ~clean-aindent-mode~ which tries to correct virtual -indentation of simple modes. This can interfer with mode specific indent -handling like has been reported for ~go-mode~. If it does deactivate it here. -Default ~t~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-use-clean-aindent-mode t) -#+END_SRC - -If non ~nil~, shift your number row to match the entered keyboard layout (only -in insert state). Currently supported keyboard layouts are ~querty-us~, -~quertz-de~ and ~querty-ca-fr~. New layouts can be added in ~spacemacs-editing~ -layer. Default ~nil~. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-swap-number-row nil) -#+END_SRC - -Set ~read-process-output-max~ when startup finishes. This defines how much data -is read from a foreign process. Setting this >= 1 MB should increase performance -for lsp servers in emacs 27. -#+BEGIN_SRC emacs-lisp -(setq-default dotspacemacs-read-process-output-max (* 1024 1024 8)) -#+END_SRC - -** User Initialization -*** User Init -:PROPERTIES: -:header-args:emacs-lisp: :mkdirp yes :tangle ~/.emacs.spacemacs/private/user-init.el :exports code :results silent :lexical t -:END: -#+BEGIN_SRC emacs-lisp :exports none -;; -*- lexical-binding: t -*- -#+END_SRC - -While Emacs and especially Spacemacs loads, I want it to initialize some -elements and load some packages. First of all, I want it to load my private -Emacs config file: -#+BEGIN_SRC emacs-lisp -(load "~/.emacs.spacemacs/private/private_emacs") -#+END_SRC - -I would also like to enable the setup of flycheck for Rust when Flycheck is -loaded: -#+BEGIN_SRC emacs-lisp -(add-hook 'flycheck-mode-hook #'flycheck-rust-setup) -#+END_SRC - -By default, Flyspell should be disabled and only enabled manually. -#+BEGIN_SRC emacs-lisp -(flyspell-mode 0) -#+END_SRC - -Finally, here is a quick workaround for Tramp, sometimes it cannot connect to my -hosts if I don’t have this code snippet. -#+BEGIN_SRC emacs-lisp -(setq tramp-ssh-controlmaster-options - "-o ControlMaster=auto -o ControlPath='tramp.%%C' -o ControlPersist=no") -#+END_SRC - -#+BEGIN_SRC emacs-lisp -(require 'org) -#+END_SRC - -*** User Load -:PROPERTIES: -:header-args:emacs-lisp: :mkdirp yes :tangle ~/.emacs.spacemacs/private/user-load.el :exports code :results silent :lexical t -:END: -Then, I want a couple of requires: -#+BEGIN_SRC emacs-lisp -(require 'org-id) -(require 'org-protocol) -(require 'package) -(require 'ox-latex) -(require 'ox-publish) -(require 'tramp) -#+END_SRC - -** User Configuration -:PROPERTIES: -:header-args:emacs-lisp: :mkdirp yes :tangle ~/.emacs.spacemacs/private/user-config.el :exports code :results silent :lexical t -:END: -#+BEGIN_SRC emacs-lisp :exports none -;; -*- lexical-binding: t -*- -#+END_SRC -*** Custom functions, macros, and variables -In this section, I will put my various custom functions that do not fit in other -sections and which are more oriented towards general usage throughout Emacs and -in Elisp code. - -Almost all of my code snippets will be prefixed by either my name or the name of -the package or layer they are part of, unless they are an explicit overwrite of -a function that already exists. -**** Elisp Utilities and Predicates -***** ~phundrak-filter~ -#+name: elisp-phundrak-filter -#+BEGIN_SRC emacs-lisp -(defun phundrak-filter (fn list) - "Filter `LIST' according to the predicate `FN'. - -All elements from `LIST' that do not satisfy the predicate `FN' -will be left out of the result, while all elements that do -satisfy it will be included in the resulting list. This function -also preserves the relative position between elements that -satisfy the predicate." - (declare (pure t) (side-effect-free t)) - (when list - (let ((rest (phundrak-filter fn - (cdr list)))) - (if (funcall fn - (car list)) - (cons (car list) rest) - rest)))) -#+END_SRC - -***** ~phundrak-all?~ -This function is inspired by dash’s ~-all?~ function: it will test all the -elements of the list ~seq~ against the predicate ~fn~ which should return either -~t~ or ~nil~. If all of them return something else than ~nil~, then it is a -success, otherwise it is a failure. Note that empty lists will always return -~t~. -#+BEGIN_SRC emacs-lisp -(defun phundrak-all? (fn seq) - "Check if all members of `SEQ' satisfy predicate `FN'. Note that -it will return t if `SEQ' is nil." - (declare (pure t) (side-effect-free t)) - (if seq - (and (funcall fn (car seq)) - (phundrak-all? fn (cdr seq))) - t)) -#+END_SRC - -***** ~phundrak-none?~ -In the same vein as ~phundrak-all?~, ~phundrak-none?~ checks if all elements of -~seq~ do not satify the predicate ~fn~. Again, if the list is empty, it will -return ~t~. -#+name: elisp-phundrak-none -#+BEGIN_SRC emacs-lisp -(defun phundrak-none? (fn seq) - "Check if all members of `SEQ' do not satisfy predicate `FN'. -Note that it will return t if `SEQ' is nil." - (declare (pure t) (side-effect-free t)) - (if seq - (and (not (funcall fn (car seq))) - (phundrak-none? fn (cdr seq))) - t)) -#+END_SRC - -***** ~phundrak-zip~ -#+name: elisp-phundrak-zip -#+BEGIN_SRC emacs-lisp -(defun phundrak-zip (&rest lists) - "Zip `LISTS' together. -Be aware only the amount of elements of the smallest list will be zipped." - (declare (pure t) (side-effect-free t)) - (when lists - (let ((lists (if (= 1 (length lists)) ; only one element => a list of lists was passed - (car lists) - lists))) - (when (phundrak-none? 'null lists) - (cons (mapcar 'car lists) - (phundrak-zip (mapcar 'cdr lists))))))) -#+END_SRC - -**** Eshell Prompt-Related Functions -***** ~phundrak-eshell-git-status~ -This function is used in my Eshell prompt which you can consult [[file:./spacemacs.md#eshell-theme-and-prompt][here]]. -This function basically executes two git calls to get some information -about a git repo, which path we provide as an argument. Based on the -result of these git calls, the function will know what it needs to -know about the repo to build a git prompt that will be inserted in my -Eshell prompt. And just for shit and giggles, I’ve made it so it is a -powerline prompt. -#+BEGIN_SRC emacs-lisp -(defun phundrak-eshell-git-status ($path &optional $background-color) - "Returns a string indicating the status of the repository located -in `$PATH' if it exists. It should also append the name of the -current branch if it is not `master' or `main'. -`$BACKGROUND-COLOR' allows to choose the color that will be -visible behind the powerline characters. The theme is inspired by -the bobthefish theme for the fish shell which you can find here: -https://github.com/oh-my-fish/theme-bobthefish - -Color code: -- green: -- orange: tracked stuff is staged but not commited -- red: tracked stuff is modified and not commited - -Symbols: -- `*': dirty working dir, RED -- `~': staged changes, ORANGE -- `…': untracked files, GREEN -- `$': stashed changes -- `-': unpulled commits -- `-': unpushed commits -- `±': unpulled and unpushed commits" - (let* ((git-status-command (concat "cd " $path "; git status")) - (git-stash-status-command (concat "cd " $path "; git stash list")) - (status (eshell-command-result git-status-command)) - (stashstat (eshell-command-result git-stash-status-command)) - (detached (s-contains? "HEAD detached" status)) - (dirty (s-contains? "Changes not staged for commit" status)) - (staged (s-contains? "Changes to be committed" status)) - (untracked (s-contains? "Untracked files" status)) - (pullable (s-contains? "git pull" status)) - (pushable (s-contains? "git push" status)) - (branch (replace-regexp-in-string "On Branch \\(.*\\)\n\\(.\\|\n\\)*" "\\1" status)) - (branch (unless (or (string= "master" branch) - (string= "main" branch) - detached) - branch))) - (let ((prompt (concat " " - (if detached ">" "") - (when branch (concat " " branch " ")) - (when dirty "*") - (when staged "~") - (when untracked "…") - (cond ((and pullable pushable) "±") - (pullable "-") - (pushable "+")) - (when stashstat "$") - " ")) - (accent (cond - (dirty phundrak-nord11) - (staged phundrak-nord13) - (t phundrak-nord14))) - (background (if $background-color - $background-color - phundrak-nord0))) - (concat (with-face "" - :background accent - :foreground background) - (with-face prompt - :background accent - :foreground (if dirty phundrak-nord6 background)) - (with-face "" - :background background - :foreground accent))))) -#+END_SRC - -***** ~phundrak-git-repo-root~ -This function detects if the path passed as an argument points to a git -directory or to one of its subdirectories. If it is, it will return the path to -the root of the git repository, else it will return ~nil~. -#+BEGIN_SRC emacs-lisp -(defun phundrak-git-repo-root ($path) - "Return `$PATH' if it points to a git repository or one of its -subdirectories." - (when $path - (if (f-dir? (concat $path "/.git")) - $path - (phundrak-git-repo-root (f-parent $path))))) -#+END_SRC - -***** ~phundrak-prompt-toggle-abbreviation~ -#+BEGIN_SRC emacs-lisp -(defvar phundrak-prompt--abbreviate t - "Whether or not to abbreviate the displayed path in the Eshell -prompt.") - -(defun phundrak-prompt-toggle-abbreviation () - "Toggles whether the Eshell prompt should shorten the name of -the parent directories or not. See `phundrak-eshell-prompt'." - (interactive) - (setq phundrak-prompt--abbreviate (not phundrak-prompt--abbreviate))) -#+END_SRC - -***** ~phundrak-abbr-path~ -The following is a nice little function I use in my Eshell prompt. It shortens -the name of all the parent directories of the current one in its path, but -leaves the current one written in full. It also abbreviates the equivalent of -the ~$HOME~ (~/home//~) directory to a simple =~=. -#+BEGIN_SRC emacs-lisp -(defun phundrak-abbr-path ($path &optional $abbreviate) - "Abbreviate `$PATH'. If `$ABBREVIATE' is t, then all parent -directories of the current directory will be abbreviated to one -letter only. If a parent directory is a hidden directory (i.e. -preceeded by a dot), the directory will be abbreviated to the dot -plus the first letter of the name of the directory (e.g. -\".config\" -> \".c\"). - -For public use of the function, `$PATH' should be a string -representing a UNIX path. For internal use, `$PATH' can also be a -list. If `$PATH' is neither of those, an error will be thrown by -the function." - (cond - ((stringp $path) (f-short - (if $abbreviate - (phundrak-abbr-path (f-split (phundrak-abbr-path $path))) - $path))) - ((null $path) "") - ((listp $path) - (f-join (cond ((= 1 (length $path)) (car $path)) - (t (let* ((dir (car $path)) - (first-char (s-left 1 dir))) - (if (string= "." first-char) - (s-left 2 dir) - first-char)))) - (phundrak-abbr-path (cdr $path)))) - (t (error "Invalid argument %s, neither stringp nor listp" $path)))) -#+END_SRC - -**** Files-Related Functions -***** ~phundrak-file-to-string~ -#+BEGIN_SRC emacs-lisp -(defun phundrak-file-to-string (FILE) - "Returns the content of `FILE' as a string." - (with-temp-buffer - (insert-file-contents FILE) - (buffer-string))) -#+END_SRC - -***** ~phundrak-find-org-files~ -There are lots of files which I want to be able to quickly open. I used to have -one shortcut for each one of these files, but as their number grew, I decided to -switch to helm for my file selector which will be called by only one common -shortcut. Most of my files will be located in =~/org=, but I have some -conlanging files which are located in =~/Documents/conlanging=, and all my -university notes are in =~/Documents/university=. Let’s declare these -directories in a variable: -#+BEGIN_SRC emacs-lisp -(defvar phundrak-org-directories '("~/org" - "~/Documents/university/S8" - "~/Documents/conlanging") - "Directories in which to look for org files with the function -`phundrak-find-org-files'.") -#+END_SRC - -With this established, let’s write some emacs-lisp that will allow me to get a -list of all these files and select them through helm. Be aware that I will be -using some functions from third party packages, such as [[https://github.com/magnars/s.el][s.el]] and [[https://github.com/magnars/dash.el][dash]], as well -as [[https://github.com/sharkdp/fd][fd]]. -#+BEGIN_SRC emacs-lisp -(defun phundrak-find-org-files () - "Find all org files in the directories listed in -`phundrak-org-directories', then list them in an ido buffer where -the user can match one and open it." - (interactive) - (find-file - (ivy-completing-read - "Org File: " - (s-split "\n" - (mapconcat (lambda (path) - (shell-command-to-string - (format "fd . %s -e org -c never" path))) - phundrak-org-directories - "\n"))))) -#+END_SRC - -***** ~phundrak-open-marked-files~ -This function is particularly useful in Dired buffers when someone wants to open -multiple files. This function will basically look for all marked files in the -current dired buffer and open each one of them in their individual buffer. -#+BEGIN_SRC emacs-lisp -(defun phundrak-open-marked-files () - "This function allows the user to open all marked files in a -Dired buffer at once." - (interactive) - (let ((file-list (if (string= major-mode "dired-mode") - (dired-get-marked-files) - (list (buffer-file-name))))) - (mapc (lambda (file) - (find-file file)) - file-list))) -#+END_SRC - -***** ~xah/open-in-external-app~ -Here is another of Xah’s functions, this time to open a file externally to -Emacs. For instance, I sometimes want to open a PDF in Zathura rather than in -Emacs, or an HTML file in Firefox. With this function, it is now possible! -#+BEGIN_SRC emacs-lisp -(defun xah/open-in-external-app (&optional files) - "Open the current file or dired marked files in external app. -The app is chosen from your OS’ preference. - -When called in emacs lisp, if `FILES' is given, open that. - -URL `http://ergoemacs.org/emacs/emacs_dired_open_file_in_ext_apps.html' -Version 2019-01-18" - (interactive) - (let* (($file-list (if files - (progn (list files)) - (if (string-equal major-mode "dired-mode") - (dired-get-marked-files) - (list (buffer-file-name))))) - ($do-it-p (if (<= (length $file-list) 5) - t - (y-or-n-p "Open more than 5 files? ")))) - (when $do-it-p - (mapc (lambda ($fpath) - (let ((process-connection-type nil)) - (start-process "" nil "xdg-open" $fpath))) - $file-list)))) -#+END_SRC - -**** Theming -***** Nord theming variables -Yes, I do use a preconfigured theme, as mentioned above, but for some elements -such as Eshell, I need to define some variables for color, and I’ll do it here. -#+BEGIN_SRC emacs-lisp -(defvar phundrak-nord0 "#2e3440") -(defvar phundrak-nord1 "#3b4252") -(defvar phundrak-nord2 "#434c5e") -(defvar phundrak-nord3 "#4c566a") -(defvar phundrak-nord4 "#d8dee9") -(defvar phundrak-nord5 "#e5e9f0") -(defvar phundrak-nord6 "#eceff4") -(defvar phundrak-nord7 "#8fbcbb") -(defvar phundrak-nord8 "#88c0d0") -(defvar phundrak-nord9 "#81a1c1") -(defvar phundrak-nord10 "#5e81ac") -(defvar phundrak-nord11 "#bf616a") -(defvar phundrak-nord12 "#d08770") -(defvar phundrak-nord13 "#ebcb8b") -(defvar phundrak-nord14 "#a3be8c") -(defvar phundrak-nord15 "#b48ead") -#+END_SRC - -***** ~with-face~ -~with-face~ is a simple yet very useful macro that allows me to easily create -strings with faces defined as properties to the string passed as the first -argument. Here is how it is implemented: -#+BEGIN_SRC emacs-lisp -(defmacro with-face ($str &rest $properties) - "Helper macro for creating strings `$STR' with `$PROPERTIES'" - `(propertize ,$str 'face (list ,@$properties))) -#+END_SRC - -**** ~phundrak-blog-publish~ -This function is quite a simple function made to automatically publish [[https://blog.phundrak.com][my blog]] -based on Hugo. After exporting my blog using ~ox-hugo~, I simply have to call -this function which will look for all files located in =~/org/blog/public= and -copy them to my remote server once ~hugo~ has been executed in =~/org/blog=. -#+BEGIN_SRC emacs-lisp -(defun phundrak-blog-publish () - "Publish my blog through Hugo and rsync to my remote server." - (interactive) - (let* ((blog-path "~/org/blog") - (public-path (concat blog-path "/public")) - (target-path "/rsync:Tilo:/home/phundrak/www/phundrak.com/blog")) - (shell-command (format "cd %s && hugo" blog-path)) - (let ((files (mapcar (lambda (file) - (f-relative file public-path)) - (f-files (format "%s/public" blog-path) nil t)))) - (dolist (file files) - (copy-file (concat public-path "/" file) - (concat target-path "/" file) - t nil t))))) -#+END_SRC - -**** ~phundrak-yas-rust-new-assignments~ -The following function is a function that will allow me to easily create ~new~ -functions for Rust structs. Inspired from [[https://github.com/jorgenschaefer/elpy][elpy]]’s ~elpy-snippet-init-assignments~ -function, it will automatically write assignments to my new struct as I write -new parameters in the ~new~ function. It also comes with a helper function that -parses the arguments given to the ~new~ function. -#+BEGIN_SRC emacs-lisp -(defun phundrak--yas-snippet-split-rust-args ($arg-string) - "Split a Rust argument string `$ARG-STRING' into ((name, -default)...) tuples" - (mapcar (lambda ($elem) - (split-string $elem "[[:blank:]]*:[[:blank:]]*" t)) - (split-string $arg-string "[[:blank:]]*,[[:blank:]]*" t))) - -(defun phundrak-yas-rust-new-assignments ($arg-string) - "Return a typical new assignment for arguments. -Inspired from elpy’s functions https://github.com/jorgenschaefer/elpy" - (let ((indentation (make-string (save-excursion - (goto-char start-point) - (current-indentation)) - ?\s))) - (mapconcat (lambda ($elem) - (if (string-match "^\\*" (car $elem)) - "" - (format "%s,\n%s" (car $elem) indentation))) - (phundrak--yas-snippet-split-rust-args $arg-string) - ""))) -#+END_SRC - -**** ~screenshot-svg~ -This function allows for taking SVG screenshots of Emacs from itself using -Cairo. The function definition was taken [[https://github.com/caiohcs/my-emacs#screenshots][from here]]. -#+BEGIN_SRC emacs-lisp -(defun screenshot-svg () - "Save a screenshot of the current frame as an SVG image. -Saves to a temp file and puts the filename in the kill ring." - (interactive) - (let* ((filename (make-temp-file "Emacs" nil ".svg")) - (data (x-export-frames nil 'svg))) - (with-temp-file filename - (insert data)) - (kill-new filename) - (message filename))) -#+END_SRC - -**** ~xah/dired-sort~ -This function comes directly from Xah Lee’s website and allows the user to sort -files in a dired buffer depending on four factors: - - File name - - File size - - Last modification date - - File extension -#+BEGIN_SRC emacs-lisp -(defun xah/dired-sort () - "Sort dired dir listing in different ways. Prompt for a choice. -URL `http://ergoemacs.org/emacs/dired_sort.html' -Version 2018-12-23, modified by Phundrak on 2019-08-06" - (interactive) - (let ($sort-by $arg) - (setq $sort-by (ido-completing-read "Sort by:" '( "name" "size" "date" "extension" ))) - (cond - ((equal $sort-by "name") (setq $arg "-ahl --group-directories-first")) - ((equal $sort-by "date") (setq $arg "-ahl -t --group-directories-first")) - ((equal $sort-by "size") (setq $arg "-ahl -S --group-directories-first")) - ((equal $sort-by "extension") (setq $arg "-ahlD -X --group-directories-first")) - (t (error "logic error 09535" ))) - (dired-sort-other $arg ))) -#+END_SRC - -*** Editing and modes -There is first a setting I would like to enable to make the navigation through -text a bit easier which is to enable the subword mode. This allows me to iterate -through words that are in CamelCase more easily, I don’t have to go either to -the beginning or the end of the word and then move my cursor a bunch of times to -get to the subword I want to modify. -#+BEGIN_SRC emacs-lisp -(global-subword-mode 1) -#+END_SRC - -**** Default modes -Some buffers sometimes won’t have a default mode at all, such as the ~*scratch*~ -buffer. In any vanilla configuration, they will then default to ~text-mode~. I -personally prefer ~org-mode~ to be my default mode, so let’s set it so! -#+BEGIN_SRC emacs-lisp -(setq edit-server-default-major-mode 'org-mode) -#+END_SRC - -**** Evil -Evil is not really smart by default when I ask it to undo stuff. As an example, -let’s say I enter insert-mode and write a whole paragraph, and then I exit -insert-mode back to normal-mode, and I notice a small mistake I made when typing -my stuff down, like accidentally using a snippet from yasnippet, and I want to -undo that. My initial reaction would be to press ~u~ to undo, and so would be -yours too right? That’s the wrong answer with evil, since it considers your -actions between entering and leaving insert-mode as only one action, and it -would thus erase your /WHOLE PARAGRAPH/. Fortunately, there is a way to make the -undo action more granular, but it comes at the cost of increasing the amount of -undo actions you can do (which shouldn’t really matter if you don’t have a -potato PC). -#+BEGIN_SRC emacs-lisp -(setq undo-limit 500000 - evil-want-fine-undo t) -#+END_SRC - -**** File extensions -Sometimes, Emacs doesn’t recognize or misrecognizes some extensions, resulting -in a wrong mode set for said file. Let’s fix that by associating the extension -with the desired mode: -#+BEGIN_SRC emacs-lisp -(dolist (e '(("xml" . web-mode) - ("xinp" . web-mode) - ("aiml" . web-mode) - ("C" . c++-mode) - ("dconf" . conf-mode) - ("yy" . bison-mode) - ("ll" . flex-mode) - ("s" . asm-mode) - ("pl" . prolog-mode) - ("l" . scheme-mode) - ("vs" . glsl-mode) - ("fs" . glsl-mode))) - (push (cons (concat "\\." - (car e) - "\\'") (cdr e)) - auto-mode-alist)) -#+END_SRC - -We also have a couple of extensions which should all be in ~conf-unix-mode~, -let’s indicate that to Emacs: -#+BEGIN_SRC emacs-lisp -(dolist (e '("service" "timer" "target" "mount" "automount" - "slice" "socket" "path" "netdev" "network" - "link")) - (push (cons (concat "\\." e "\\'") 'conf-unix-mode) - auto-mode-alist)) -#+END_SRC - -**** Hooks -I also have some hooks I use for enabling some major and minor modes. The first -one here allows the execution of the deletion of trailing space each time I save -a file. -#+BEGIN_SRC emacs-lisp -(add-hook 'before-save-hook 'delete-trailing-whitespace) -#+END_SRC - -I also want to always be in ~visual-line-mode~ so Emacs soft-wraps lines that -are too long for the buffer they are displayed in. This will also be enabled for -Elfeed. -#+BEGIN_SRC emacs-lisp -(add-hook 'prog-mode-hook 'visual-line-mode) -(add-hook 'elfeed-read-mode-hook 'visual-line-mode) -#+END_SRC - -I also want for some non-programming modes to enable a hard-limit in terms of -how many characters can fit on one line. The modes that benefit are -~message-mode~, ~org-mode~, ~text-mode~ and ~markdown-mode~. -#+BEGIN_SRC emacs-lisp -(mapc (lambda (x) - (add-hook x 'visual-line-mode)) - '(message-mode-hook - text-mode-hook - markdown-mode-hook)) -#+END_SRC - -**** Twittering mode -For ~twittering-mode~, a Twitter major mode for Emacs, I want to encrypt my data -using a master password, which I do thanks to this option: -#+BEGIN_SRC emacs-lisp -(setq twittering-use-master-password t) -#+END_SRC - -**** Wrapping regions -I really like the ~M-(~ keybinding for wrapping a selected region between -parenthesis. However, parenthesis are not everything (even in Lisp dialects), -and other wrappers could be nice. And they are! Here is how they are declared: -#+BEGIN_SRC emacs-lisp -(global-set-key (kbd "M-[") 'insert-pair) -(global-set-key (kbd "M-{") 'insert-pair) -(global-set-key (kbd "M-<") 'insert-pair) -(global-set-key (kbd "M-'") 'insert-pair) -(global-set-key (kbd "M-`") 'insert-pair) -(global-set-key (kbd "M-\"") 'insert-pair) -#+END_SRC - -For the record, this is from [[http://www.howardism.org/][Howard Abram]]’s [[https://github.com/howardabrams/dot-files][dotfiles]]. - -*** Emacs builtins -**** Dired -When it comes to dired, I chose do modify some elements on how things are sorted -and shown, but there isn’t much configuration. First, I want to always copy -folders in a recursive way, no questions asked. -#+BEGIN_SRC emacs-lisp -(setq dired-recursive-copies 'always) -#+END_SRC - -Also, when I have two Dired buffers opened side by side, I generally want them -to interact with each other, for example if I want to move around or copy stuff. -So, let’s tell Emacs that: -#+BEGIN_SRC emacs-lisp -(setq dired-dwim-target t) -#+END_SRC - -Finally, let’s tell Dired how to sort the elements to be displayed: directories -first, non-hidden first. -#+BEGIN_SRC emacs-lisp -(setq dired-listing-switches "-ahl --group-directories-first") -#+END_SRC - -By the way, let’s enable ~org-download~ when we are in a Dired buffer: -#+BEGIN_SRC emacs-lisp -(add-hook 'dired-mode-hook 'org-download-enable) -#+END_SRC - -Finally, let’s enable globally ~diredfl~ so we can get a colourful Dired buffer -each time we open one: -#+BEGIN_SRC emacs-lisp -(diredfl-global-mode 1) -#+END_SRC - -**** Emacs Lisp -For some reason, =flycheck-mode= is not enabled by default when in an elisp -buffer. Let’s add that: -#+BEGIN_SRC emacs-lisp -(add-hook 'emacs-lisp-mode-hook 'flycheck-mode) -#+END_SRC - -**** Eshell -Eshell is a built-in shell available from Emacs which I use almost as often as -Fish. Some adjustments are necessary for making this shell usable for me. - -But first, here is a screenshot of what to expect visually from my configuration -of Eshell when it is launched: - -[[file:../emacs/img/eshell.svg]] - -***** Aliases -This function is a function that will come in very handy for Eshell functions -that call shell processes. It concatenates the initial string ~command~ with all -the arguments ~args~, each separated with a space. -#+BEGIN_SRC emacs-lisp -(defun phundrak/concatenate-shell-command ($command &rest $args) - (string-join (cons $command $args) " ")) -#+END_SRC - -Just like most shells, it is possible to declare in Eshell aliases. First, I -would like to be able to use ~open~ to open files in Emacs: -#+BEGIN_SRC emacs-lisp -(defalias 'open 'find-file) -#+END_SRC - -I also have ~openo~ which allows me to perform the same action, but in another -window: -#+BEGIN_SRC emacs-lisp -(defalias 'openo 'find-file-other-window) -#+END_SRC - -The function ~yes-or-no-p~ is also aliased to ~y-or-n-p~ so I only have to -answer by ~y~ or ~n~ instead of typing ~yes~ or ~no~. -#+BEGIN_SRC emacs-lisp -(defalias 'yes-or-no-p 'y-or-n-p) -#+END_SRC - -For some ease of use, I’ll also declare ~list-buffers~ as an alias of ~ibuffer~. -#+BEGIN_SRC emacs-lisp -(defalias 'list-buffers 'ibuffer) -#+END_SRC - -~mkcd~ is a function that allows me to create a directory and ~cd~ into it at -the same time. -#+begin_src emacs-lisp -(defun eshell/mkcd ($directory) - (eshell/mkdir "-p" $directory) - (cd $directory)) -#+end_src - -***** Custom functions -When I’m in Eshell, sometimes I wish to open multiple files at once in Emacs. -For this, when I have several arguments for ~find-file~, I want to be able to -open them all at once. Let’s modify ~find-file~ like so: -#+BEGIN_SRC emacs-lisp -(defadvice find-file (around find-files activate) - "Also find all files within a list of files. This even works recursively." - (if (listp filename) - (cl-loop for f in filename do (find-file f wildcards)) - ad-do-it)) -#+END_SRC - -I also want to be able to have multiple instances of Eshell opened at once. For -that, I declared the function ~eshell-new~ that does exactly that. -#+BEGIN_SRC emacs-lisp -(defun eshell-new() - "Open a new instance of eshell." - (interactive) - (eshell 'N)) -#+END_SRC - -****** Redirect text editors to Emacs -I still have some stupid muscle memory telling me to open ~emacs~ in the -terminal, which is stupid with Eshell since I’m already inside Emacs. So, let’s -open each file passed to the ~emacs~ command and bury the eshell buffer (we’ll -get back to it later). -#+BEGIN_SRC emacs-lisp -(defun eshell/emacs (&rest $files) - "Open a file in a new buffer. Old habits die hard" - (if $files - (mapc #'find-file - (mapcar #'expand-file-name - (eshell-flatten-list (reverse $files)))) - (bury-buffer))) -#+END_SRC - -***** Environment variables -Some environment variables need to be correctly set so Eshell can correctly -work. The first environment variable to be set is the ~PATH~, as I have a couple -of directories where executables are located. Let’s add them to our path. -#+BEGIN_SRC emacs-lisp -(setenv "PATH" - (concat - (getenv "HOME") "/.pub-cache/bin" - ":" (getenv "HOME") "/.local/bin" - ":" (getenv "HOME") "/go/bin" - ":" (getenv "HOME") "/.cargo/bin" - ":" (getenv "HOME") "/.gem/ruby/2.6.0/bin" - ":" (getenv "PATH"))) -#+END_SRC - -I would also like to set two environment variables related to Dart development: -the ~DART_SDK~ and ~ANDROID_HOME~ variables. -#+BEGIN_SRC emacs-lisp -(setenv "DART_SDK" "/opt/dart-sdk/bin") -(setenv "ANDROID_HOME" (concat (getenv "HOME") "/Android/Sdk/")) -#+END_SRC - -Finally, I’d like to add a custom directory to the ~PKG_CONFIG_PATH~: -#+BEGIN_SRC emacs-lisp -(setenv "PKG_CONFIG_PATH" (concat - "/usr/local/lib/pkgconfig/" ":" - (getenv "PKG_CONFIG_PATH"))) -#+END_SRC - -The ~EDITOR~ variable also needs to be set for git commands, especially the -~yadm~ commands. -#+BEGIN_SRC emacs-lisp -(setenv "EDITOR" "emacsclient -c") -#+END_SRC - -#+BEGIN_SRC emacs-lisp -(setenv "SHELL" "/bin/sh") -#+END_SRC - -***** Eshell banner -The code creating the Eshell banner is a bit lengthy and requires some -additional explanations that would make the following chapter [[file:./spacemacs.md#eshell-theme-and-prompt][Eshell -theme and prompt]] too long. So, here it is! - -The banner for Eshell will collect some system information and display them -gracefully. These pieces of information are: -- The GNU/Linux distribution running (I do not use any other OS on my computer) -- The kernel name and its version -- The machine’s hostname -- Its uptime -- Its RAM and Swap usage -- How full are its mountpoints -Some of these information can be grabbed directly from Emacs built-in functions, -but some others need to be retrieved manually. Let’s first get into it with the -mounted partitions for which we’ll define a structure: -#+BEGIN_SRC emacs-lisp -(cl-defstruct phundrak/mounted-partitions - "Object representing a mounted partition found in the system" - path size used percent) -#+END_SRC - -We’ll also define a variable setting the maximum length of a partition path -before it gets abbreviated: -#+BEGIN_SRC emacs-lisp -(defvar phundrak//eshell-banner--max-length-part 13 - "Maximum length of a partition path") -#+END_SRC - -Now, we can get our partitions. For this, we’ll make a call to the -shell command ~df -lH~ and we’ll keep only the partitions mounted on a -device stored in ~/dev~, for instance on ~/dev/sda~. And as mentioned -above, if the mount path of the partition exceeds the length specified -by ~phundrak//eshell-banner--max-length-part~, it will get abbreviated -by [[file:./spacemacs.md#phundrak-abbr-path][=phundrak-abbr-path=]]. -#+BEGIN_SRC emacs-lisp -(defun phundrak/get-mounted-partitions () - (let ((partitions (s-split "\n" - (shell-command-to-string "df -lH") - t))) - (-keep (lambda (partition) - (let* ((partition (s-split " " partition t)) - (filesystem (nth 0 partition)) - (size (nth 1 partition)) - (used (nth 2 partition)) - (percent (nth 4 partition)) - (mount (nth 5 partition))) - (when (s-prefix? "/dev" filesystem) - (make-phundrak/mounted-partitions - :path (if (> phundrak//eshell-banner--max-length-part (length mount)) - mount - (phundrak-abbr-path mount t)) - :size size - :used used - :percent (string-to-number (s-chop-suffix "%" percent)))))) - partitions))) -#+END_SRC - -We’ll need some padding for the name of the information displayed on the left -hand side of the banner. The maximum length without any partitions is eight -characters due to the text ~Hostname~, so if any partition path is longer than -this, the left padding will increase. -#+BEGIN_SRC emacs-lisp -(defun phundrak//eshell-banner--get-left-pad (initial-pad partitions) - (if partitions - (let ((part-length (length (phundrak/mounted-partitions-path (car partitions))))) - (phundrak//eshell-banner--get-left-pad (if (> part-length initial-pad) - part-length - initial-pad) - (cdr partitions))) - initial-pad)) -#+END_SRC - -Now, Let’s set three variables that will be used in the function following this -declaration. They will be used to determine in which color a percentage should -be displayed. I’ll consider any percentage below 60% to be acceptable and -therefore displayed in green. However, starting from this threshold, I want the -user to be noticed of the usage of whatever percentage shown that it has gone up -and it should be watched and displayed in yellow. Above 75%, the user should -consider this a warning, and the percentage will be displayed in orange. Above -90%, it is considered critical and the percentage will be displayed in red. -#+BEGIN_SRC emacs-lisp -(defvar phundrak//eshell-banner--critical-percentage 90) -(defvar phundrak//eshell-banner--warning-percentage 75) -(defvar phundrak//eshell-banner--notice-percentage 60) - -(defun phundrak//eshell-banner--color-percentage (percentage) - (cond - ((> percentage phundrak//eshell-banner--critical-percentage) - (with-face (format "%2d" percentage) :foreground phundrak-nord11)) - ((> percentage phundrak//eshell-banner--warning-percentage) - (with-face (format "%2d" percentage) :foreground phundrak-nord12)) - ((> percentage phundrak//eshell-banner--notice-percentage) - (with-face (format "%2d" percentage) :foreground phundrak-nord13)) - (t - (with-face (format "%2d" percentage) :foreground phundrak-nord14)))) -#+END_SRC - -This function will be used when displaying progress bars. These will be used for -displaying the Ram, Swap and partitions usage of the system, displaying the used -part in red and the free part in green. For this, we just need to know the size -of the progress bar we wish to use as well as how full it should be. Note that -the percentage should be between 0 and 100. -#+BEGIN_SRC emacs-lisp -(defun phundrak//eshell-banner--progress-bar (length percentage) - (let* ((length-green (if (= 0 percentage) - 0 - (/ (* length percentage) 100))) - (length-red (- length length-green))) - (concat (with-face "[" :weight 'bold) - (with-face (s-repeat length-green "=") - :weight 'bold :foreground phundrak-nord14) - (with-face (s-repeat length-red "=") - :weight 'bold :foreground phundrak-nord11) - (with-face "]" :weight 'bold)))) -#+END_SRC - -This function will be used in two distinct functions: ~phundrak-eshell-banner~ -which we will see later, and ~phundrak//eshell-banner--display-memory~ which we -will see now. This function displays information for the two types of memory we -have, RAM and Swap memory. Here is the definition of this function: -#+BEGIN_SRC emacs-lisp -(defun phundrak//eshell-banner--display-memory (type used total text-padding ramp-length) - (let ((percentage (if (= used 0) - 0 - (/ (* 100 used) total)))) - (concat (s-pad-right text-padding "." type) - ": " - (phundrak//eshell-banner--progress-bar ramp-length - percentage) - (format " %6s / %-5s (" - (file-size-human-readable used) - (file-size-human-readable total)) - (phundrak//eshell-banner--color-percentage - percentage) - "%)\n"))) -#+END_SRC - -We now need a function for displaying partitions. As you can see, it will be -quite similar to the above one: -#+BEGIN_SRC emacs-lisp -(defun phundrak//eshell-banner--display-partition (part left-pad ramp-length) - (concat (s-pad-right left-pad "." - (with-face (phundrak/mounted-partitions-path part) - :weight 'bold)) - ": " - (phundrak//eshell-banner--progress-bar ramp-length - (phundrak/mounted-partitions-percent part)) - (format " %6s / %-5s (%s%%)" - (phundrak/mounted-partitions-used part) - (phundrak/mounted-partitions-size part) - (phundrak//eshell-banner--color-percentage (phundrak/mounted-partitions-percent part))))) -#+END_SRC - -And we can now build our banner! Here is our function that does exactly that: -#+BEGIN_SRC emacs-lisp -(defun phundrak-eshell-banner () - (let* ((partitions (phundrak/get-mounted-partitions)) - (os (replace-regexp-in-string - ".*\"\\(.+\\)\"" - "\\1" - (car (-filter (lambda (line) - (s-contains? "PRETTY_NAME" line)) - (s-lines (phundrak-file-to-string "/etc/os-release")))))) - (memory (-map (lambda (line) - (s-split " " line t)) - (s-split "\n" - (shell-command-to-string "free -b | tail -2") - t))) - (ram (nth 0 memory)) - (swap (nth 1 memory)) - (ramp-length 41) - (left-pad (phundrak//eshell-banner--get-left-pad phundrak//eshell-banner--max-length-part partitions)) - (right-pad 8) - (left-column-width 27)) - (concat (format "%s\n" (s-repeat 79 "=")) - ;; OS and Kernel - (format "%s: %s%s: %s\n" - (s-pad-right left-pad "." "OS") - (s-pad-right left-column-width - " " - (with-face (s-trim os) - :weight 'bold)) - (s-pad-right right-pad "." "Kernel") - (with-face (concat "Linux " operating-system-release) - :weight 'bold)) - ;; Hostname and Uptime - (format "%s: %s%s: %s\n" - (s-pad-right left-pad "." "Hostname") - (s-pad-right left-column-width - " " - (with-face (system-name) :weight 'bold)) - (s-pad-right right-pad "." "Uptime") - (with-face (s-chop-prefix "up " - (s-trim (shell-command-to-string "uptime -p"))) - :weight 'bold)) - ;; RAM ramp - (phundrak//eshell-banner--display-memory "Ram" - (string-to-number (nth 2 ram)) - (string-to-number (nth 1 ram)) - left-pad - ramp-length) - ;; SWAP ramp - (phundrak//eshell-banner--display-memory "Swap" - (string-to-number (nth 2 swap)) - (string-to-number (nth 1 swap)) - left-pad - ramp-length) - ;; Partitions - (mapconcat (lambda (part) - (phundrak//eshell-banner--display-partition part left-pad ramp-length)) - partitions - "\n") - (format "\n%s\n" (s-repeat 79 "="))))) -#+END_SRC - -We now only have to set the result of this function as our Eshell banner. Since -a simple ~setq~ would only run ~phundrak-eshell-banner~ once when Emacs starts, -we’ll actually make Emacs set the value of ~eshell-banner-message~ each time it -is required by Eshell with a hook: -#+BEGIN_SRC emacs-lisp -(add-hook 'eshell-banner-load-hook - (lambda () - (setq eshell-banner-message (phundrak-eshell-banner)))) -#+END_SRC - -***** Eshell theme and prompt -As with most shells, again, it is possible to customize the appearance -of the Eshell prompt. As you can see, my prompt has some Nord colors, -a shortened path, a git prompt, and an indicator of whether the -previous command succeeded or failed. Note however that the -abbreviation of the current path depends on the value of -~phundrak-prompt--abbreviate~, if it is ~t~ it is abbreviated; otherwise, -it is kept in full. It can be toggled with a keyboard shortcut, see -[[file:./spacemacs.md#toggle][Keybinds: Toggle]]. -#+BEGIN_SRC emacs-lisp -(defun phundrak-eshell-prompt () - "Definition of my prompt for Eshell -It displays a powerline prompt, with first an abbreviated path to -the current directory. If `phundrak-prompt--abbreviate' is `t', -then all preceding directories will be abbreviated to one -character, except hidden directory which first character will be -preceded by a dot. Otherwise, the full name of the directories is -displayed. - -Then, if the current directory is a git repository or one of its -subdirectories, it will display the current state of the -repository. See `phundrak-eshell-git-status' - -Finally, a lambda character is displayed, either in blue or in -red depending on if the last eshell command was a success or a -failure respectively." - (let* ((header-bg phundrak-nord0) - ($path (phundrak-abbr-path (eshell/pwd))) - ($git-path (phundrak-git-repo-root $path)) - ($abbr-path (phundrak-abbr-path $path phundrak-prompt--abbreviate)) - ($background phundrak-nord1) - ($foreground phundrak-nord14) - ($success phundrak-nord10) - ($error phundrak-nord11)) - (concat (with-face (concat " " - (phundrak-abbr-path (if $git-path - $git-path - $path) - phundrak-prompt--abbreviate) - " ") - :foreground $foreground - :background $background) - (when $git-path - (concat (phundrak-eshell-git-status $path $background) - (with-face (format "%s " - (let (($in-git-path (phundrak-abbr-path (f-relative $path $git-path) - phundrak-prompt--abbreviate))) - (if (string= "." $in-git-path) - "" - (concat " " $in-git-path)))) - :foreground $foreground - :background $background))) - (with-face "λ " - :foreground (if (zerop eshell-last-command-status) - $success - $error) - :background $background) - (with-face "" :foreground $background) - " "))) -#+END_SRC - -Now, let’s declare our prompt regexp and our prompt functions: -#+BEGIN_SRC emacs-lisp -(setq eshell-prompt-regexp "^[^\n]*λ  " - eshell-prompt-function 'phundrak-eshell-prompt) -#+END_SRC - -I also don't want the banner to be displayed, I know I entered the Elisp shell, -no need to remind me. Maybe I’ll do something with it one day. -#+BEGIN_SRC emacs-lisp -(setq eshell-banner-message "") -#+END_SRC - -Finally, let’s enable some fish-like syntax highlighting: -#+BEGIN_SRC emacs-lisp -(eshell-syntax-highlighting-global-mode +1) -#+END_SRC - -****** TODO Fix right column padding :noexport: -The uptime can get longer than allocated in the banner and be longer than the -theoretical longest line the banner can be. Execute the ~uptime~ command, find -out the length of the result and compute the padding based on the maximum length -between the kernel’s name and the uptime’s length. - -****** TODO Add battery level to banner :noexport: -Add battery level to banner if computer is a laptop, and display if it is -charging or discharging. See [[https://tecosaur.github.io/emacs-config/config.html#simple-settings][Tecosaur’s config]] for a way to detect if a battery -is present or not (basically use the function ~battery~). - -***** Visual commands -With Eshell, some commands don’t work very well, especially commands that create -a TUI. So, let’s declare them as visual commands or subcommands: -#+BEGIN_SRC emacs-lisp -(setq eshell-visual-commands - '("fish" "zsh" "bash" "tmux" "htop" "top" "vim" "bat" "nano") - eshell-visual-subcommands - '("git" "log" "l" "diff" "show")) -#+END_SRC - -**** Org-mode -:PROPERTIES: -:header-args:emacs-lisp: :tangle no :exports code :results silent -:END: -Org-mode is probably one of the best if not the best Emacs feature I have ever -discovered. It is awesome for writing documents, regardless of the format you -need it to be exported to, for agenda management, and for literary programming, -such as with this document. -#+BEGIN_SRC emacs-lisp -(with-eval-after-load 'org - ;; configuration goes here - ) -#+END_SRC - -#+BEGIN_SRC emacs-lisp :tangle ~/.emacs.spacemacs/private/user-config.el :exports none :noweb yes -(with-eval-after-load 'org - ;; agenda - <> - <> - ;; Babel - <> - <> - <> - <> - ;; Beautiful org - <> - <> - <> - <> - <> - <> - <> - <> - <> - ;; Capture - <> - <> - ;; Custom functions - ;;;; Better IDs - <> - <> - <> - <> - ;; File export - <> - ;;;; Latex - <> - <> - <> - <> - <> - ;;;; HTML - <> - <> - ;; Latex Formats - <> - ;; Projects - <> - ;; Variables - ;;;; Behavior - <> - <> - <> - <> - <> - <> - <> - ;;;; User information - <> - ) -#+END_SRC - -***** Agenda -One awesome feature of Org mode is the agenda. By default, my agendas are stored -in =~/org/agenda=. -#+NAME: org-agenda-files -#+BEGIN_SRC emacs-lisp -(setq org-agenda-files (list "~/org/agenda" "~/org/notes.org")) -#+END_SRC - -I also have a custom command in Org agenda to mark some tasks as daily tasks -with the =:DAILY:= tag,: -#+NAME: org-agenda-custom-commands -#+BEGIN_SRC emacs-lisp -(setq org-agenda-custom-commands - '(("h" "Daily habits" - ((agenda "")) - ((org-agenda-show-log t) - (org-agenda-ndays 7) - (org-agenda-log-mode-items '(state)) - (org-agenda-skip-function - '(org-agenda-skip-entry-if 'notregexp - ":DAILY:")))) - ("Y" "Yearly events" - ((agenda "")) - ((org-agenda-show-log t) - (org-agenda-ndays 365) - (org-agenda-log-mode-items '(state)) - (org-agenda-skip-entry-if 'notregexp - ":YEARLY:"))))) -#+END_SRC - -***** Babel -One of the amazing features of org-mode is its literary programming capacities -by running code blocks from within Org-mode itself. But for that, only a couple -of languages are supported directly by Org-mode itself, and they need to be -activated. Here are the languages I activated in my Org-mode configuration: -#+NAME: org-babel-languages-table -| C | -| dot | -| emacs-lisp | -| gnuplot | -| latex | -| latex-as-png | -| makefile | -| plantuml | -| python | -| restclient | -| sass | -| scheme | -| shell | - -#+NAME: org-babel-languages-gen -#+header: :cache yes :results replace -#+header: :var languages=org-babel-languages-table[,0] -#+BEGIN_SRC emacs-lisp :exports none -(format "'(%s)" - (mapconcat (lambda ($language) - (format "(%s . t)" $language)) - languages - "\n ")) -#+END_SRC - -#+RESULTS[71d98616bf4f1351ca93aea4972be0ba58057230]: org-babel-languages-gen -#+begin_example -'((C . t) - (dot . t) - (emacs-lisp . t) - (gnuplot . t) - (latex . t) - (latex-as-png . t) - (makefile . t) - (plantuml . t) - (python . t) - (restclient . t) - (sass . t) - (scheme . t) - (shell . t)) -#+end_example - -The corresponding code is as follows: -#+NAME: org-babel-load-languages -#+BEGIN_SRC emacs-lisp :noweb yes -(org-babel-do-load-languages - 'org-babel-load-languages - <>) -#+END_SRC - -Scheme requires a default implementation for geiser: -#+NAME: org-babel-set-geiser -#+BEGIN_SRC emacs-lisp -(setq geiser-default-implementation 'racket) -#+END_SRC - -By the way, I wish to see source code behave the same way in the source blocks -as in their own major mode. Let’s tell Emacs so: -#+NAME: org-src-tab-acts-natively -#+BEGIN_SRC emacs-lisp -(setq org-src-tab-acts-natively t) -#+END_SRC - -Lastly, I know this can be a terrible idea, but I want Emacs to just evaluate -Org code blocks without asking me. Of course, this could represent some big -security issue if not careful enough, but I generaly just open my own org files. -#+NAME: org-confirm-babel -#+BEGIN_SRC emacs-lisp -(setq org-confirm-babel-evaluate nil) -#+END_SRC - -***** Beautify Org-mode -As I will always say, orgmode is an amazing piece of software that deserves -particular care and love. That is why I want to give it a unique look and feel -compared to the rest of my Emacs configuration, in order to make it feel much -more comfortable. You will find below how my org buffers look like when I open -one of them. - -#+begin_export html -

Screenshot of an org-mode buffer

-#+end_export - -In order to make org-mode even sexier, let’s enable ~variable-pitch-mode~ for -org-mode so we can get some proportional font. I’ll also remove ~auto-fill-mode~ -which seems to stick to Orgmode like hell and I don’t know why. -#+NAME: beautiful-org-hooks -#+BEGIN_SRC emacs-lisp -(add-hook 'org-mode-hook 'visual-line-mode) -(remove-hook 'org-mode-hook 'auto-fill-mode) -(add-hook 'org-mode-hook 'variable-pitch-mode) -(auto-fill-mode -1) -#+END_SRC - -You can then see the modified faces for org-mode [[file:./spacemacs.md#org-mode][here]]. - -By default, I would like my org-mode buffers to be indented and tables to be -aligned. -#+NAME: beautiful-org-options -#+BEGIN_SRC emacs-lisp -(setq org-startup-indented t - org-startup-align-all-tables t) -#+END_SRC - -****** Fontifying parts of org-mode -Some blocks of org-mode should have their own face, such as the whole heading -line, the done headline, the quote and the verse blocks,… actually, let’s enable -that for all of them. -#+name: beautiful-org-fontify-blocks -#+BEGIN_SRC emacs-lisp -(setq org-pretty-entities t - org-fontify-whole-heading-line t - org-fontify-done-headline t - org-fontify-quote-and-verse-blocks t) -#+END_SRC - -****** Fontifying inline src blocks -When it comes to source blocks in org-mode, Emacs handle them really well with -some beautiful syntax highlight thanks to the the languages’ major mode and -their font-locks. But inline src blocks are the forgotten child and get next to -no love, which is really sad ; I want it to feel loved, to stand out from the -crowd and to give me what its brother gives me already! - -Enters [[https://tecosaur.github.io/emacs-config/config.html#fontifying-inline-src][Tecosaur’s config]]! With ~org-src-font-lock-fontify-block~, anything’s -possible! And ~{{{results(...)}}}~ can also have the ~org-block~ face applied to -match and make org-mode even more beautiful! Let’s do it: -#+name: beautiful-org-fontify-inline -#+BEGIN_SRC emacs-lisp -(defvar org-prettify-inline-results t - "Whether to use (ab)use prettify-symbols-mode on -{{{results(...)}}}.") - -(defun org-fontify-inline-src-blocks (limit) - "Try to apply `org-fontify-inline-src-blocks-1'." - (condition-case nil - (org-fontify-inline-src-blocks-1 limit) - (error (message "Org mode fontification error in %S at %d" - (current-buffer) - (line-number-at-pos))))) - -(defun org-fontify-inline-src-blocks-1 (limit) - "Fontify inline src_LANG blocks, from `point' up to `LIMIT'." - (let ((case-fold-search t)) - (when - ; stolen from `org-element-inline-src-block-parser' - (re-search-forward "\\_> info caddr (alist-get :file)))) - (unless file-name - (setq file-name (make-temp-file "babel-lsp-"))) - (setq buffer-file-name file-name) - (lsp-deferred))) - (put ',intern-pre 'function-documentation - (format "Enable lsp-mode in the buffer of org source block (%s)." - (upcase ,lang))) - (if (fboundp ',edit-pre) - (advice-add ',edit-pre :after ',intern-pre) - (progn - (defun ,edit-pre (info) - (,intern-pre info)) - (put ',edit-pre 'function-documentation - (format "Prepare local buffer environment for org source block (%s)." - (upcase ,lang)))))))) -(defvar org-babel-lsp-lang-list - '(<>)) -(dolist (lang org-babel-lsp-lang-list) - (eval `(lsp-org-babel-enable ,lang))) -#+END_SRC - -Here is one behavior that I really want to see modified: the ability to use -~M-RET~ without slicing the text the marker is on. -#+NAME: org-M-RET-may-split-line -#+BEGIN_SRC emacs-lisp -(setq org-M-RET-may-split-line nil) -#+END_SRC - -Since Org 9.3, Org no longer attempts to restore the window configuration in the -frame to which the user returns after editing a source block with -~org-edit-src-code~. This means with the original value of -~org-src-window-setup~ (~reorganize-frame~), the current frame will be split in -two between the original org window and the source window, and once we quit the -source window only the org window will remain. This is not a desired behavior -for me, so I chose to set this variable to ~split-window-right~ in order to keep -my windows organization and have a similar behavior to the old one. -#+NAME: org-src-window-setup -#+BEGIN_SRC emacs-lisp -(setq org-src-window-setup 'split-window-below) -#+END_SRC - -However, it is not rare that I want to change that for an horizontal split, -which can be achieved with the value ~split-window-below~. Thus, I have made -this function that allows me to switch between the (default) vertical split and -the horizontal split. -#+NAME: org-src-window-toggle -#+BEGIN_SRC emacs-lisp -(defun phundrak/toggle-org-src-window-split () - "This function allows the user to toggle the behavior of -`org-edit-src-code'. If the variable `org-src-window-setup' has -the value `split-window-right', then it will be changed to -`split-window-below'. Otherwise, it will be set back to -`split-window-right'" - (interactive) - (if (equal org-src-window-setup 'split-window-right) - (setq org-src-window-setup 'split-window-below) - (setq org-src-window-setup 'split-window-right)) - (message "Org-src buffers will now split %s" - (if (equal org-src-window-setup 'split-window-right) - "vertically" - "horizontally"))) -#+END_SRC - -When creating a link to an Org flie, I want to create an ID only if the link is -created interactively, and only if there is no custom ID already created. -#+NAME: org-id-link-to-org -#+BEGIN_SRC emacs-lisp -(setq org-id-link-to-org-use-id 'create-if-interactive-and-no-custom-id) -#+END_SRC - -The tag ~:noexport:~ is fine and all, but it doesn’t allow for hidden org -structures, that is headers that are visible in the org buffer but once the file -is exported to another format the header disappears but its content stays. -~ox-extra~ has such a feature through ~ignore-headlines~. -#+BEGIN_SRC emacs-lisp -(require 'ox-extra) -(ox-extras-activate '(ignore-headlines)) -#+END_SRC -This gives us access to the ~:ignore:~ tag which allows the behavior above -mentioned. - -***** Capture -:PROPERTIES: -:header-args:org: :mkdirp yes :padline no -:END: -Org-capture is an amazing feature of Org-mode which allows me to quickly save -links, resources, reminders, and notes in neatly organized org files. Here they -are described: -#+NAME: org-capture-target-files -#+BEGIN_SRC emacs-lisp -(defvar org-conlanging-file "~/org/conlanging.org") -(defvar org-default-notes-file "~/org/notes.org") -(defvar org-journal-file "~/org/journal.org") -(defvar org-linguistics-notes-file "~/org/linguistics-notes.org") -(defvar org-novel-notes-file "~/org/novel-notes.org") -(defvar org-private-agenda-file "~/org/agenda/private.org") -(defvar org-school-agenda-file "~/org/agenda/school.org") -(defvar org-wordbuilding-file "~/org/worldbuilding.org") -#+END_SRC - -With Spacemacs, an Org capture can be invoked with the shortcut ~SPC a o c~. It -will then ask which template I wish to use. In the table below are described the -shortcuts that are available after ~SPC a o c~ is invoked. The /name/ will be -the one displayed in Org capture’s interface, the /title/ is the headline where -to save the capture (if it does not differ from the capture’s name, the cell -will be blank). The /insertion mode/ tells Emacs how to add the capture to the -/file/, using which /template/. A line with no insertion mode, file, or template -is just a category. All of the following insert entries to their org files, that -is a new org node with a headline and some content. -#+NAME: org-capture-shortcuts-table -| Shortcut | Name | Title | Insertion mode | file | template | -|----------+---------------+-----------+----------------+-------------------------+--------------------------| -| e | Email | | | | | -| ew | Write Email | Emails | file+headline | org-default-notes-file | emails.orgcaptmpl | -| j | Journal | | file+datetree | org-journal-file | journal.orgcaptmpl | -| l | Link | | | | | -| ll | General | | file+headline | org-default-notes-file | link.orgcaptmpl | -| ly | YouTube | | file+headline | org-default-notes-file | youtube.orgcaptmpl | -| L | Protocol Link | Link | file+headline | org-default-notes-file | protocol-link.orgcaptmpl | -| n | Notes | | | | | -| nc | Conlanging | Note | file+headline | org-conlanging-file | notes.orgcaptmpl | -| nn | General | | file+headline | org-default-notes-file | notes.orgcaptmpl | -| nN | Novel | Note | file+headline | org-novel-notes-file | notes.orgcaptmpl | -| nq | Quote | | file+headline | org-default-notes-file | notes-quote.orgcaptmpl | -| nw | Worldbuilding | Note | file+headline | org-wordbuilding-file | notes.orgcaptmpl | -| N | Novel | | | | | -| Ni | Ideas | | file+headline | org-novel-notes-file | notes.orgcaptmpl | -| p | Protocol | Link | file+headline | org-default-notes-file | protocol.orgcaptmpl | -| r | Resources | | | | | -| rc | Conlanging | Resources | file+headline | org-conlanging-file | resource.orgcaptmpl | -| re | Emacs | | file+headline | org-default-notes-file | resource.orgcaptmpl | -| ri | Informatique | | file+headline | org-default-notes-file | resource.orgcaptmpl | -| rl | Linguistics | | file+headline | org-default-notes-file | resource.orgcaptmpl | -| rL | Linux | | file+headline | org-default-notes-file | resource.orgcaptmpl | -| rw | Worldbuilding | Resources | file+headline | org-wordbuilding-file | resource.orgcaptmpl | -| t | Tasks | | | | | -| tb | Birthday | | file+headline | org-private-agenda-file | birthday.orgcaptmpl | -| te | Event | | file+headline | org-private-agenda-file | event.orgcaptmpl | -| th | Health | | file+headline | org-private-agenda-file | health.orgcaptmpl | -| ti | Informatique | | file+headline | org-private-agenda-file | informatique.orgcaptmpl | - -#+NAME: org-capture-shortcut-gen -#+header: :exports none :cache yes :results replace -#+BEGIN_SRC emacs-lisp :var table=org-capture-shortcuts-table -(format "'(%s)" - (mapconcat (lambda (entry) - (let* ((shortcut (nth 0 entry)) - (name (nth 1 entry)) - (title (nth 2 entry)) - (insertmode (nth 3 entry)) - (fileinsert (nth 4 entry)) - (sourceorg (nth 5 entry))) - (if (string= "" insertmode) - (format "(\"%s\" \"%s\")" shortcut name) - (concat (format "(\"%s\" \"%s\" entry\n" shortcut name) - (format " (%s %s%s)\n" insertmode fileinsert - (if (string= "file+datetree" insertmode) "" - (format " \"%s\"" (if (string= "" title) name title)))) - (format " (file \"~/org/capture/%s\"))" sourceorg)))) ) - table "\n ")) -#+END_SRC - -#+RESULTS[ec10a65e789d0f3d318de419a7c08e1f41dcb65a]: org-capture-shortcut-gen -#+begin_example -'(("e" "Email") - ("ew" "Write Email" entry - (file+headline org-default-notes-file "Emails") - (file "~/org/capture/emails.orgcaptmpl")) - ("j" "Journal" entry - (file+datetree org-journal-file) - (file "~/org/capture/journal.orgcaptmpl")) - ("l" "Link") - ("ll" "General" entry - (file+headline org-default-notes-file "General") - (file "~/org/capture/link.orgcaptmpl")) - ("ly" "YouTube" entry - (file+headline org-default-notes-file "YouTube") - (file "~/org/capture/youtube.orgcaptmpl")) - ("L" "Protocol Link" entry - (file+headline org-default-notes-file "Link") - (file "~/org/capture/protocol-link.orgcaptmpl")) - ("n" "Notes") - ("nc" "Conlanging" entry - (file+headline org-conlanging-file "Note") - (file "~/org/capture/notes.orgcaptmpl")) - ("nn" "General" entry - (file+headline org-default-notes-file "General") - (file "~/org/capture/notes.orgcaptmpl")) - ("nN" "Novel" entry - (file+headline org-novel-notes-file "Note") - (file "~/org/capture/notes.orgcaptmpl")) - ("nq" "Quote" entry - (file+headline org-default-notes-file "Quote") - (file "~/org/capture/notes-quote.orgcaptmpl")) - ("nw" "Worldbuilding" entry - (file+headline org-wordbuilding-file "Note") - (file "~/org/capture/notes.orgcaptmpl")) - ("N" "Novel") - ("Ni" "Ideas" entry - (file+headline org-novel-notes-file "Ideas") - (file "~/org/capture/notes.orgcaptmpl")) - ("p" "Protocol" entry - (file+headline org-default-notes-file "Link") - (file "~/org/capture/protocol.orgcaptmpl")) - ("r" "Resources") - ("rc" "Conlanging" entry - (file+headline org-conlanging-file "Resources") - (file "~/org/capture/resource.orgcaptmpl")) - ("re" "Emacs" entry - (file+headline org-default-notes-file "Emacs") - (file "~/org/capture/resource.orgcaptmpl")) - ("ri" "Informatique" entry - (file+headline org-default-notes-file "Informatique") - (file "~/org/capture/resource.orgcaptmpl")) - ("rl" "Linguistics" entry - (file+headline org-default-notes-file "Linguistics") - (file "~/org/capture/resource.orgcaptmpl")) - ("rL" "Linux" entry - (file+headline org-default-notes-file "Linux") - (file "~/org/capture/resource.orgcaptmpl")) - ("rw" "Worldbuilding" entry - (file+headline org-wordbuilding-file "Resources") - (file "~/org/capture/resource.orgcaptmpl")) - ("t" "Tasks") - ("tb" "Birthday" entry - (file+headline org-private-agenda-file "Birthday") - (file "~/org/capture/birthday.orgcaptmpl")) - ("te" "Event" entry - (file+headline org-private-agenda-file "Event") - (file "~/org/capture/event.orgcaptmpl")) - ("th" "Health" entry - (file+headline org-private-agenda-file "Health") - (file "~/org/capture/health.orgcaptmpl")) - ("ti" "Informatique" entry - (file+headline org-private-agenda-file "Informatique") - (file "~/org/capture/informatique.orgcaptmpl"))) -#+end_example - -Below you can find the equivalent code as described above. -#+NAME: org-capture-templates -#+BEGIN_SRC emacs-lisp :noweb yes -(setq - org-capture-templates - <>) -#+END_SRC - -You may notice a capture entry for my journal, and this is due to the fact I do -not use ~org-journal~ anymore: it was too overpowered for me, and I prefer to -keep it simple with a single file. And as you can see, and unlike a lot of other -Emacs configurations, the content of the template is not set in the variable, -but in external files which can be modified freely as actual Org buffers instead -of trying to get a proper one with loads of ~\n~ characters and such. All these -templates are declared below. - -My org capture templates are not tangled into my Emacs configuration -files, but into separate ~.orgcaptmpl~ files stored into =~/org/capture/=. -You can find these in my repository [[https://labs.phundrak.com/phundrak/dotfiles/src/branch/master/org/capture][here]] or [[https://github.com/Phundrak/dotfiles/tree/master/org/capture][here]]. - -***** Custom org-mode functions -We begin with a couple of custom functions that I use in my org-mode files. - -****** Custom and unique headings ID -The first ones are dedicated to provide org-mode headings a fixed and unique ID -that won’t change over time. This code was taken from -[[https://writequit.org/articles/emacs-org-mode-generate-ids.html][https://writequit.org/articles/emacs-org-mode-generate-ids.html]]. The first -function’s job is to create these unique IDs -#+NAME: org-better-id-new -#+BEGIN_SRC emacs-lisp -(defun eos/org-id-new (&optional prefix) - "Create a new globally unique ID. - -An ID consists of two parts separated by a colon: -- a prefix -- a unique part that will be created according to - `org-id-method'. - -PREFIX can specify the prefix, the default is given by the -variable `org-id-prefix'. However, if PREFIX is the symbol -`none', don't use any prefix even if `org-id-prefix' specifies -one. - -So a typical ID could look like \"Org-4nd91V40HI\"." - (let* ((prefix (if (eq prefix 'none) - "" - (concat (or prefix org-id-prefix) - "-"))) unique) - (when (equal prefix "-") - (setq prefix "")) - (cond - ((memq org-id-method - '(uuidgen uuid)) - (setq unique (org-trim (shell-command-to-string org-id-uuid-program))) - (unless (org-uuidgen-p unique) - (setq unique (org-id-uuid)))) - ((eq org-id-method 'org) - (let* ((etime (org-reverse-string (org-id-time-to-b36))) - (postfix (when org-id-include-domain - (progn - (require 'message) - (concat "@" - (message-make-fqdn)))))) - (setq unique (concat etime postfix)))) - (t (error "Invalid `org-id-method'"))) - (concat prefix (car (split-string unique "-"))))) -#+END_SRC - -Now, let’s see the function that will be used to get the custom id of a heading -at point. If the function does not detect any custom ID, then one should be -created and inserted. -#+NAME: org-better-id-get -#+BEGIN_SRC emacs-lisp -(defun eos/org-custom-id-get (&optional pom create prefix) - "Get the CUSTOM_ID property of the entry at point-or-marker POM. -If POM is nil, refer to the entry at point. If the entry does not -have an CUSTOM_ID, the function returns nil. However, when CREATE -is non nil, create a CUSTOM_ID if none is present already. PREFIX -will be passed through to `eos/org-id-new'. In any case, the -CUSTOM_ID of the entry is returned." - (interactive) - (org-with-point-at pom - (let* ((orgpath (mapconcat #'identity (org-get-outline-path) "-")) - (heading (replace-regexp-in-string - "[_-]+$" "" - (replace-regexp-in-string - "[-_]+" "-" - (replace-regexp-in-string - "[^a-zA-Z0-9-_]" "-" - (if (string= orgpath "") - (org-get-heading t t t t) - (concat orgpath "_" (org-get-heading t t t t))))))) - (id (org-entry-get nil "CUSTOM_ID"))) - (cond - ((and id - (stringp id) - (string-match "\\S-" id)) id) - (create (setq id (eos/org-id-new (concat prefix heading))) - (org-entry-put pom "CUSTOM_ID" id) - (org-id-add-location id - (buffer-file-name (buffer-base-buffer))) - id))))) -#+END_SRC - -Finally, this is the function that gets called on file saves. If the function -detects ~auto-id:t~ among the org options in the ~#+OPTIONS:~ header, then the -above function is called. -#+NAME: org-better-id-add-ids -#+BEGIN_SRC emacs-lisp -(defun eos/org-add-ids-to-headlines-in-file () - "Add CUSTOM_ID properties to all headlines in the current file -which do not already have one. - -Only adds ids if the `auto-id' option is set to `t' in the file -somewhere. ie, #+OPTIONS: auto-id:t" - (interactive) - (save-excursion - (widen) - (goto-char (point-min)) - (when (re-search-forward "^#\\+OPTIONS:.*auto-id:t" (point-max) t) - (org-map-entries (lambda () (eos/org-custom-id-get (point) 'create)))))) -#+END_SRC - -Let’s add a hook to the above function so it is called automatically on save, -and only in read-write functions. -#+NAME: org-better-id-hooks -#+BEGIN_SRC emacs-lisp -(add-hook 'org-mode-hook - (lambda () - (add-hook 'before-save-hook - (lambda () - (when (and (eq major-mode 'org-mode) - (eq buffer-read-only nil)) - (eos/org-add-ids-to-headlines-in-file)))))) -#+END_SRC - -***** File export -I want to disable by default behavior of ~^~ and ~_~ for only one character, -making it compulsory to use instead ~^{}~ and ~_{}~ respectively. This is due to -my frequent usage of the underscore in my org files as a regular character and -not a markup one, especially when describing phonetics evolution. So, let’s -disable it: -#+NAME: org-use-sub-superscripts -#+BEGIN_SRC emacs-lisp -(setq org-use-sub-superscripts (quote {})) -#+END_SRC - -****** LaTeX -When it comes to exports, I want the LaTeX and PDF exports to be done with -XeLaTeX only. This implies the modification of the following variable: -#+NAME: org-latex-compiler -#+BEGIN_SRC emacs-lisp -(setq org-latex-compiler "xelatex") -#+END_SRC - -I also want to get by default ~minted~ for LaTeX listings so I can have syntax -highlights: -#+NAME: org-latex-listings -#+BEGIN_SRC emacs-lisp -(setq org-latex-listings 'minted) -#+END_SRC - -The default packages break my LaTeX exports: for some reasons, images are not -loaded and exported in PDFs, so I needed to redifine the default packages -excluding the one that broke my exports. I also added two default packages, -~minted~ and ~xeCJK~ for syntax highlighting and Japanese (and additionally -Chinese and Korean) support. -#+NAME: org-latex-default-packages -#+BEGIN_SRC emacs-lisp -(setq org-latex-default-packages-alist '(("" "graphicx" t) - ("T1" "fontspec" t ("pdflatex")) - ("" "longtable" nil) - ("" "wrapfig" nil) - ("" "rotating" nil) - ("normalem" "ulem" t) - ("" "amsmath" t) - ("" "textcomp" t) - ("" "amssymb" t) - ("" "capt-of" nil) - ("" "minted" nil) - ("" "hyperref" nil))) -#+END_SRC - -By the way, reference links in LaTeX should be written in this format: -#+NAME: org-export-latex-hyperref-format -#+BEGIN_SRC emacs-lisp -(setq org-export-latex-hyperref-format "\\ref{%s}") -#+END_SRC - -When it comes to the export itself, the latex file needs to be processed several -times through XeLaTeX in order to get some references right. Don’t forget to -also run bibtex! -#+NAME: org-latex-pdf-process -#+BEGIN_SRC emacs-lisp -(setq org-latex-pdf-process - '("xelatex -8bit -shell-escape -interaction nonstopmode -output-directory %o %f" - "bibtex %b" - "xelatex -8bit -shell-escape -interaction nonstopmode -output-directory %o %f" - "xelatex -8bit -shell-escape -interaction nonstopmode -output-directory %o %f")) -#+END_SRC - -****** HTML -For Reveal.JS exports, I need to set where to find the framework by default: -#+NAME: org-re-reveal-root -#+BEGIN_SRC emacs-lisp -(setq org-re-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js") -#+END_SRC - -On HTML exports, Org-mode tries to include a validation link for the exported -HTML. Let’s disable that since I never use it. -#+NAME: org-html-validation -#+BEGIN_SRC emacs-lisp -(setq org-html-validation-link nil) -#+END_SRC - -However, something I very often use are metadata information in my HTML files. I -just want to automate that. Fortunately, [[https://tecosaur.github.io/emacs-config/config.html#extra-header-content,code--3][Tecosaur comes to the rescue]]! First, -here is our function that will generate all the meta tags in our HTML: -#+BEGIN_SRC emacs-lisp -(defun org-html-meta-tags-fancy (info) - "Use the INFO plist to construct the meta tags, as described in -`org-html-meta-tags'." - (message "%s" info) - (let ((title (org-html-plain-text - (org-element-interpret-data (plist-get info :title)) info)) - (author (and (plist-get info :with-author) - (let ((auth (plist-get info :author))) - ;; Return raw Org syntax. - (and auth (org-html-plain-text - (org-element-interpret-data auth) info)))))) - (list - (when (org-string-nw-p author) - (list "name" "author" author)) - (when (org-string-nw-p (plist-get info :description)) - (list "name" "description" - (plist-get info :description))) - '("name" "generator" "org mode (Emacs)") - '("name" "theme-color" "#3b4252") - '("property" "og:type" "article") - (list "property" "og:title" title) - (let ((subtitle (org-export-data (plist-get info :subtitle) info))) - (when (org-string-nw-p subtitle) - (list "property" "og:description" subtitle))) - (let ((meta-image (org-export-data (plist-get info :metaimage) info))) - (when (org-string-nw-p meta-image) - (list "property" "og:image" meta-image))) - (let ((meta-image-type (org-export-data (plist-get info :metaimagetype) info))) - (when (org-string-nw-p meta-image-type) - (list "property" "og:image:type" meta-image-type))) - (let ((meta-image-width (org-export-data (plist-get info :metaimagewidth) info))) - (when (org-string-nw-p meta-image-width) - (list "property" "og:image:width" meta-image-width))) - (let ((meta-image-height (org-export-data (plist-get info :metaimageheight) info))) - (when (org-string-nw-p meta-image-height) - (list "property" "og:image:height" meta-image-height))) - (let ((meta-image-alt (org-export-data (plist-get info :metaimagealt) info))) - (when (org-string-nw-p meta-image-alt) - (list "property" "og:image:alt" meta-image-alt))) - (when (org-string-nw-p author) - (list "property" "og:article:author:first_name" (car (s-split-up-to " " author 2)))) - (when (and (org-string-nw-p author) (s-contains-p " " author)) - (list "property" "og:article:author:last_name" (cadr (s-split-up-to " " author 2)))) - (list "property" "og:article:published_time" (format-time-string "%FT%T%z"))))) -#+END_SRC - -This will use some special keywords in our org buffer and insert their content in - -Now let’s bind it to when we export our org buffer to HTML: -#+BEGIN_SRC emacs-lisp -(unless (functionp #'org-html-meta-tags-default) - (defalias 'org-html-meta-tags-default #'ignore)) -(setq org-html-meta-tags #'org-html-meta-tags-fancy) -#+END_SRC - -***** LaTeX formats -I currently have two custom formats for my Org-mode exports: one for general use -(initialy for my conlanging files, hence its ~conlang~ name), and one for beamer -exports. - -Below is the declaration of the ~conlang~ LaTeX class: -#+NAME: org-latex-class-conlang -#+BEGIN_SRC emacs-lisp -'("conlang" - "\\documentclass{book}" - ("\\chapter{%s}" . "\\chapter*{%s}") - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}")) -#+END_SRC - -And here is the declaration of the ~beamer~ class: -#+NAME: org-latex-class-beamer -#+BEGIN_SRC emacs-lisp -`("beamer" - ,(concat "\\documentclass[presentation]{beamer}\n" - "[DEFAULT-PACKAGES]" - "[PACKAGES]" - "[EXTRA]\n") - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}")) -#+END_SRC - -Both these classes have to be added to ~org-latex-classes~ like so: -#+NAME: org-latex-classes -#+BEGIN_SRC emacs-lisp :noweb yes -(eval-after-load "ox-latex" - '(progn - (add-to-list 'org-latex-classes - <> - ) - (add-to-list 'org-latex-classes - <> - ))) -#+END_SRC - -***** Projects -Another great features of Org-mode is the Org projects that allow the user to -easily publish a bunch of org files to a remote location. Here is the current -declaration of my projects, which will be detailed later: -#+NAME: org-publish-projects -#+BEGIN_SRC emacs-lisp :noweb yes -<> -<> -(setq org-publish-project-alist - `( - <> - <> - <> - <> - <> - <> - <>)) -#+END_SRC - -****** Configuration website -This is my configuration for exporting my dotfiles to my website in a web format -only. No PDFs or anything, just HTML. Please note that I do not use that often -anymore, I much prefer the automatic script that I have which deploys through my -Drone instance my website on git pushes. - -And before we get into the actual configuration, I would like to introduce a -couple of variables. This is a bit more verbose than if I declared everything -manually, but now I can change all three values at the same time without a -hasle. -#+NAME: org-proj-config-setup -#+BEGIN_SRC emacs-lisp -(defvar phundrak//projects-config-target - "/rsync:Tilo:~/www/phundrak.com/config" - "Points to where exported files for config.phundrak.com should be put") -(defvar phundrak//projects-config-source - "~/org/config/" - "Points to where the sources for config.phundrak.com are") -(defvar phundrak//projects-config-language - "en" - "Language of config.phundrak.com") -(defvar phundrak//projects-config-recursive - t - "Defines whether subdirectories should be parsed for config.phundrak.com") -#+END_SRC - -Now, here is my configuration. In this snippet, my org files located in my -source directory get exported in the HTML format and published to my target -directory on my remote server through RSYNC via TRAMP. A sitemap is -automatically generated, which comes in handy with the online sitemap that is -available through the navigation bar. -#+NAME: org-proj-config-html -#+BEGIN_SRC emacs-lisp -("config-website-org" - :base-directory ,phundrak//projects-config-source - :base-extension "org" - :publishing-directory ,phundrak//projects-config-target - :recursive ,phundrak//projects-config-recursive - :language ,phundrak//projects-config-language - :publishing-function org-html-publish-to-html - :headline-levels 5 - :auto-sitemap t - :auto-preamble t) -#+END_SRC - -We also have the component for all the static files needed to run the website -(mostly images tbh). -#+NAME: org-proj-config-static -#+BEGIN_SRC emacs-lisp -("config-website-static" - :base-directory ,phundrak//projects-config-source - :base-extension "png\\|jpg\\|gif\\|webp\\|svg\\|jpeg\\|ttf\\|woff\\|txt\\|epub\\|md" - :publishing-directory ,phundrak//projects-config-target - :recursive ,phundrak//projects-config-recursive - :language ,phundrak//projects-config-language - :publishing-function org-publish-attachment) -#+END_SRC - -The project is then defined like so: -#+NAME: org-proj-config -#+BEGIN_SRC emacs-lisp -("config-website" - :components ("config-website-org" - "config-website-static")) -#+END_SRC - -****** Linguistics website -My linguistics website is made out of three projects. As for the previous -project, let’s declare the common values for these. -#+NAME: org-proj-lang-setup -#+BEGIN_SRC emacs-lisp -(defvar phundrak//projects-conlanging-target - "/rsync:Tilo:~/www/phundrak.com/langue/" - "Points to where exported files for langue.phundrak.com should be put") -(defvar phundrak//projects-conlanging-source - "~/Documents/conlanging/content/" - "Points to where the sources for langue.phundrak.com are") -(defvar phundrak//projects-conlanging-language - "fr" - "Language of langue.phundrak.com") -(defvar phundrak//projects-conlanging-recursive - t - "Defines whether subdirectories should be parsed for langue.phundrak.com") -#+END_SRC - -The first component is the one generating the HTML files from the org files. -#+NAME: org-proj-lang-html -#+BEGIN_SRC emacs-lisp -("langue-phundrak-com-org" - :base-directory ,phundrak//projects-conlanging-source - :base-extension "org" - :exclude "\\./\\(CONTRIB\\|README\\|head\\|temp\\|svg-ink\\).*" - :publishing-directory ,phundrak//projects-conlanging-target - :recursive ,phundrak//projects-conlanging-recursive - :language ,phundrak//projects-conlanging-language - :publishing-function org-html-publish-to-html - :headline-levels 5 - :auto-sitemap t - :auto-preamble t) -#+END_SRC - -We also have the component for the LaTeX and PDF part of the website: -#+NAME: org-proj-lang-pdf -#+BEGIN_SRC emacs-lisp -("langue-phundrak-com-pdf" - :base-directory ,phundrak//projects-conlanging-source - :base-extension "org" - :exclude "\\./\\(CONTRIB\\|README\\|index\\|head\\|temp\\|svg-ink\\).*" - :publishing-directory ,phundrak//projects-conlanging-target - :recursive ,phundrak//projects-conlanging-recursive - :language ,phundrak//projects-conlanging-language - :publishing-function org-latex-publish-to-pdf - :headline-levels 5 - :auto-preamble t) -#+END_SRC - -And lastly, we have the component for all the static files needed to run the -website: -#+NAME: org-proj-lang-static -#+BEGIN_SRC emacs-lisp -("langue-phundrak-com-static" - :base-directory ,phundrak//projects-conlanging-source - :base-extension "png\\|jpg\\|gif\\|webp\\|svg\\|jpeg\\|ttf\\|woff\\|txt\\|epub" - :publishing-directory ,phundrak//projects-conlanging-target - :recursive ,phundrak//projects-conlanging-recursive - :language ,phundrak//projects-conlanging-language - :publishing-function org-publish-attachment) -#+END_SRC - -The project is then defined like so: -#+NAME: org-proj-lang -#+BEGIN_SRC emacs-lisp -("langue-phundrak-com" - :components ("langue-phundrak-com-org" - "langue-phundrak-com-static" - "langue-phundrak-com-pdf")) -#+END_SRC - -***** User information -Some variables about myself need to be set so Org-mode knows what information to -include in exported files. -#+NAME: org-user-information -#+BEGIN_SRC emacs-lisp -(setq user-full-name "Lucien Cartier-Tilet" - user-real-login-name "Lucien Cartier-Tilet" - user-login-name "phundrak" - user-mail-address "lucien@phundrak.com") -#+END_SRC - -**** Recentf -~recentf-mode~ allows Emacs to list all recent files it read. It is also used by -Spacemacs to display a list of recent files so they can be quickly opened by the -user. Unfortunately, a lot of these files are just noise I don’t care about, but -fortunately we can ignore files with the variable ~recentf-exclude~. So, I will -ignore these paths: -#+name: recentf-ignored-paths -| =~/.authinfo.gpg= | -| =~/.mail/= | -| =~/.emacs.d/= | -| =~/.emacs.spacemacs/= | -| =~/.elfeed/index= | -| =~/Documents/mu4e= | -| =/tmp/= | - -#+name: recentf-ignored-paths-gen -#+header: :var paths=recentf-ignored-paths -#+BEGIN_SRC emacs-lisp :tangle no :exports none -(mapconcat (lambda (path) - (format "(add-to-list 'recentf-exclude\n (expand-file-name \"%s\"))" - (replace-regexp-in-string "=" "" (car path)))) - paths - "\n") -#+END_SRC - -#+BEGIN_SRC emacs-lisp :noweb yes -(with-eval-after-load 'recentf - <>) -#+END_SRC - -*** Keybindings -As you will see, I defined a LOT of custom keybindings. All of them are -Spacemacs keybindings, defined in a way they can be used seamlessly with Evil. -They almost all begin with ~o~, which is a prefix reserved for user-defined -keybindings so they won’t conflict with any package. Let’s declare it like so. -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "o" "custom") -#+END_SRC - -Now, all keybindings that will be defined can be invoked in Normal-mode with the -~SPC~ key followed by the sequence assigned to each keybinding. - -Before some more specialized categories, I have two commands which don’t fit -into any other category that I sometime use. The first one is a fix for the Bépo -keybindings which left out a keybind: ~winum-select-window-by-number~ is still -bound to ~SPC ²~, which is not a key that is available on the bépo layout -(instead, we use the dead key ~^~ followed by ~2~, or any digits). So instead, -let’s use the key that is physically in the same place: ~$~. -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "$" "select window by number") -(spacemacs/set-leader-keys "$" 'winum-select-window-by-number) -#+END_SRC - -The following, I use it rarely, it can launch an external command from Emacs to -launch, for instance, my web browser or any other software not related to Emacs. -It offers a similar interface to [[https://wiki.archlinux.org/index.php/Dmenu][dmenu]] through helm. -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "or" "external command") -(spacemacs/set-leader-keys "or" 'helm-run-external-command) -#+END_SRC - -However this one I use often, generally in org or text buffers. -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys "os" 'sort-lines) -#+END_SRC - -**** Applications -As this is a new category, let’s declare its prefix: -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "oa" "applications") -#+END_SRC - -Now, let’s also declare the keybindings in this category. ~oac~ will invoke -Emacs’ calculator, while ~oac~ invokes the calendar, ~oae~ invokes the Eww web -browser, and ~oaw~ invokes the weather forecast. Lastly, the apostrophe in ~o'~ -will invoke Eshell directly, without any popup window as with ~SPC '~ while -~oan~ will open a new eshell buffer if another one already exists. ~ov~ will -also open a vterm terminal. -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys - "o'" 'eshell-new - "ov" 'vterm - "oac" 'calc - "oaC" 'calendar - "oae" 'eww - "oaw" 'wttrin) -#+END_SRC - -***** Image mode -Viewing images in Emacs is nice, but I want to be able to do more than just view -them, such as opening them in GIMP. I’ll also declare a couple of keybindings -that make sense to me. -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix-for-mode 'image-mode "G" "Open in GIMP") -(spacemacs/declare-prefix-for-mode 'image-mode "o" "Open in external viewer") -(spacemacs/declare-prefix-for-mode 'image-mode "r" "Rotate clockwise") -(spacemacs/set-leader-keys-for-major-mode 'image-mode - "G" (lambda () (interactive) (start-process "" nil "gimp" (buffer-name))) - "o" (lambda () (interactive) (start-process "" nil "xdg-open" (buffer-name))) - "r" 'image-rotate) -#+END_SRC - -***** Org tree slide -Finally, here we have the keybindings for ~org-tree-slide~, a presentation mode -with orgmode. Since I want the keys to be directly accessible without any prefix -from Spacemacs, I’ll have to declare them the vanilla way. First we have -keybindings that will launch the presentation: -#+BEGIN_SRC emacs-lisp -(define-key org-mode-map (kbd "") 'org-tree-slide-mode) -(define-key org-mode-map (kbd "s-") 'org-tree-slide-skip-done-toggle) -#+END_SRC - -Next, we have some additional keybindings that will only be active when in -~org-tree-slide-mode~. The first one will allow us to exit this mode, while the -second one will toggle the display of headers marked as ~DONE~. Next, we have -~F9~ and ~F10~ which are bound to movement in the slide, while ~F11~ changes the -way the content is displayed. We also set ~org-tree-slide-skip-outline-level~ to -set the maximum depth we will display as an individual heading during the -presentation. -#+BEGIN_SRC emacs-lisp -(when (require 'org-tree-slide nil t) - (global-set-key (kbd "") 'org-tree-slide-mode) - (global-set-key (kbd "S-") 'org-tree-slide-skip-done-toggle) - (define-key org-tree-slide-mode-map (kbd "") - 'org-tree-slide-move-previous-tree) - (define-key org-tree-slide-mode-map (kbd "") - 'org-tree-slide-move-next-tree) - (define-key org-tree-slide-mode-map (kbd "") - 'org-tree-slide-content) - (setq org-tree-slide-skip-outline-level 4) - (org-tree-slide-narrowing-control-profile) - (setq org-tree-slide-skip-done nil)) -#+END_SRC - -**** Comments -Some keybindings are also related to comment editing, in particular using -outorg. Let’s first declare the dedicated prefix: -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "oc" "comments") -#+END_SRC - -Now, let’s declare the following keybindings: -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys - "occ" 'outorg-copy-edits-and-exit - "oce" 'outorg-edit-as-org - "oco" 'outline-minor-mode) -#+END_SRC - -~oco~ enables the outline minor mode, which then allows for the edition of -comments in org buffers with ~oce~ and saving them to the original source file -with ~occ~. - -**** Dired -A couple of keybindings will be added to Dired. The first one is the opening -parenthesis which will enable or disable ~dired-hide-details-mode~. On the other -hand, a closing parenthesis will show git information in the current Dired -buffer. -#+BEGIN_SRC emacs-lisp -(define-key dired-mode-map (kbd "(") 'dired-hide-details-mode) -(define-key dired-mode-map (kbd ")") 'dired-git-info-mode) -#+END_SRC - -Something I use from time to time is ~S-F1~ for opening dired in my ~$HOME~ -directory. For that, I simply did the following: -#+BEGIN_SRC emacs-lisp -(global-set-key (kbd "") (lambda () (interactive) (dired "~/"))) -#+END_SRC - -A couple of other useful utilities, sach as opening all marked files, sorting -files, opening them externally and renaming them, are also bound to a simple key -press: -#+BEGIN_SRC emacs-lisp -(define-key dired-mode-map (kbd "f") 'phundrak-open-marked-files) -(define-key dired-mode-map (kbd "F") 'xah/open-in-external-app) -(define-key dired-mode-map (kbd "s") 'xah/dired-sort) -#+END_SRC - -**** Files -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "of" "open org file") -(spacemacs/set-leader-keys "of" 'phundrak-find-org-files) -#+END_SRC - -I also have a shortcut for ~helm-locate~ in case I need to find a file that is -not in these directories. One advantage of this over ~helm-find~ is that it -doesn’t matter from where I call it, it will find any file on my system that -matches the query, whereas ~helm-find~ will only search in the current directory -and its subdirectories. This time, the declaration is much simpler: -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "oF" "locate file") -(spacemacs/set-leader-keys "oF" 'helm-locate) -#+END_SRC - -And that’s it! This should list all my org files under these directories and -give me fuzzy finding for these files. I just need to partially type the name of -the file I want to open and it should open without any issue. - -**** Games -Just to make it easier to launch it, I’ll declare a shortcut for launching -tetris (which is built into Emacs). -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "oat" "tetris") -(spacemacs/set-leader-keys "oat" 'tetris) -#+END_SRC - -Apparently, no evil keybindings are set for Tetris. Let’s declare them (adapted -to the bépo layout): -#+BEGIN_SRC emacs-lisp -(require 'tetris) -(define-key tetris-mode-map (kbd "c") 'tetris-move-left) -(define-key tetris-mode-map (kbd "t") 'tetris-move-down) -(define-key tetris-mode-map (kbd "s") 'tetris-rotate-prev) -(define-key tetris-mode-map (kbd "r") 'tetris-move-right) -#+END_SRC - -**** Multiple cursors -I don’t really like Spacemacs’ layer for MultipleCursors, so I prefer to simply -install the package and create shortcuts for it myself. Let’s first declare -category: -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "om" "multiple-cursors") -#+END_SRC - -Now, let’s declare the shortcuts related to multiple-cursors: -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys - "ome" 'mc/edit-lines - "omn" 'mc/mark-next-like-this - "omp" 'mc/mark-previous-like-this - "oma" 'mc/mark-all-like-this) -#+END_SRC - -**** Org-mode -Now, onto some shortcuts related to org-mode. Let’s first declare the category: -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix-for-mode 'org-mode "mo" "custom" "User-defined keybindings") -(spacemacs/declare-prefix-for-mode 'org-mode "mot" "toggle" "Toggle org elements") -(spacemacs/declare-prefix-for-mode 'org-mode "moT" "tables") -#+END_SRC - -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys-for-major-mode 'org-mode "ob" 'phundrak-blog-publish) -(spacemacs/declare-prefix-for-mode 'org-mode "ob" "publish blog") -#+END_SRC - -Now, I have a couple of shortcuts I use regularly: -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys-for-major-mode 'org-mode - "os" 'org-insert-structure-template - "ots" 'phundrak/toggle-org-src-window-split - "ott" 'org-sidebar-tree) -(spacemacs/declare-prefix-for-mode 'org-mode "moS" "insert template") -(spacemacs/declare-prefix-for-mode 'org-mode "mots" "toggle src split") -#+END_SRC - -~os~ allows me to insert an org structure template defined in -~org-structure-template-alist~ (see [[file:./spacemacs.md#behavior][org-mode behavior]]), while ~ott~ -displays the outline of the current org file. - -~oT~ is the prefix for tree-related operations: -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix-for-mode 'org-mode "moT" "tables") -#+END_SRC - -These shortcuts allow to manipulate the width of the column the cursor is -currently in, by either shrinking it, expanding it, or toggling its state -between shrunk or expanded. A prefix for all of these commands has been also -added in order to make the purpose of the shortcuts clearer. -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys-for-major-mode 'org-mode - "oTt" 'org-table-toggle-column-width - "oTe" 'org-table-expand - "oTs" 'org-table-shrink) -(spacemacs/declare-prefix-for-mode 'org-mode "moTt" "toggle width") -(spacemacs/declare-prefix-for-mode 'org-mode "moTe" "expand") -(spacemacs/declare-prefix-for-mode 'org-mode "moTs" "shrink") -#+END_SRC - -Finaly, I set the following shortcut in order to easily remove ~RESULTS~ blocks -from org source code blocks: -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys-for-major-mode 'org-mode - "or" 'org-babel-remove-result-one-or-many) -(spacemacs/declare-prefix-for-mode 'org-mode "mor" "remove org result") -#+END_SRC - -**** Toggle -This category allows to toggle some modes and options. -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "ot" "toggle") -#+END_SRC - -As you can see, I have here four shortcuts for toggling various elements in -Emacs: -- ~otb~ :: toggles ~fancy-battery-mode~. This comes in very handy when I am on a - laptop that is not pluged in or which is charging. -- ~otd~ :: toggles ~elcord-mode~. This mode is used to create an Emacs rich - integration in Discord. -- ~otf~ :: toggles the activation of FlyCheck, Emacs’ spell checker. It is by - default disabled, and I can turn it on with this shortcut only when needed. -- ~ots~ :: toggles ~prettify-symbols-mode~. This allows Emacs to replace some - symbols by some others, like for example by replacing ~lambda~ in Emacs Lisp - buffers with an actual λ. -- ~otS~ :: toggles whether or not Eshell should shorten the current path in its - prompt -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys - "otb" 'fancy-battery-mode - "otd" 'elcord-mode - "otf" 'flycheck-mode - "ots" 'prettify-symbols-mode - "otS" 'phundrak-prompt-toggle-abbreviation) -#+END_SRC - -We also have some input methods-related shortcuts in a sub-category: ~oti~. The -first shortcuts below are used to either toggle between no input method or the -last one used (~otit~), or choose an input method among the various available -ones from Emacs (~otis~). -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "oti" "input methods") -(spacemacs/set-leader-keys - "otit" 'toggle-input-method - "otis" 'set-input-method) -#+END_SRC - -The shortcuts below though allow me to directly switch to one of these three -known input methods I sometimes or often use, namely Japanese, Tibetan and IPA -(by typing in X-SAMPA). -#+BEGIN_SRC emacs-lisp -(spacemacs/declare-prefix "otij" "Japanese") -(spacemacs/declare-prefix "otix" "IPA (X-SAMPA)") -(spacemacs/declare-prefix "otiT" "Tibetan") -(spacemacs/set-leader-keys - "otij" (lambda () (interactive) (set-input-method 'japanese)) - "otix" (lambda () (interactive) (set-input-method 'ipa-x-sampa)) - "otiT" (lambda () (interactive) (set-input-method 'tibetan-wylie))) -#+END_SRC - -*** Mu4e -Mu4e is a frontend for mu, an email analyzer which sits on top of a Maildir -which gets updated with the ~mbsync~ command from ~isync~. It has a lot of neat -features, but I guess my favorite ones are: -1. the search query feature -2. rendering an HTML email in the browser - -**** Setup -Due to mu sitting on top of a maildir, I need to tell mu4e where said maildir -is, and point it the trash, archive, and sent folders as well as the refresh -command and how frequently I want my emails to be refreshed. -#+BEGIN_SRC emacs-lisp -(setq mu4e-maildir "~/.mail" - mu4e-trash-folder "/Trash" - mu4e-refile-folder "/Archive" - mu4e-sent-folder "/Sent" - mu4e-drafts-folder "/Drafts" - mu4e-get-mail-command "mbsync -a" - mu4e-update-interval 60) -#+END_SRC - -This source block is an example of the search queries in mu4e, and part of the -reason why I very much like mu4e: these bookmarks are actually defined by search -queries, but act as if they were just yet another type of custom inbox you get -with modern Email client (and often you don’t even get them). All these -bookmarks can be accessed through a shortcut on the main mu4e buffer, prefixed -by ~b~. So, for instance, my unread messages are accessed through ~bU~. -#+BEGIN_SRC emacs-lisp -(setq mu4e-bookmarks - `((,(s-join " " - '("NOT flag:trashed" - "AND (maildir:/Inbox OR maildir:/Junk)" - "AND NOT to:CONLANG@LISTSERV.BROWN.EDU" - "AND NOT to:AUXLANG@LISTSERV.BROWN.EDU" - "AND NOT to:ateliers-emacs@framalistes.org" - "AND NOT to:ateliers-paris@emacs-doctor.com" - "AND NOT list:ateliers-emacs.framalistes.org" - "AND NOT list:ateliers-paris.emacs-doctor.com")) - "Inbox" ?i) ;; Inbox without the linguistics mailing lists - (,(s-join " " - '("NOT flag:trashed" - "AND (maildir:/Inbox OR maildir:/Junk)" - "AND (f:/.*up8\.edu|.*univ-paris8.*/" - "OR c:/.*up8\.edu|.*univ-paris8.*/" - "OR t:/.*up8\.edu|.*univ-paris8.*/)")) - "University" ?u) ;; University-related emails - (,(s-join " " - '("to:CONLANG@LISTSERV.BROWN.EDU" - "OR to:AUXLANG@LISTSERV.BROWN.EDU")) - "Linguistics" ?l) ;; linguistics mailing lists - (,(s-join " " - '("list:ateliers-emacs.framalistes.org" - "OR to:ateliers-paris@emacs-doctor.com" - "OR list:ateliers-paris.emacs-doctor.com")) - "Emacs" ?e) ;; Emacs mailing list - ("maildir:/Sent" "Sent messages" ?s) - ("flag:unread AND NOT flag:trashed" "Unread messages" ?U) - ("date:today..now AND NOT flag:trashed" "Today's messages" ?t) - ("date:7d..now AND NOT flag:trashed" "Last 7 days" ?w) - ("date:1m..now AND NOT flag:trashed" "Last month" ?m) - ("date:1y..now AND NOT flag:trashed" "Last year" ?y) - ("flag:trashed AND NOT flag:trashed" "Trash" ?T) - ("mime:image/* AND NOT flag:trashed" "Messages with images" ?p))) -#+END_SRC - -On new email arrival, Emacs can send the system a notification which will be -handled as any other notification received by the system and will display the -number of unread emails to the user; in my case, notifications are handled by -AwesomeWM. -#+BEGIN_SRC emacs-lisp -(setq mu4e-enable-notifications t - mu4e-alert-email-notification-types '(count)) -(with-eval-after-load 'mu4e-alert - (mu4e-alert-set-default-style 'notifications)) -(add-hook 'mu4e-view-mode-hook 'visual-line-mode) -#+END_SRC - -This is the setup I have for my SMTP mail server: I point Emacs’ SMTP services -to my private mail server on its SMTP port, which should be used with a STARTTLS -stream. And I tell Emacs this is the default way to send an email. -#+BEGIN_SRC emacs-lisp -(setq smtpmail-smtp-server "mail.phundrak.com" - smtpmail-smtp-service 587 - smtpmail-stream-type 'starttls - message-send-mail-function 'smtpmail-send-it) -#+END_SRC - -I wish my emails to be signed by default using PGP/MIME. ~mu4e~ uses ~message~ -for composing new emails, so I simply need to add the function that will add the -signature to emails to the hook called when creating a new email. -#+BEGIN_SRC emacs-lisp -(add-hook 'mu4e-compose-mode-hook 'mml-secure-message-sign-pgpmime) -#+END_SRC - -mu4e used to be able to export emails to PDFs, but unfortunately this -possibility was discontinued. But we can (sort of) bring it back! -#+BEGIN_SRC emacs-lisp -(defun mu4e-action-open-as-pdf (msg) - "Export and open as PDF a mu4e `MSG'" - (let* ((date (mu4e-message-field msg :date)) - (infile (mu4e~write-body-to-html msg)) - (outfile (format-time-string "/tmp/%Y-%m-%d%H%M%S.pdf" date))) - (with-temp-buffer - (shell-command - (format "wkhtmltopdf %s %s" infile outfile) t)) - (find-file outfile))) - -(add-to-list 'mu4e-view-actions '("PDF view" . mu4e-action-open-as-pdf) t) -#+END_SRC - -Lastly, some emails are better displayed in a browser than in Emacs. My Emacs -build has the webkit browser enabled, so I’ll add an option to open with it -emails. -#+BEGIN_SRC emacs-lisp -(defun phundrak/mu4e-view-in-browser (msg) - (xwidget-webkit-browse-url (concat "file://" - (mu4e~write-body-to-html msg)))) - -(add-to-list 'mu4e-view-actions - '("Xwidget Webkit Browser" . phundrak/mu4e-view-in-browser) - t) -#+END_SRC - -**** Visual Configuration -The following also allows me to automatically include my signature in my Emails, -to view images in my Emacs buffers and to show me the address of my contacts and -not just their names. -#+BEGIN_SRC emacs-lisp -(setq mu4e-compose-signature-auto-include t - mu4e-view-show-images t - mu4e-view-prefer-html t - mu4e-view-show-addresses t) -#+END_SRC - -Now this hook is added so I can get a maximal width for the text of my emails, I -really don’t like it when lines are kilometers long. I would like instead to -hook ~visual-line-mode~ and ~auto-fill-mode~, but for some reasons Emacs throws -an error when I add them, So I go with ~visual-fill-column-mode~ instead. -#+BEGIN_SRC emacs-lisp -(add-hook 'mu4e-view-mode-hook 'visual-fill-column-mode) -#+END_SRC - -Icons are nice and all, but my current font does not display some of the default -icons set by mu4e. Due to this, I will define back these icons to the original -characters defined by mu4e: -#+BEGIN_SRC emacs-lisp -(setq mu4e-headers-draft-mark '("D" . "D") - mu4e-headers-flagged-mark '("F" . "F") - mu4e-headers-new-mark '("N" . "N") - mu4e-headers-passed-mark '("P" . "P") - mu4e-headers-replied-mark '("R" . "R") - mu4e-headers-seen-mark '("S" . "S") - mu4e-headers-trashed-mark '("T" . "T") - mu4e-headers-attach-mark '("a" . "a") - mu4e-headers-encrypted-mark '("x" . "x") - mu4e-headers-signed-mark '("s" . "s") - mu4e-headers-unread-mark '("u" . "u")) -#+END_SRC - -I don’t like the American time format. I really don’t. I prefer much more -something more standard, like ISO8601 standard. Not exactly ISO8601, but close -to it. Also, fuck the paywalls imposed by ISO. -#+BEGIN_SRC emacs-lisp -(setq mu4e-view-date-format "%Y-%m-%d %R" - mu4e-headers-date-format "%Y-%m-%d") -#+END_SRC - -**** Misc -I am unsure yet if this has any effect on mu4e, but this variable should -discourage mu4e from reading rich text emails and instead open them as plain -text. However, I do not wish to discourage opening HTML emails since I can open -them in the browser. -#+BEGIN_SRC emacs-lisp -(setq mm-discouraged-alternatives '("text/richtext")) -#+END_SRC - -*** Miscellaneous -I have a lot of variables that need to be set but don’t fall in any other -category, so I’ll collect them here. - -I have this regexp for detecting paragraphs. -#+BEGIN_SRC emacs-lisp -(setq paragraph-start "\f\\|[ \t]*$\\|[ \t]*[-+*] ") -#+END_SRC - -And this variable for Elcord so the main icon displayed in Discord is the icon -representing the current major-mode. I also don’t want to display the small -icon, so let’s get rid of that. -#+BEGIN_SRC emacs-lisp -(setq elcord-use-major-mode-as-main-icon t - elcord-show-small-icon nil) -#+END_SRC - -**** Pinentry -Pinentry should use the ~loopback~ mode when communicating with GnuPG. Let’s set -it so: -#+BEGIN_SRC emacs-lisp -(setq epg-pinentry-mode 'loopback) -#+END_SRC - -**** Wttr.in -Thanks to the wttrin package, I can get the weather forecast in Emacs for a -couple of cities. I just need to specify them to Emacs like so: -#+BEGIN_SRC emacs-lisp -(setq wttrin-default-cities '("Aubervilliers" "Paris" "Lyon" "Nonières" - "Saint Agrève")) -#+END_SRC - -However, the package is currently broken (it was last updated in 2017): wttr.in -now returns by default an HTML page instead of an ASCII result. In order to fix -it, a ~?A~ must be added at the end of the request in order to get a nice -output. Also, let’s use the HTTPS protocol while we’re at it. -#+BEGIN_SRC emacs-lisp -(defun wttrin-fetch-raw-string (query) - "Get the weather information based on your QUERY." - (let ((url-user-agent "curl")) - (add-to-list 'url-request-extra-headers wttrin-default-accept-language) - (with-current-buffer - (url-retrieve-synchronously - (format "http%s://wttr.in/%s?A" - (if (gnutls-available-p) "s" "") - query) - (lambda (status) - (switch-to-buffer (current-buffer)))) - (decode-coding-string (buffer-string) - 'utf-8)))) -#+END_SRC - -*** Nov-mode -~nov-mode~ is the mode used in the Epub reader. Here I will write a little -function that I will call through a hook each time I’m opening a new EPUB file. -#+BEGIN_SRC emacs-lisp -(defun my-nov-font-setup () - (face-remap-add-relative 'variable-pitch :family "Charis SIL" - :size 16 - :height 1.0)) -#+END_SRC - -Let’s bind this function to the ~nov-mode~ hook. By the way, we’ll also enable -the ~visual-line-mode~ here, just in case. -#+BEGIN_SRC emacs-lisp -(mapc (lambda (mode) - (add-hook 'nov-mode-hook mode)) - '('my-nov-font-setup 'visual-line-mode)) -#+END_SRC - -Let’s also set the maximum length of the lines in ~nov-mode~: -#+BEGIN_SRC emacs-lisp -(setq nov-text-width 80) -#+END_SRC - -*** Programming -**** LSP -When it comes to the LSP layer, there are some options which are not enabled by -default that I want to use, especially some modes I want to take advantage of. -This is why I enable first the ~lsp-treemacs-sync-mode~ so treemacs is LSP -aware: -#+BEGIN_SRC emacs-lisp -(lsp-treemacs-sync-mode 1) -#+END_SRC - -I also enable some layers related to ~dap~, the Debug Adapter Protocol, which -works really nicely with LSP. Let’s enable Dap’s modes: -#+BEGIN_SRC emacs-lisp -(dap-mode 1) -(dap-ui-mode 1) -(dap-tooltip-mode 1) -#+END_SRC - -Finally, I also want the documentation tooltip to show up when the cursor is -above a documented piece of code or symbol. Let’s enable that too: -#+BEGIN_SRC emacs-lisp -(tooltip-mode 1) -#+END_SRC - -**** ASM configuration -The first thing I will set with my ASM configuration is where the reference PDF -is located. -#+BEGIN_SRC emacs-lisp -(setq x86-lookup-pdf "~/Documents/code/asm/Intelx86/325383-sdm-vol-2abcd.pdf") -#+END_SRC - -I will also modify what the comment character is, from a ~;~ to a ~#~: -#+BEGIN_SRC emacs-lisp -(setq asm-comment-char ?\#) -#+END_SRC - -**** C/C++ -As the C/C++ syntax is checked by flycheck, let’s make sure we are using the -latest standard available, that is C++17 and C17, from Clang. -#+BEGIN_SRC emacs-lisp -(add-hook 'c-mode-hook - (lambda () - (setq flycheck-clang-language-standard "c17"))) -(add-hook 'c++-mode-hook - (lambda () - (setq flycheck-clang-language-standard "c++17"))) -#+END_SRC - -**** Dart configuration -For Dart, I mainly declared some custom shortcuts bound to ~dart-mode~ related -to flutter, so nothing too exciting here. Some prefix are declared in order to -avoid the shortcuts in helm to show up as just ~custom~. -#+begin_src emacs-lisp -(spacemacs/declare-prefix-for-mode 'dart-mode "mo" "user-defined") -(spacemacs/declare-prefix-for-mode 'dart-mode "mof" "flutter") -(spacemacs/declare-prefix-for-mode 'dart-mode "mofr" "flutter-run") -#+end_src - -Now, for the shortcuts themselves: -#+BEGIN_SRC emacs-lisp -(spacemacs/set-leader-keys-for-major-mode 'dart-mode - "ofH" 'flutter-hot-restart - "ofh" 'flutter-hot-reload - "ofq" 'flutter-quit - "ofr" (lambda () (interactive) (flutter-run "-v")) - "ofs" 'flutter-screenshot) -#+END_SRC - -**** Emacs Lisp -Here will be stored my configuration directly related to Emacs Lisp, including -some functions or default modes. - -***** Enable ~eldoc-mode~ by default -By default, if some Elisp code is opened, I want to enable ~eldoc-mode~ so I can -easily get some documentation on the symbols in the source code. This is done -via the use of hooks. -#+BEGIN_SRC emacs-lisp -(add-hook 'prog-mode-hook 'eldoc-mode) -#+END_SRC - -***** ~phundrak/write-to-buffer~ -I was very surprised when I discovered no such function exists in Elisp. This -function basically writes a string into a buffer, and optionally switches the -user to the buffer. Here is the code for that function: -#+BEGIN_SRC elisp :results silent -(defun write-to-buffer ($input-string $outputbuf &optional $switchbuf) - "Writes `$input-string' to the specified `output-buffer'. If -`switch-buffer' is non-nil, the active buffer will switch to the -output buffer; otherwise, it will take the user back to their -initial buffer. Works with `$input-string' as a string or a list -of strings." - (let ((oldbuf (current-buffer))) - (switch-to-buffer $outputbuf) - (cond ((char-or-string-p $input-string) (insert $input-string)) - ((listp $input-string) (dolist (elem $input-string) - (insert (format "%s\n" elem))))) - (unless $switchbuf - (switch-to-buffer oldbuf)))) -#+END_SRC - -**** Python -Emacs throws me an error about the python interpreter, let’s silence it: -#+BEGIN_SRC emacs-lisp -(setq python-shell-completion-native-disabled-interpreters '("python")) -#+END_SRC - -**** Rust -I need to point to racer where the source code of Rust is located so I can get -some documentation. This is installed with the ~rust-src~ component you can get -through ~rustup~. To install it, simply run -#+BEGIN_SRC sh :tangle no :exports code -rustup component add rust-src -#+END_SRC - -Now, the source code for Rust should be included in your installation. I -personally prefer to develop with Rust stable, so let’s indicate to Emacs to -search for documentation in the stable sources: -#+BEGIN_SRC emacs-lisp -(setq racer-rust-src-path - "~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src") -#+END_SRC - -Rust’s default ~cargo check~ command is already very good, however I also enjoy -getting some more hints while developping, and ~clippy~ does a very good job at -it. To get clippy, I need to run the following to install it: -#+BEGIN_SRC sh :tangle no :exports code -rustup compontent add clippy -#+END_SRC - -And this will get it installed with all of my Rust toolchain, and it will be -updated with it. Now, let’s indicate LSP that I want to use that instead of -~check~: -#+BEGIN_SRC emacs-lisp -(setq lsp-rust-analyzer-cargo-watch-command "clippy") -#+END_SRC - -Finally, I wish to enable ~electric-pair-mode~ and ~indent-guide-mode~ for Rust -files, so let’s enable that through the use of a hook: -#+BEGIN_SRC emacs-lisp :tangle no -(add-hook 'rust-mode-hook - '(lambda () - (local-set-key (kbd "TAB") #'company-indent-or-complete-common) - (electric-pair-mode 1))) -#+END_SRC - -**** Scheme -The Scheme configuration will be very short, I just need to tell Emacs the name -of the interpreter since it is not the default one: -#+BEGIN_SRC emacs-lisp -(setq geiser-chicken-binary "chicken-csi") -#+END_SRC - -*** Projectile -Projectile is an awesome utility which helps managing projects within Emacs. It -will automatically detect version controlled directories, and will by default -assume this is a project I can be working on. However, there are some -directories that are version controlled that I do not want to see in my list of -projects, namely all the cached AUR packages from my AUR helper, ~paru~. They -are all stored in the same parent directory, so let’s ignore that. I will also -make Emacs ignore all ~node_modules~ directories it could encounter. And for -some reason, =~/.emacs.spacemacs= is always in my projects list (I now use -XDG-compliant directories), so let’s also ignore that. -#+BEGIN_SRC emacs-lisp -(setq projectile-ignored-projects '("~/.cache/paru" "~/.emacs.spacemacs" "/tmp")) -(add-to-list 'projectile-globally-ignored-directories "node_modules") -#+END_SRC - -*** Readers -Thanks to Discord user shanks, I discovered pdf-tools gives us access to a very -interesting minor mode: ~pdf-view-midnight-minor-mode~. And this is exactly what -I missed in my Emacs PDF reader from Zathura! I still think Zathura is a -fantastic tool, but now my PDF reader in Emacs is almost perfect! I just need to -adjust some colors: -#+BEGIN_SRC emacs-lisp -(with-eval-after-load 'pdf-view - (setq pdf-view-midnight-colors '("#d8dee9" . "#2e3440"))) -#+END_SRC - -Let’s also enable dark mode automatically: -#+BEGIN_SRC emacs-lisp -(add-hook 'pdf-tools-enabled-hook 'pdf-view-midnight-minor-mode) -#+END_SRC - -And there we go! A beautiful, dark-mode PDF reader inside Emacs! And with -Spacemacs, I can enable or disable this minor mode anytime with the shortcut -~, n~. - -*** Security -This paragraph is about making Emacs and GPG as a whole (since Emacs is /always/ -open on my computer) more secure. The first thing I want to make is a function -that will close any buffer that contains an open ~.gpg~ file –I certainly do not -want anyone to be able to read such files on my computer if I leave it even for -a couple of minutes. -#+BEGIN_SRC emacs-lisp -(defun phundrak/kill-gpg-buffers () - "Kill GPG buffers." - (interactive) - (let ((buffers-killed 0)) - (dolist (buffer (buffer-list)) - (with-current-buffer buffer - (when (string-match ".*\.gpg$" (buffer-name buffer)) - (message "Auto killing .gpg buffer '%s'" (buffer-name buffer)) - (when (buffer-modified-p buffer) - (save-buffer)) - (kill-buffer buffer) - (setq buffers-killed (+ buffers-killed 1))))) - (unless (zerop buffers-killed) - ;; Kill gpg-agent. - (shell-command "gpgconf --kill gpg-agent") - (message "%s .gpg buffers have been autosaved and killed" buffers-killed)))) -#+END_SRC - -Notice the ~(shell-command "gpgconf --kill gpg-agent")~ command there: it kills -~gpg-agent~ which will always respawn each time GPG2 is invoked. That way, I -know anyone trying to open a GPG file will have to insert my password when -trying to do so instead of just hoping I entered it not long ago and they won’t -have to. - -But surely, if I only define this function and hope to call it each time I leav -my computer, surely at one point I will forget to execute it before leaving. I -can’t trust myself to always call it manually. Which is why I’ll ask Emacs -itself to call it after it detects a minute of idling. It may become from times -to times a bit of a pain, but at least I’m now sure I won’t ever have to worry -about someone reading my GPG files open in Emacs while I’m out for a quick -break. -#+BEGIN_SRC emacs-lisp -(run-with-idle-timer 60 t 'phundrak/kill-gpg-buffers) -#+END_SRC - -*** Snippets -:PROPERTIES: -:HEADER-ARGS:snippet: :padline no :mkdirp yes -:END: -Yasnippet’s snippets tool is extremely powerful and allows me to write very -quickly code. For now, we have snippets for two modes. The files you’ll see -below are exported to ~$HOME/.emacs.spacemacs/private/snippets/~ and to their -respective mode directory. For instance, my ~caption~ snippet for org-mode will -be exported to ~$HOME/.emacs.spacemacs/private/snippets/org-mode/caption~. - -Be aware that on top of these custom snippets, I also use the package -[[file:awesome.org::#Autostart-f2cf42fe][yasnippet-snippets]] which provide plenty of already made snippets. - -**** Rust snippets -I have so far two snippets, the first one is actually just a convenience to make -it easier to type a ~println!~ macro than the default snippet. -#+BEGIN_SRC snippet :tangle ~/.emacs.spacemacs/private/snippets/rust-mode/println -# -*- mode: snippet -*- -# name: println -# key: pln -# -- -println!("${1:{}}", $2); -#+END_SRC - -The second one is more interesting: it is used to create a ~new~ method -for a struct, and it will try to create a function that will assign -each argument passed to the method to members of the struct. It relies -on the custom function [[file:./spacemacs.md#phundrak-yas-rust-new-assignments][I wrote here]]. -#+BEGIN_SRC snippet :tangle ~/.emacs.spacemacs/private/snippets/rust-mode/new -# -*- mode: snippet -*- -# name: new -# key: _new -# -- -fn new(${1:args}) -> Self { - $0 - Self { - ${1:$(phundrak-yas-rust-new-assignments yas-text)} - } -} -#+END_SRC - -**** Org headers -The first two snippets are used to add HTML or LaTeX attributes to elements in -org-mode. The third also has a similar usage, inserting a ~#+CAPTION~ header -before an element, as well as the fourth which inserts a ~#+NAME~ header. -#+BEGIN_SRC snippet :tangle ~/.emacs.spacemacs/private/snippets/org-mode/attr_html -# -*- mode: snippet -*- -# name: ATTR HTML -# key: > - -<> - -<> - -(let* ((makeface (string= "yes" makeface)) - (headers (cadr input)) - (faces (mapcar (lambda (face) - (phundrak-filter (lambda (elem) - (or (numberp (cadr elem)) - (not (string= "" - (cadr elem))))) - (phundrak-zip headers face))) - (cddr input)))) - (mapconcat (lambda (face) - (concat - (format (if makeface "`(%s ((t " "(%s `") - (cadr (assoc "Name" face))) - (format "(%s %s %s %s)" - (if (assoc "additional" face) - (cadr (assoc "additional" face)) - "") - (let ((result "")) - (dolist (property '("inherit" "weight" "height" "foreground" - "background" "underline") - result) - (let ((prop (assoc property face))) - (when prop - (setf result (format "%s :%s %s" - result - property - (if (numberp (cadr prop)) - (number-to-string (cadr prop)) - (cadr prop)))))))) - (if (assoc "font" face) - (format ":font \"%s\"" - (cadr (assoc "font" face))) - "") - (if (assoc "family" face) - (format ":family \"%s\"" - (cadr (assoc "family" face))) - "")) - (if makeface - ")) t)" - ")"))) - faces - "\n")) -#+END_SRC - -Sometimes, some visual properties just don’t fit right for me and I need to edit -them. This is the case for example for org-mode for which I want to have a mix -of fixed and variable pitches. Below you can see the code that does that for me, -I’ll get into more detail below this code block. -#+BEGIN_SRC emacs-lisp :noweb yes -(let ( - <> - ) - (custom-theme-set-faces - 'user - <> - <> - <> - )) -#+END_SRC - -***** Diff and Magit -Apparently, diff and Magit faces do not follow the nord theme’s color scheme, so -let’s redefine their background and sometimes their foreground. -#+tblname: diff-faces -| / | | -| Name | background | -|----------------------+------------------| -| ediff-current-diff-A | ,phundrak-nord11 | -| ediff-current-diff-C | ,phundrak-nord13 | -| ediff-current-diff-C | ,phundrak-nord14 | - -***** Mu4e -The nord theme is great and all, but for some reason some faces in mu4e aren’t -displayed properly, such as the ~mu4e-highlight-face~. Let’s fix that! -#+tblname: mu4e-faces -| / | | | -| Name | background | foreground | -|---------------------+-----------------+-----------------| -| mu4e-highlight-face | ,phundrak-nord9 | ,phundrak-nord0 | - -***** Org-mode -Fonts will play an important part in this, but so will colors and font size. The -following code is largely based on the one found [[https://zzamboni.org/post/beautifying-org-mode-in-emacs/][on this blog post]] and [[https://lepisma.xyz/2017/10/28/ricing-org-mode/][this one]]. -First here are some common properties that will be reused in faces below: -#+tblname: org-common-faces -| / | | < | | | -| Name | inherit | font | height | weight | -|---------+---------+---------------+--------+--------| -| orgfont | | Charis SIL | 120 | | -| head | default | | | bold | -| fixed | | Cascadia Code | 0.8 | | - -#+tblname: org-faces -| / | < | | | | | | | | -| Name | additional | inherit | foreground | background | height | weight | italic | underline | -|---------------------------+------------------+-------------------------------+------------------+-----------------+--------+--------+--------+-----------| -| org-level-1 | ,@orgfont ,@head | | ,phundrak-nord15 | | 1.75 | | t | | -| org-level-2 | ,@orgfont ,@head | | ,phundrak-nord10 | | 1.5 | | t | | -| org-level-3 | ,@orgfont ,@head | | ,phundrak-nord9 | | 1.25 | | t | | -| org-level-4 | ,@orgfont ,@head | | ,phundrak-nord15 | | 1.1 | | t | | -| org-level-5 | ,@orgfont ,@head | | ,phundrak-nord8 | | | | t | | -| org-level-6 | ,@orgfont ,@head | | ,phundrak-nord7 | | | | t | | -| org-level-7 | ,@orgfont ,@head | | ,phundrak-nord15 | | | | t | | -| org-level-8 | ,@orgfont ,@head | | ,phundrak-nord6 | | | | t | | -| org-document-title | ,@orgfont ,@head | | ,phundrak-nord11 | | 2.0 | | t | | -| variable-pitch | ,@orgfont | | | | | | | | -| org-block | ,@fixed | | | ,phundrak-nord1 | | | | | -| org-block-begin-line | ,@fixed | | | ,phundrak-nord1 | | | | | -| org-block-end-line | ,@fixed | | | ,phundrak-nord1 | | | | | -| org-indent | ,@fixed | | | | | | | | -| org-formula | ,@fixed | | | | | | | | -| org-macro | ,@fixed | | | | | | | | -| org-target | ,@fixed | | | | | | | | -| org-property-value | ,@fixed | | | | | | | | -| org-drawer | ,@fixed | | ,phundrak-nord10 | | | | | | -| org-table | ,@fixed | | ,phundrak-nord14 | | | | | | -| org-date | ,@fixed | | ,phundrak-nord13 | | | | | | -| org-code | ,@fixed | shadow | | | | | | | -| org-verbatim | ,@fixed | shadow | | | | | | | -| org-document-info-keyword | ,@fixed | shadow | | | | | | | -| org-tag | ,@fixed | shadow | | | | bold | | | -| org-meta-line | ,@fixed | font-lock-comment-face | | | 0.8 | | | | -| org-special-keyword | ,@fixed | font-lock-comment-face | ,phundrak-nord15 | | 0.8 | | | | -| org-checkbox | ,@fixed | (org-todo shadow fixed-pitch) | | | | | | | -| org-document-info | | | ,phundrak-nord12 | | | | | | -| org-link | | | ,phundrak-nord8 | | | | | t | - -**** Info colors -The package ~info-colors~ adds colors to Emacs’ info mode. Let’s enable it: -#+BEGIN_SRC emacs-lisp -(add-hook 'Info-selection-hook 'info-colors-fontify-node) -#+END_SRC - -**** Prettified symbols -Just because it is pleasing to the eye, some symbols in source code get -prettified into simpler symbols. Here is the list of symbols that are to be -prettified. You can see in the corresponding comment what symbol will be -displayed. -#+BEGIN_SRC emacs-lisp -(setq prettify-symbols-alist '(("lambda" . 955) ; λ - ("mapc" . 8614) ; ↦ - ("map" . 8614) ; ↦ - (">>" . 187) ; » - ("<<" . 171) ; « - )) -#+END_SRC - -Let’s enable this mode globally. -#+BEGIN_SRC emacs-lisp -(global-prettify-symbols-mode 1) -#+END_SRC - -**** Misc -Emacs is already silent, but let’s set the bell as visible: -#+BEGIN_SRC emacs-lisp -(setq visible-bell t) -#+END_SRC - -I would also like to disable the global ~hl-mode~, I find it quite annoying. -#+BEGIN_SRC emacs-lisp -(global-hl-line-mode -1) -#+END_SRC - -** Footnotes - -[fn:2] [[https://labs.phundrak.com/phundrak/dotfiles/src/branch/master/.spacemacs][labs.phundrak.com/phundrak/dotfiles/src/branch/master/.spacemacs]] - -[fn:1] [[https://labs.phundrak.com/phundrak/dotfiles/src/branch/master/org/config/emacs.org][labs.phundrak.com/phundrak/dotfiles/src/branch/master/org/config/emacs.org]] diff --git a/docs/emacs/keybindings.org b/docs/emacs/keybindings.org index d642645..b4e7292 100644 --- a/docs/emacs/keybindings.org +++ b/docs/emacs/keybindings.org @@ -83,6 +83,7 @@ Undefining some stuff to make keybind prefixes work correctly. <> <> <> + <> <> <>) #+end_src @@ -499,6 +500,26 @@ My toggle keybindings are prefixed by ~t~. | is | set-input-method | | *** TODO Rewrite =my/modify-frame-alpha-background/body= :noexport: +** VCS +Magit is awesome, but I rarely use it nowadays in favour of [[https://jj-vcs.github.io/][Jujutsu]]. +And for that, I use =vc.el= in Emacs thanks to =vc-jj= (see [[file:./packages/applications.md#Jujutsu][my Jujutsu +config for Emacs]]). But this is only half the story, let me now set my +keybinds for =vc.el=. ethey are all prefixed by =v=. + +#+name: keybindings-vc +| Key | Function | Description | Package | +|-----+-----------------------+-------------+---------| +| a | vc-annotate | | vc | +| r | vc-revset | | vc | +| | | VCS | | +| j | | jujutsu | | +| ja | vc-jj-abandon-change | abandon | vc-jj | +| jb | | bookmarks | | +| jbd | vc-jj-bookmark-delete | delete | vc-jj | +| jbr | vc-jj-bookmark-rename | rename | vc-jj | +| jbs | vc-jj-bookmark-set | set | vc-jj | +| je | vc-jj-edit-change | edit | vc-jj | +| jn | vc-jj-new-change | new | vc-jj | ** Windows A couple of keybindings are hidden from which-key, otherwise there’s not diff --git a/docs/emacs/packages/applications.org b/docs/emacs/packages/applications.org index 6b58387..cf95b37 100644 --- a/docs/emacs/packages/applications.org +++ b/docs/emacs/packages/applications.org @@ -1530,9 +1530,10 @@ compatible with git repositories. In fact, I pretty much don’t use git anymore, jj (abbreviation of Jujutsu) has almost completely replaced git for me. -I like Magit’s interface, as you can see in my [[file:./applications.md#magit][Magit]] config. -Therefore, let’s install =majjit=, my slow and scuffed attempt at -bringing some Magit features to jujutsu. +I like Magit’s interface, as you can see in my [[file:./applications.md#magit][Magit]] config. But +reimplementing it entirely probably won’t happen on my end (lack of +time, mainly), so I’ll leave that up to people more motivated than me. +In the meantime, I can reimplement some of its API with =majjit=. #+begin_src emacs-lisp (use-package majjit :defer t @@ -1544,6 +1545,22 @@ bringing some Magit features to jujutsu. :custom ((majjit-default-directory "~/code/"))) #+end_src +Speaking of other projects others did better, I use =vc-jj=, which +brings basic jujutsu support to =project.el= and =vc.el=. And I’ll just +add my grain of salt to force =project.el= to recognize jujutsu +repositories as projects. +#+begin_src emacs-lisp +(use-package vc-jj + :straight (:build t) + :after '(project vc) + :config + (add-to-list 'project-vc-extra-root-markers ".jj") + :init + (require 'project) + (require 'vc) + (require 'vc-jj)) +#+end_src + Though, I’ll be honest, I generally prefer to use Jujutsu in the terminal, unlike git. Something I do use Emacs for, however, is writing my commit messages. @@ -1556,12 +1573,6 @@ writing my commit messages. :init (add-to-list 'auto-mode-alist '("\\.jjdescription\\'" . jjdescription-mode))) #+end_src -And I want Emacs to know that any directory which has a =.jj= repository -is the root of a project. -#+begin_src emacs-lisp -;;(add-to-list 'project-vc-extra-root-markers ".jj") -#+end_src - *** Forge Forge acts as an interface for GitHub, GitLab, and Bitbucket inside Magit. A lot of possibilities are present, you can read issues and diff --git a/docs/emacs/packages/exwm.org b/docs/emacs/packages/exwm.org index d597902..c1232a4 100644 --- a/docs/emacs/packages/exwm.org +++ b/docs/emacs/packages/exwm.org @@ -1,7 +1,7 @@ #+title: Emacs — Packages — EXWM (Deprecated) #+setupfile: ../../headers #+property: header-args:emacs-lisp :mkdirp yes :lexical t :exports code -#+property: header-args:emacs-lisp+ :tangle ~/.config/emacs/lisp/exwm.el +#+property: header-args:emacs-lisp+ :tangle no #+property: header-args:emacs-lisp+ :mkdirp yes :noweb no-export * EXWM (Deprecated) @@ -47,7 +47,7 @@ easily. In order to launch Emacs with EXWM with ~startx~, I need a ~xinit~ file. This one is exported to ~$HOME/.xinitrc.emacs~. -#+begin_src sh :tangle ~/.xinitrc.emacs :shebang "#!/bin/sh" +#+begin_src sh :tangle no :shebang "#!/bin/sh" xhost +SI:localuser:$USER # Set fallback cursor diff --git a/docs/emacs/packages/programming.org b/docs/emacs/packages/programming.org index 501ed7b..3954671 100644 --- a/docs/emacs/packages/programming.org +++ b/docs/emacs/packages/programming.org @@ -455,6 +455,10 @@ Yes, I love org-mode and I largely prefer to use it instead of Markdown due to its far superior power and abilities. But still, sometimes I need to use Markdown because not everyone uses org-mode, unfortunately. + +I prefer to use =pandoc= to =markdown= as my =markdown-command=, as it +better handles modern Markdown, including Github’s dialect, which +=markdown= has troubles with. #+begin_src emacs-lisp (use-package markdown-mode :defer t @@ -465,6 +469,9 @@ unfortunately. ("\\.mdx\\'" . markdown-mode)) :hook (markdown-mode . orgtbl-mode) :hook (markdown-mode . visual-line-mode) + :config + (setq markdown-fontify-code-blocks-natively t + markdown-command '("," "pandoc" "--from=markdown" "--to=html5")) :general (phundrak/evil :keymaps 'markdown-mode-map @@ -550,9 +557,7 @@ unfortunately. "xp" #'markdown-insert-pre "xP" #'markdown-pre-region "xs" #'markdown-insert-strike-through - "xq" #'markdown-blockquote-region) - :config - (setq markdown-fontify-code-blocks-natively t)) + "xq" #'markdown-blockquote-region)) #+end_src Since most of my Markdown files are related to GitHub, I’d like to be @@ -704,6 +709,28 @@ When editing some scripts though, I need to use the built-in ~shell-mode~. :mode "/\\(Cargo.lock\\|\\.cargo/config\\)\\'") #+end_src +*** Typst +[[https://typst.app/][Typst]] is an attempt at making a simpler LaTeX alternative with a quite +simple language that still has some programming capabilities. In my +case, I use [[https://codeberg.org/meow_king/typst-ts-mode/][typst-ts-mode]] to get a major mode for Typst, relying on +[[https://github.com/uben0/tree-sitter-typst][uben0’s Typst treesitter module]]. + +#+begin_src emacs-lisp +(use-package typst-ts-mode + :defer t + :straight (:build t)) +#+end_src + +I also wrote a package that extends =lsp-mode= to support [[https://github.com/Myriad-Dreamin/tinymist][tinymist]] as an +LSP server for Typst. +#+begin_src emacs-lisp +(use-package lsp-typst + :after lsp-mode + :mode "\\.typ\\'" + :hook (typst-ts-mode . lsp-deferred) + :straight (:build t :type git :repo "labs.phundrak.com/phundrak/lsp-typst")) +#+end_src + *** Yaml #+begin_src emacs-lisp (use-package yaml-mode diff --git a/docs/README.org b/docs/index.org similarity index 78% rename from docs/README.org rename to docs/index.org index 76bbe37..d4b086a 100644 --- a/docs/README.org +++ b/docs/index.org @@ -6,6 +6,13 @@ Hi, I’m P’undrak (pronounced /PUN-drak/, or more exactly {{{phon(pʰynɖak̚ also known as Lucien Cartier-Tilet. If you want to know more about me, you can head to my [[https://phundrak.com/en][main website]]. +#+html: ::: warning +This website is currently not maintained, aside from the Emacs part of +it. If you want to see my current Linux configuration, head over to my +[[https://labs.phundrak.com/phundrak/nix-config][NixOS configuration]]. This website will be, at some point, rewritten to +reflect it. +#+html: ::: + This website is my collection of dotfiles for my daily GNU/Linux environment, tweaked to my liking. The sidebar will act as an index of the various tools I use and their configuration. diff --git a/docs/img/emacs/emacs-eshell.svg b/docs/public/img/emacs/emacs-eshell.svg similarity index 100% rename from docs/img/emacs/emacs-eshell.svg rename to docs/public/img/emacs/emacs-eshell.svg diff --git a/docs/img/emacs/emacs.png b/docs/public/img/emacs/emacs.png similarity index 100% rename from docs/img/emacs/emacs.png rename to docs/public/img/emacs/emacs.png diff --git a/docs/img/emacs/emacs.svg b/docs/public/img/emacs/emacs.svg similarity index 100% rename from docs/img/emacs/emacs.svg rename to docs/public/img/emacs/emacs.svg diff --git a/docs/img/emacs/eshell.svg b/docs/public/img/emacs/eshell.svg similarity index 100% rename from docs/img/emacs/eshell.svg rename to docs/public/img/emacs/eshell.svg diff --git a/docs/img/emacs/org-mode.svg b/docs/public/img/emacs/org-mode.svg similarity index 100% rename from docs/img/emacs/org-mode.svg rename to docs/public/img/emacs/org-mode.svg diff --git a/docs/img/emacs/real_programmers.png b/docs/public/img/emacs/real_programmers.png similarity index 100% rename from docs/img/emacs/real_programmers.png rename to docs/public/img/emacs/real_programmers.png diff --git a/docs/img/git/diff-default.png b/docs/public/img/git/diff-default.png similarity index 100% rename from docs/img/git/diff-default.png rename to docs/public/img/git/diff-default.png diff --git a/docs/img/git/diff-histogram.png b/docs/public/img/git/diff-histogram.png similarity index 100% rename from docs/img/git/diff-histogram.png rename to docs/public/img/git/diff-histogram.png diff --git a/docs/img/git/diff-moved.png b/docs/public/img/git/diff-moved.png similarity index 100% rename from docs/img/git/diff-moved.png rename to docs/public/img/git/diff-moved.png diff --git a/docs/img/git/merge-default.png b/docs/public/img/git/merge-default.png similarity index 100% rename from docs/img/git/merge-default.png rename to docs/public/img/git/merge-default.png diff --git a/docs/img/git/merge-zdiff3.png b/docs/public/img/git/merge-zdiff3.png similarity index 100% rename from docs/img/git/merge-zdiff3.png rename to docs/public/img/git/merge-zdiff3.png diff --git a/docs/img/icon.png b/docs/public/img/icon.png similarity index 100% rename from docs/img/icon.png rename to docs/public/img/icon.png diff --git a/docs/img/icon.webp b/docs/public/img/icon.webp similarity index 100% rename from docs/img/icon.webp rename to docs/public/img/icon.webp diff --git a/docs/img/stumpwm.png b/docs/public/img/stumpwm.png similarity index 100% rename from docs/img/stumpwm.png rename to docs/public/img/stumpwm.png diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index a36ab4c..0000000 --- a/package-lock.json +++ /dev/null @@ -1,5337 +0,0 @@ -{ - "name": "config.phundrak.com", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "config.phundrak.com", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "less": "^4.4.2", - "nord": "^0.2.1" - }, - "devDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.26", - "@vuepress/plugin-slimsearch": "^2.0.0-rc.118", - "@vuepress/plugin-umami-analytics": "2.0.0-rc.118", - "@vuepress/theme-default": "2.0.0-rc.118", - "baseline-browser-mapping": "^2.10.0", - "sass-embedded": "^1.97.3", - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.11.0.tgz", - "integrity": "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mdit-vue/plugin-component": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-3.0.2.tgz", - "integrity": "sha512-Fu53MajrZMOAjOIPGMTdTXgHLgGU9KwTqKtYc6WNYtFZNKw04euSfJ/zFg8eBY/2MlciVngkF7Gyc2IL7e8Bsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14.1.2", - "markdown-it": "^14.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mdit-vue/plugin-frontmatter": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-3.0.2.tgz", - "integrity": "sha512-QKKgIva31YtqHgSAz7S7hRcL7cHXiqdog4wxTfxeQCHo+9IP4Oi5/r1Y5E93nTPccpadDWzAwr3A0F+kAEnsVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit-vue/types": "3.0.2", - "@types/markdown-it": "^14.1.2", - "gray-matter": "^4.0.3", - "markdown-it": "^14.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mdit-vue/plugin-headers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-3.0.2.tgz", - "integrity": "sha512-Z3PpDdwBTO5jlW2r617tQibkwtCc5unTnj/Ew1SCxTQaXjtKgwP9WngdSN+xxriISHoNOYzwpoUw/1CW8ntibA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit-vue/shared": "3.0.2", - "@mdit-vue/types": "3.0.2", - "@types/markdown-it": "^14.1.2", - "markdown-it": "^14.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mdit-vue/plugin-sfc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-3.0.2.tgz", - "integrity": "sha512-dhxIrCGu5Nd4Cgo9JJHLjdNy2lMEv+LpimetBHDSeEEJxJBC4TPN0Cljn+3/nV1uJdGyw33UZA86PGdgt1LsoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit-vue/types": "3.0.2", - "@types/markdown-it": "^14.1.2", - "markdown-it": "^14.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mdit-vue/plugin-title": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-3.0.2.tgz", - "integrity": "sha512-KTDP7s68eKTwy4iYp5UauQuVJf+tDMdJZMO6K4feWYS8TX95ItmcxyX7RprfBWLTUwNXBYOifsL6CkIGlWcNjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit-vue/shared": "3.0.2", - "@mdit-vue/types": "3.0.2", - "@types/markdown-it": "^14.1.2", - "markdown-it": "^14.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mdit-vue/plugin-toc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-3.0.2.tgz", - "integrity": "sha512-Dz0dURjD5wR4nBxFMiqb0BTGRAOkCE60byIemqLqnkF6ORKKJ8h5aLF5J5ssbLO87hwu81IikHiaXvqoiEneoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit-vue/shared": "3.0.2", - "@mdit-vue/types": "3.0.2", - "@types/markdown-it": "^14.1.2", - "markdown-it": "^14.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mdit-vue/shared": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-3.0.2.tgz", - "integrity": "sha512-anFGls154h0iVzUt5O43EaqYvPwzfUxQ34QpNQsUQML7pbEJMhcgkRNvYw9hZBspab+/TP45agdPw5joh6/BBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit-vue/types": "3.0.2", - "@types/markdown-it": "^14.1.2", - "markdown-it": "^14.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mdit-vue/types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-3.0.2.tgz", - "integrity": "sha512-00aAZ0F0NLik6I6Yba2emGbHLxv+QYrPH00qQ5dFKXlAo1Ll2RHDXwY7nN2WAfrx2pP+WrvSRFTGFCNGdzBDHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@mdit/helper": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@mdit/helper/-/helper-0.22.1.tgz", - "integrity": "sha512-lDpajcdAk84aYCNAM/Mi3djw38DJq7ocLw5VOSMu/u2YKX3/OD37a6Qb59in8Uyp4SiAbQoSHa8px6hgHEpB5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14.1.2" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "markdown-it": "^14.1.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } - } - }, - "node_modules/@mdit/plugin-alert": { - "version": "0.22.3", - "resolved": "https://registry.npmjs.org/@mdit/plugin-alert/-/plugin-alert-0.22.3.tgz", - "integrity": "sha512-9g99rjLCFd8upA/DXbhGmEM7GMFocy6SRk4OekxuAy9t1aDOE/r5IJgUbBIvc9kMkg39ug0yXtMkKwAt2zp5Hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14.1.2" - }, - "peerDependencies": { - "markdown-it": "^14.1.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } - } - }, - "node_modules/@mdit/plugin-container": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@mdit/plugin-container/-/plugin-container-0.22.2.tgz", - "integrity": "sha512-QBBti5EyQzVl/qzFAD9YAhiAB9S2zF/4MPAS4kwm7VkmeYrcj2HpZpA7snMjnWh3CtriDcaIMInhg0vDtDwyfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14.1.2" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "markdown-it": "^14.1.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } - } - }, - "node_modules/@mdit/plugin-tab": { - "version": "0.22.3", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tab/-/plugin-tab-0.22.3.tgz", - "integrity": "sha512-TPMHgVEsqvsCPVwt1KZGhJsVW/6XNyp9VXy2X2nNXvaklfK2+l6DJBWLeN+lPwzXvASnE5CkEFvaY4627zDt9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit/helper": "0.22.1", - "@types/markdown-it": "^14.1.2" - }, - "peerDependencies": { - "markdown-it": "^14.1.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.50", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.50.tgz", - "integrity": "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.0.tgz", - "integrity": "sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.0.tgz", - "integrity": "sha512-M6s9cr10MibETyo8JsOkq+Lo1+lU6hcvb1MApnUql5qte/5hMEgzlN8/ReIKNfRV8rrqX50W1BX9zoUhC192RA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.0.tgz", - "integrity": "sha512-BqCoMoIbn0keKys+dEAdBa70EtOwV1bEsQCUgU9FdiZmmMge/Zk7LlkYGqbrdHR+Frnt0E1FOanly+rlwvvQzw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.0.tgz", - "integrity": "sha512-SIMzST3VFNXDAbeIWDWiFCNM5qncUBDWaEV7NfE7oZbDt2mgfW4MvbKdbYiGOLoM32gbTv608UMd0XktEYSD7w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.0.tgz", - "integrity": "sha512-ezjfSQMP7ArdUsbBwbQIfwAlhE84I2iVnzQNCFSveqV42q+BmKlzVpf7mxv5EchLcoWU4y6/heFzVg1F+hodUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.0.tgz", - "integrity": "sha512-9+qTWGW9AZRhnUgwtTwzNwcPlL87ngkeN0LA+q1bADvmY9aNvWaF2TFW8BZgnQPYxpDI7+rMVLivcd4V737TAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.0.tgz", - "integrity": "sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.0.tgz", - "integrity": "sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.0.tgz", - "integrity": "sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.0.tgz", - "integrity": "sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.0.tgz", - "integrity": "sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.0.tgz", - "integrity": "sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.0.tgz", - "integrity": "sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.0.tgz", - "integrity": "sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.0.tgz", - "integrity": "sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.0.tgz", - "integrity": "sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.0.tgz", - "integrity": "sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.0.tgz", - "integrity": "sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.0.tgz", - "integrity": "sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.0.tgz", - "integrity": "sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.0.tgz", - "integrity": "sha512-yTB9TgfWj5wHe5QgktAgXTLLot1gvEjl1NiPPAUiCs4oPrIWFl5V4nC3GrkNdj9LaAU4s94nVrGbGOCqUpyWsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.0.tgz", - "integrity": "sha512-5LOhoaesY3doG1c+ac/2JtgREpKoJr5bUHH8tKY0V8di7+uSV6BwLs2PlR0/yzefGOkR+wE7ZolZphHCsyG5Rw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.0.tgz", - "integrity": "sha512-yYkWHhmbhRTWTnWos5HC4GcPQfjlzzCNbM9e/+GXrLuaBXYA3qSDR9f0Vgufd5S8yX81U8jPKp7ZnAjZFMtRnw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.0.tgz", - "integrity": "sha512-SoTb6lPg25xZlA2ibwQ++ahCCnH+FP0qmEuafMJ4gznZKOlXioKEAeJLgCrqjM98ACziXM9V1amFjICVL4IFoA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.0.tgz", - "integrity": "sha512-5L+T1fMX4RIEBoZzT0+sQ0PhTS36NULFmMXtl1TZo44TMAROIMHbZufSOjVWt/Y622BtxgxtaNOokbTDvfsrZA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/jsonfile": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/markdown-it-emoji": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it-emoji/-/markdown-it-emoji-3.0.1.tgz", - "integrity": "sha512-cz1j8R35XivBqq9mwnsrP2fsz2yicLhB8+PDtuVkKOExwEdsVBNI+ROL3sbhtR5occRZ66vT0QnwFZCqdjf3pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.2.tgz", - "integrity": "sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.50" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz", - "integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.24", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz", - "integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.24", - "@vue/shared": "3.5.24" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.24.tgz", - "integrity": "sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/compiler-core": "3.5.24", - "@vue/compiler-dom": "3.5.24", - "@vue/compiler-ssr": "3.5.24", - "@vue/shared": "3.5.24", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.24.tgz", - "integrity": "sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.24", - "@vue/shared": "3.5.24" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/devtools-kit": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.5.tgz", - "integrity": "sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^8.0.5", - "birpc": "^2.6.1", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^2.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.5.tgz", - "integrity": "sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.24.tgz", - "integrity": "sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.24" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.24.tgz", - "integrity": "sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.24", - "@vue/shared": "3.5.24" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.24.tgz", - "integrity": "sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.24", - "@vue/runtime-core": "3.5.24", - "@vue/shared": "3.5.24", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.24.tgz", - "integrity": "sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.24", - "@vue/shared": "3.5.24" - }, - "peerDependencies": { - "vue": "3.5.24" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz", - "integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vuepress/bundler-vite": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-rc.26.tgz", - "integrity": "sha512-4+YfKs2iOxuVSMW+L2tFzu2+X2HiGAREpo1DbkkYVDa5GyyPR+YsSueXNZMroTdzWDk5kAUz2Z1Tz1lIu7TO2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitejs/plugin-vue": "^6.0.1", - "@vuepress/bundlerutils": "2.0.0-rc.26", - "@vuepress/client": "2.0.0-rc.26", - "@vuepress/core": "2.0.0-rc.26", - "@vuepress/shared": "2.0.0-rc.26", - "@vuepress/utils": "2.0.0-rc.26", - "autoprefixer": "^10.4.21", - "connect-history-api-fallback": "^2.0.0", - "postcss": "^8.5.6", - "postcss-load-config": "^6.0.1", - "rollup": "^4.52.4", - "vite": "~7.1.9", - "vue": "^3.5.22", - "vue-router": "^4.6.0" - } - }, - "node_modules/@vuepress/bundlerutils": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/@vuepress/bundlerutils/-/bundlerutils-2.0.0-rc.26.tgz", - "integrity": "sha512-OnhUvzuJFEzPBjivZX7j6EhPE6sAwAIfyi3pAFmOpQDHPP7/l0q2I4bNVVGK4t9EZDu4N7Dl40/oFHhIMy5New==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/client": "2.0.0-rc.26", - "@vuepress/core": "2.0.0-rc.26", - "@vuepress/shared": "2.0.0-rc.26", - "@vuepress/utils": "2.0.0-rc.26", - "vue": "^3.5.22", - "vue-router": "^4.6.0" - } - }, - "node_modules/@vuepress/cli": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-rc.26.tgz", - "integrity": "sha512-63/4nIHrl9pbutUWs6SirWxmyykjvR9BWvu7bvczO1hAkWOyDQPcU18JXWy8q38CyMzPxCeedUfP3BQsZs3UgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/core": "2.0.0-rc.26", - "@vuepress/shared": "2.0.0-rc.26", - "@vuepress/utils": "2.0.0-rc.26", - "cac": "^6.7.14", - "chokidar": "^4.0.3", - "envinfo": "^7.18.0", - "esbuild": "^0.25.10" - }, - "bin": { - "vuepress-cli": "bin/vuepress.js" - } - }, - "node_modules/@vuepress/client": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-rc.26.tgz", - "integrity": "sha512-+irF1HOTD6sAHdcTjp3yRcfuGlJYAW+YvDhq+7n3TPXeMH/wJbmGmAs2oRIDkx6Nlt3XkMMpFo7e9pOU22ut1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^8.0.2", - "@vue/devtools-kit": "^8.0.2", - "@vuepress/shared": "2.0.0-rc.26", - "vue": "^3.5.22", - "vue-router": "^4.6.0" - } - }, - "node_modules/@vuepress/client/node_modules/@vue/devtools-api": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.5.tgz", - "integrity": "sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^8.0.5" - } - }, - "node_modules/@vuepress/core": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-rc.26.tgz", - "integrity": "sha512-Wyiv9oRvdT0lAPGU0Pj1HetjKicbX8/gqbBVYv2MmL7Y4a3r0tyQ92IdZ8LHiAgPvzctntQr/JXIELedvU1t/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/client": "2.0.0-rc.26", - "@vuepress/markdown": "2.0.0-rc.26", - "@vuepress/shared": "2.0.0-rc.26", - "@vuepress/utils": "2.0.0-rc.26", - "vue": "^3.5.22" - } - }, - "node_modules/@vuepress/helper": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/helper/-/helper-2.0.0-rc.118.tgz", - "integrity": "sha512-g+v+KQBfalhYbAAmb6ivFwBgyoi6tQkyKwMQNEPEbaUnCeZl+tAEr7RvTNLX2ZCcKSZeSp3PKciYEtFseDzN2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "^3.5.22", - "@vueuse/core": "^14.0.0", - "cheerio": "^1.1.2", - "fflate": "^0.8.2", - "gray-matter": "^4.0.3", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/highlighter-helper": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/highlighter-helper/-/highlighter-helper-2.0.0-rc.118.tgz", - "integrity": "sha512-9LH7QrMPKzFB+XIWEwd8CY6CaPOTG6FE7RJ4Uj7iSNsjvUFCoMrxspvVpURoh/e12tRuSu3HGx3j02W8Vip/9g==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@vueuse/core": "^14.0.0", - "vuepress": "2.0.0-rc.26" - }, - "peerDependenciesMeta": { - "@vueuse/core": { - "optional": true - } - } - }, - "node_modules/@vuepress/markdown": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-rc.26.tgz", - "integrity": "sha512-ZAXkRxqPDjxqcG4j4vN2ZL5gmuRmgGH7n0s/7pcWIGFH3BJodp/PXMYCklnne1VwARIim9rqE3FKPB/ifJX0yA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit-vue/plugin-component": "^3.0.2", - "@mdit-vue/plugin-frontmatter": "^3.0.2", - "@mdit-vue/plugin-headers": "^3.0.2", - "@mdit-vue/plugin-sfc": "^3.0.2", - "@mdit-vue/plugin-title": "^3.0.2", - "@mdit-vue/plugin-toc": "^3.0.2", - "@mdit-vue/shared": "^3.0.2", - "@mdit-vue/types": "^3.0.2", - "@types/markdown-it": "^14.1.2", - "@types/markdown-it-emoji": "^3.0.1", - "@vuepress/shared": "2.0.0-rc.26", - "@vuepress/utils": "2.0.0-rc.26", - "markdown-it": "^14.1.0", - "markdown-it-anchor": "^9.2.0", - "markdown-it-emoji": "^3.0.0", - "mdurl": "^2.0.0" - } - }, - "node_modules/@vuepress/plugin-active-header-links": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-rc.118.tgz", - "integrity": "sha512-MtIUyzJnYR3iZFKqzax3/t+EuOQubIn3BbVYb5DZB8N0Hys+/LihzwSBF5AnVmecsLHOQ/b0V8blk/EOc5u/Kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vueuse/core": "^14.0.0", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-back-to-top": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-rc.118.tgz", - "integrity": "sha512-zQF6wgO4PbUEWnEytG8HZOWHQ1VLwGdqVRrV0Tq9Mw2RRd8BaxUX6dOgkGw/Th1bUBoVFEvjyadhaA12lG/GrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "@vueuse/core": "^14.0.0", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-copy-code": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-copy-code/-/plugin-copy-code-2.0.0-rc.118.tgz", - "integrity": "sha512-3NWcXF/2n3+3wpH60MkTCLPNjMzAhx03OFqIOHB8broJXPPBESrYWy0oJWtf2erwBtKzU8a28H2RxnXZNiO83Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "@vueuse/core": "^14.0.0", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-git": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-rc.118.tgz", - "integrity": "sha512-dOk4oW6O+Thmu9/+nJ5wuEtoBloKzXsGWJOm1An0lfiggR+Hmxqs06y7/kHyLU0KcM5qzgr4ycgH9Z3Dyq7JAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "@vueuse/core": "^14.0.0", - "rehype-parse": "^9.0.1", - "rehype-sanitize": "^6.0.0", - "rehype-stringify": "^10.0.1", - "unified": "^11.0.5", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-links-check": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-links-check/-/plugin-links-check-2.0.0-rc.118.tgz", - "integrity": "sha512-A+U4QwklXloSChi6AvfTp+ZVdLBjHY34q4vnnbfm733Mi/mzbqCJsD0AM/3Yng3mBTboaZe84beiyk0ckH0pNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-markdown-hint": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-hint/-/plugin-markdown-hint-2.0.0-rc.118.tgz", - "integrity": "sha512-wuhiQ3kJTK7SKOkwcjb1+VT1npxtdWL6+Lwn9frXlliGm1gTjGsaVeezSjzVeVOI5ZaUB4lEEr8Dkw7iwN4gxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit/plugin-alert": "^0.22.3", - "@mdit/plugin-container": "^0.22.2", - "@types/markdown-it": "^14.1.2", - "@vuepress/helper": "2.0.0-rc.118", - "@vueuse/core": "^14.0.0" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-markdown-tab": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-tab/-/plugin-markdown-tab-2.0.0-rc.118.tgz", - "integrity": "sha512-1KXxxE2O8jsNDVx0UIApD8a6uVZCY9m9JP0fuBb5Kf5EyS32BSli2feuZODuZtc81Q2KMePlLAElZpbdG0SKLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit/plugin-tab": "^0.22.3", - "@types/markdown-it": "^14.1.2", - "@vuepress/helper": "2.0.0-rc.118", - "@vueuse/core": "^14.0.0", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-medium-zoom": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-rc.118.tgz", - "integrity": "sha512-85esnzzVYmp5hXEChI8BqbcD1jc2Tj9XfVdtD3+U77BFouisIoy3zDzMAFO5G38v5aykn6m1XTZrv0MBll0FgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "medium-zoom": "^1.1.0", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-nprogress": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-rc.118.tgz", - "integrity": "sha512-f9vB4OARxm32VqGEDLF48Dui5O/uxOfUqaK0mJiYUVwRdNNJNNsKI4qWw+Fnk0KPHNBnCp/jnwhq0rQlzYUn4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-palette": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-palette/-/plugin-palette-2.0.0-rc.118.tgz", - "integrity": "sha512-Zf5u0KZE9/TnGPaP2YP7UODiaAhpLGRX3shPJM8qvI+pjE0OAiQB6q6XyftSkW6458qGvQ8Dc5fTt5dJSnY9Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "chokidar": "^4.0.3" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-prismjs": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-rc.118.tgz", - "integrity": "sha512-9SIg4I13B3a0zXBt3MIKdCEHb0TtNzAaBXGayxh4dq/HRTtKcV2JyIseUWoC/+lpmqD+vjiIWmP5xLs08ya8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "@vuepress/highlighter-helper": "2.0.0-rc.118", - "prismjs": "^1.30.0" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-seo": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-seo/-/plugin-seo-2.0.0-rc.118.tgz", - "integrity": "sha512-z7ztlqK6vqwZyjGumBQbQ0QnaDR0XrCIdL4xN/xSE2xN3K8ua6fk0r8Chk1vDA/RhfZ89T2UFlCjaVN0CT+66w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-sitemap": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.118.tgz", - "integrity": "sha512-HOFA4U4Mm8UTc4A5+0citi2p9muMk6QnfJLeM2WZAMVkesOYEm0QPO5QkPoD3DCOKRB/wdP4cXwCT04ut133SA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "sitemap": "^8.0.2" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-slimsearch": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-slimsearch/-/plugin-slimsearch-2.0.0-rc.118.tgz", - "integrity": "sha512-9udg9vpub5jx3wk+a2rAH9UwYRbqlq8wH2DajB04fsqTHtMPFqcgw6O981xnEMtOx16Qel5d0DS+qOv6bW803g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "@vueuse/core": "^14.0.0", - "cheerio": "^1.1.2", - "chokidar": "^4.0.3", - "slimsearch": "^2.2.2", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-theme-data": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-rc.118.tgz", - "integrity": "sha512-1gUqg4p5yl0BqAxbdt0G7OHIqGggrk/ewG/vro+GP95OsTp6ZCs9Gt0hkPU0oqHfxZVp9XUHUz4g8N1lhqI46w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^8.0.3", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/plugin-theme-data/node_modules/@vue/devtools-api": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.5.tgz", - "integrity": "sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^8.0.5" - } - }, - "node_modules/@vuepress/plugin-umami-analytics": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-umami-analytics/-/plugin-umami-analytics-2.0.0-rc.118.tgz", - "integrity": "sha512-7qfsrT1pDc6e32hyrlACYYZNiIO/vYaYKNUYJ42SsiqX1jYfV4yNp5FPbc4cYMEMWZc8LJLwQUipsqO3F8rTSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "vue": "^3.5.22" - }, - "peerDependencies": { - "vuepress": "2.0.0-rc.26" - } - }, - "node_modules/@vuepress/shared": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-rc.26.tgz", - "integrity": "sha512-Zl9XNG/fYenZqzuYYGOfHzjmp1HCOj68gcJnJABOX1db0H35dkPSPsxuMjbTljClUqMlfj70CLeip/h04upGVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdit-vue/types": "^3.0.2" - } - }, - "node_modules/@vuepress/theme-default": { - "version": "2.0.0-rc.118", - "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-2.0.0-rc.118.tgz", - "integrity": "sha512-J2hDsU2RslDxsaQDKIdX5morSOCd21cOKpdlXTy9mwJ5cLbE658mvzAxVEPwOLgWFjZML3cuPQpljYBsWp+brg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/helper": "2.0.0-rc.118", - "@vuepress/plugin-active-header-links": "2.0.0-rc.118", - "@vuepress/plugin-back-to-top": "2.0.0-rc.118", - "@vuepress/plugin-copy-code": "2.0.0-rc.118", - "@vuepress/plugin-git": "2.0.0-rc.118", - "@vuepress/plugin-links-check": "2.0.0-rc.118", - "@vuepress/plugin-markdown-hint": "2.0.0-rc.118", - "@vuepress/plugin-markdown-tab": "2.0.0-rc.118", - "@vuepress/plugin-medium-zoom": "2.0.0-rc.118", - "@vuepress/plugin-nprogress": "2.0.0-rc.118", - "@vuepress/plugin-palette": "2.0.0-rc.118", - "@vuepress/plugin-prismjs": "2.0.0-rc.118", - "@vuepress/plugin-seo": "2.0.0-rc.118", - "@vuepress/plugin-sitemap": "2.0.0-rc.118", - "@vuepress/plugin-theme-data": "2.0.0-rc.118", - "@vueuse/core": "^14.0.0", - "vue": "^3.5.22" - }, - "peerDependencies": { - "sass": "^1.93.2", - "sass-embedded": "^1.93.2", - "sass-loader": "^16.0.6", - "vuepress": "2.0.0-rc.26" - }, - "peerDependenciesMeta": { - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "sass-loader": { - "optional": true - } - } - }, - "node_modules/@vuepress/utils": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-rc.26.tgz", - "integrity": "sha512-RWzZrGQ0WLSWdELuxg7c6q1D9I22T5PfK/qNFkOsv9eD3gpUsU4jq4zAoumS8o+NRIWHovCJ9WnAhHD0Ns5zAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/debug": "^4.1.12", - "@types/fs-extra": "^11.0.4", - "@types/hash-sum": "^1.0.2", - "@types/picomatch": "^4.0.2", - "@vuepress/shared": "2.0.0-rc.26", - "debug": "^4.4.3", - "fs-extra": "^11.3.2", - "hash-sum": "^2.0.0", - "ora": "^9.0.0", - "picocolors": "^1.1.1", - "picomatch": "^4.0.3", - "tinyglobby": "^0.2.15", - "upath": "^2.0.1" - } - }, - "node_modules/@vueuse/core": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.0.0.tgz", - "integrity": "sha512-d6tKRWkZE8IQElX2aHBxXOMD478fHIYV+Dzm2y9Ag122ICBpNKtGICiXKOhWU3L1kKdttDD9dCMS4bGP3jhCTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.0.0", - "@vueuse/shared": "14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/@vueuse/metadata": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.0.0.tgz", - "integrity": "sha512-6yoGqbJcMldVCevkFiHDBTB1V5Hq+G/haPlGIuaFZHpXC0HADB0EN1ryQAAceiW+ryS3niUwvdFbGiqHqBrfVA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.0.0.tgz", - "integrity": "sha512-mTCA0uczBgurRlwVaQHfG0Ja7UdGe4g9mwffiJmvLiTtp1G4AQyIjej6si/k8c8pUwTfVpNufck+23gXptPAkw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", - "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/birpc": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.8.0.tgz", - "integrity": "sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001756", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz", - "integrity": "sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.0.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.12.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.3.0.tgz", - "integrity": "sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "license": "MIT", - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.256", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.256.tgz", - "integrity": "sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/envinfo": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.20.0.tgz", - "integrity": "sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "license": "MIT", - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true, - "license": "MIT" - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true, - "license": "MIT" - }, - "node_modules/hast-util-from-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-sanitize": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", - "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "unist-util-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "license": "MIT", - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.6.tgz", - "integrity": "sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/less": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.4.2.tgz", - "integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", - "license": "Apache-2.0", - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/log-symbols": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", - "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-unicode-supported": "^2.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "license": "MIT", - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/markdown-it": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", - "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdown-it-anchor": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz", - "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==", - "dev": true, - "license": "Unlicense", - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, - "node_modules/markdown-it-emoji": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", - "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==", - "dev": true, - "license": "MIT" - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/medium-zoom": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", - "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nord": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/nord/-/nord-0.2.1.tgz", - "integrity": "sha512-/AD7JGJbcp1pB5XwYkJyivqdeXofUP5u2lkif6vLGLc+SsV9OCC0JFNpVwM5pqHuFqbyojRt6xILuidJOwwJDQ==", - "license": "(Apache-2.0 AND CC-BY-SA-4.0)" - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", - "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.6.2", - "cli-cursor": "^5.0.0", - "cli-spinners": "^3.2.0", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.1.0", - "log-symbols": "^7.0.1", - "stdin-discarder": "^0.2.2", - "string-width": "^8.1.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/perfect-debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", - "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "license": "MIT", - "optional": true - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rehype-parse": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-sanitize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", - "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-sanitize": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-stringify": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", - "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.0.tgz", - "integrity": "sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.0", - "@rollup/rollup-android-arm64": "4.62.0", - "@rollup/rollup-darwin-arm64": "4.62.0", - "@rollup/rollup-darwin-x64": "4.62.0", - "@rollup/rollup-freebsd-arm64": "4.62.0", - "@rollup/rollup-freebsd-x64": "4.62.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.0", - "@rollup/rollup-linux-arm-musleabihf": "4.62.0", - "@rollup/rollup-linux-arm64-gnu": "4.62.0", - "@rollup/rollup-linux-arm64-musl": "4.62.0", - "@rollup/rollup-linux-loong64-gnu": "4.62.0", - "@rollup/rollup-linux-loong64-musl": "4.62.0", - "@rollup/rollup-linux-ppc64-gnu": "4.62.0", - "@rollup/rollup-linux-ppc64-musl": "4.62.0", - "@rollup/rollup-linux-riscv64-gnu": "4.62.0", - "@rollup/rollup-linux-riscv64-musl": "4.62.0", - "@rollup/rollup-linux-s390x-gnu": "4.62.0", - "@rollup/rollup-linux-x64-gnu": "4.62.0", - "@rollup/rollup-linux-x64-musl": "4.62.0", - "@rollup/rollup-openbsd-x64": "4.62.0", - "@rollup/rollup-openharmony-arm64": "4.62.0", - "@rollup/rollup-win32-arm64-msvc": "4.62.0", - "@rollup/rollup-win32-ia32-msvc": "4.62.0", - "@rollup/rollup-win32-x64-gnu": "4.62.0", - "@rollup/rollup-win32-x64-msvc": "4.62.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", - "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.97.3.tgz", - "integrity": "sha512-eKzFy13Nk+IRHhlAwP3sfuv+PzOrvzUkwJK2hdoCKYcWGSdmwFpeGpWmyewdw8EgBnsKaSBtgf/0b2K635ecSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.5.0", - "immutable": "^5.0.2", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.97.3", - "sass-embedded-android-arm": "1.97.3", - "sass-embedded-android-arm64": "1.97.3", - "sass-embedded-android-riscv64": "1.97.3", - "sass-embedded-android-x64": "1.97.3", - "sass-embedded-darwin-arm64": "1.97.3", - "sass-embedded-darwin-x64": "1.97.3", - "sass-embedded-linux-arm": "1.97.3", - "sass-embedded-linux-arm64": "1.97.3", - "sass-embedded-linux-musl-arm": "1.97.3", - "sass-embedded-linux-musl-arm64": "1.97.3", - "sass-embedded-linux-musl-riscv64": "1.97.3", - "sass-embedded-linux-musl-x64": "1.97.3", - "sass-embedded-linux-riscv64": "1.97.3", - "sass-embedded-linux-x64": "1.97.3", - "sass-embedded-unknown-all": "1.97.3", - "sass-embedded-win32-arm64": "1.97.3", - "sass-embedded-win32-x64": "1.97.3" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.97.3.tgz", - "integrity": "sha512-t6N46NlPuXiY3rlmG6/+1nwebOBOaLFOOVqNQOC2cJhghOD4hh2kHNQQTorCsbY9S1Kir2la1/XLBwOJfui0xg==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.97.3" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.97.3.tgz", - "integrity": "sha512-cRTtf/KV/q0nzGZoUzVkeIVVFv3L/tS1w4WnlHapphsjTXF/duTxI8JOU1c/9GhRPiMdfeXH7vYNcMmtjwX7jg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.97.3.tgz", - "integrity": "sha512-aiZ6iqiHsUsaDx0EFbbmmA0QgxicSxVVN3lnJJ0f1RStY0DthUkquGT5RJ4TPdaZ6ebeJWkboV4bra+CP766eA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.97.3.tgz", - "integrity": "sha512-zVEDgl9JJodofGHobaM/q6pNETG69uuBIGQHRo789jloESxxZe82lI3AWJQuPmYCOG5ElfRthqgv89h3gTeLYA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.97.3.tgz", - "integrity": "sha512-3ke0le7ZKepyXn/dKKspYkpBC0zUk/BMciyP5ajQUDy4qJwobd8zXdAq6kOkdiMB+d9UFJOmEkvgFJHl3lqwcw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.97.3.tgz", - "integrity": "sha512-fuqMTqO4gbOmA/kC5b9y9xxNYw6zDEyfOtMgabS7Mz93wimSk2M1quQaTJnL98Mkcsl2j+7shNHxIS/qpcIDDA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.97.3.tgz", - "integrity": "sha512-b/2RBs/2bZpP8lMkyZ0Px0vkVkT8uBd0YXpOwK7iOwYkAT8SsO4+WdVwErsqC65vI5e1e5p1bb20tuwsoQBMVA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.97.3.tgz", - "integrity": "sha512-2lPQ7HQQg4CKsH18FTsj2hbw5GJa6sBQgDsls+cV7buXlHjqF8iTKhAQViT6nrpLK/e8nFCoaRgSqEC8xMnXuA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.97.3.tgz", - "integrity": "sha512-IP1+2otCT3DuV46ooxPaOKV1oL5rLjteRzf8ldZtfIEcwhSgSsHgA71CbjYgLEwMY9h4jeal8Jfv3QnedPvSjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.97.3.tgz", - "integrity": "sha512-cBTMU68X2opBpoYsSZnI321gnoaiMBEtc+60CKCclN6PCL3W3uXm8g4TLoil1hDD6mqU9YYNlVG6sJ+ZNef6Lg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.97.3.tgz", - "integrity": "sha512-Lij0SdZCsr+mNRSyDZ7XtJpXEITrYsaGbOTz5e6uFLJ9bmzUbV7M8BXz2/cA7bhfpRPT7/lwRKPdV4+aR9Ozcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.97.3.tgz", - "integrity": "sha512-sBeLFIzMGshR4WmHAD4oIM7WJVkSoCIEwutzptFtGlSlwfNiijULp+J5hA2KteGvI6Gji35apR5aWj66wEn/iA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.97.3.tgz", - "integrity": "sha512-/oWJ+OVrDg7ADDQxRLC/4g1+Nsz1g4mkYS2t6XmyMJKFTFK50FVI2t5sOdFH+zmMp+nXHKM036W94y9m4jjEcw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.97.3.tgz", - "integrity": "sha512-l3IfySApLVYdNx0Kjm7Zehte1CDPZVcldma3dZt+TfzvlAEerM6YDgsk5XEj3L8eHBCgHgF4A0MJspHEo2WNfA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.97.3.tgz", - "integrity": "sha512-Kwqwc/jSSlcpRjULAOVbndqEy2GBzo6OBmmuBVINWUaJLJ8Kczz3vIsDUWLfWz/kTEw9FHBSiL0WCtYLVAXSLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.97.3.tgz", - "integrity": "sha512-/GHajyYJmvb0IABUQHbVHf1nuHPtIDo/ClMZ81IDr59wT5CNcMe7/dMNujXwWugtQVGI5UGmqXWZQCeoGnct8Q==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.97.3" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.97.3.tgz", - "integrity": "sha512-RDGtRS1GVvQfMGAmVXNxYiUOvPzn9oO1zYB/XUM9fudDRnieYTcUytpNTQZLs6Y1KfJxgt5Y+giRceC92fT8Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.97.3.tgz", - "integrity": "sha512-SFRa2lED9UEwV6vIGeBXeBOLKF+rowF3WmNfb/BzhxmdAsKofCXrJ8ePW7OcDVrvNEbTOGwhsReIsF5sH8fVaw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", - "devOptional": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sitemap": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.2.tgz", - "integrity": "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.4.1" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "dev": true, - "license": "MIT" - }, - "node_modules/slimsearch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/slimsearch/-/slimsearch-2.2.2.tgz", - "integrity": "sha512-C+E3y4sKKzPzcOyty0G9CjXdLvY0ZWPSCQCDNqSv/P6+rvoL6RiHvuwr0wnxf0QgdbdyNiJQ0w7OdudHoabpCg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/superjson": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.5.tgz", - "integrity": "sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/superjson/node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/superjson/node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", - "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.24.tgz", - "integrity": "sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.24", - "@vue/compiler-sfc": "3.5.24", - "@vue/runtime-dom": "3.5.24", - "@vue/server-renderer": "3.5.24", - "@vue/shared": "3.5.24" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-router": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.3.tgz", - "integrity": "sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/vuepress": { - "version": "2.0.0-rc.26", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-rc.26.tgz", - "integrity": "sha512-ztTS3m6Q2MAb6D26vM2UyU5nOuxIhIk37SSD3jTcKI00x4ha0FcwY3Cm0MAt6w58REBmkwNLPxN5iiulatHtbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vuepress/cli": "2.0.0-rc.26", - "@vuepress/client": "2.0.0-rc.26", - "@vuepress/core": "2.0.0-rc.26", - "@vuepress/markdown": "2.0.0-rc.26", - "@vuepress/shared": "2.0.0-rc.26", - "@vuepress/utils": "2.0.0-rc.26", - "vue": "^3.5.22" - }, - "bin": { - "vuepress": "bin/vuepress.js", - "vuepress-vite": "bin/vuepress-vite.js", - "vuepress-webpack": "bin/vuepress-webpack.js" - }, - "engines": { - "node": "^20.9.0 || >=22.0.0" - }, - "peerDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.26", - "@vuepress/bundler-webpack": "2.0.0-rc.26", - "vue": "^3.5.22" - }, - "peerDependenciesMeta": { - "@vuepress/bundler-vite": { - "optional": true - }, - "@vuepress/bundler-webpack": { - "optional": true - } - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json index c5de2f6..664928e 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,17 @@ { "name": "config.phundrak.com", - "version": "1.0.0", + "version": "2.0.0", "description": "", "main": "index.js", - "repository": { - "type": "git", - "url": "https://labs.phundrak.com/phundrak/conlang.phundrak.com" - }, + "repository": "https://labs.phundrak.com/phundrak/config.phundrak.com", "author": "Lucien Cartier-Tilet ", "license": "AGPL-3.0", "private": true, "devDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.26", - "@vuepress/plugin-slimsearch": "^2.0.0-rc.118", - "@vuepress/plugin-umami-analytics": "2.0.0-rc.118", - "@vuepress/theme-default": "2.0.0-rc.118", - "baseline-browser-mapping": "^2.10.0", - "sass-embedded": "^1.97.3", - "vuepress": "2.0.0-rc.26" - }, - "dependencies": { - "less": "^4.4.2", - "nord": "^0.2.1" + "vitepress": "^2.0.0-alpha.18" }, "scripts": { - "dev": "vuepress dev docs", - "build": "vuepress build docs" + "dev": "vitepress dev", + "build": "vitepress build" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..263a003 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1252 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + vitepress: + specifier: ^2.0.0-alpha.18 + version: 2.0.0-alpha.18(postcss@8.5.19) + +packages: + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@docsearch/css@4.6.3': + resolution: {integrity: sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==} + + '@docsearch/js@4.6.3': + resolution: {integrity: sha512-qUIX2b4Apew3tv4F0qhmgShsl/Lfw4m6mqv/5/5dWNxwTcDdLMp2s3YwZ+NMGh3IKCg0pBaXm7Q5VdyU5Rj+cQ==} + + '@docsearch/sidepanel-js@4.6.3': + resolution: {integrity: sha512-grGSmvXzG0if+mrzdIKykvpIAuEQ9u0sEJ2eLRRCaQfJvsWqh2C2/aY04bIzWvDh7myi5rvl8D+tUNsVrjYQ3A==} + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@iconify-json/simple-icons@1.2.90': + resolution: {integrity: sha512-zt2o2ZvQpHVvZJARIkZ51RnaHY2oqcPJMvHE+mVnxkSr+c33fnX4gciiXu+wyX5ei+s0qbVX1wD0DWBbaGBYMA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@shikijs/core@4.3.1': + resolution: {integrity: sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.3.1': + resolution: {integrity: sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.3.1': + resolution: {integrity: sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.3.1': + resolution: {integrity: sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.3.1': + resolution: {integrity: sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==} + engines: {node: '>=20'} + + '@shikijs/themes@4.3.1': + resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} + engines: {node: '>=20'} + + '@shikijs/transformers@4.3.1': + resolution: {integrity: sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A==} + engines: {node: '>=20'} + + '@shikijs/types@4.3.1': + resolution: {integrity: sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + + '@vitejs/plugin-vue@6.0.8': + resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.40': + resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==} + + '@vue/compiler-dom@3.5.40': + resolution: {integrity: sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==} + + '@vue/compiler-sfc@3.5.40': + resolution: {integrity: sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==} + + '@vue/compiler-ssr@3.5.40': + resolution: {integrity: sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==} + + '@vue/devtools-api@8.1.5': + resolution: {integrity: sha512-YJipMVAKe5wT5CWf5kTYCaNV7NMNjFVxJkIkJaJ4W/nCxEBzlZzrOsYKeCymdCrFZmBS/+wTWFoUs3Jf/Q6XSQ==} + + '@vue/devtools-kit@8.1.5': + resolution: {integrity: sha512-FcSAxsi4eWuXLCB7Rv9lj0aIVHHPNVQ2BazGf4RJTc2JCqb4BQg0hk87ZFhminCfl+mD5OUI0rX2cgyu4kJOGA==} + + '@vue/devtools-shared@8.1.5': + resolution: {integrity: sha512-mhT4zcPFhF+Xk1O4BfhhrbXzpmfqY03fS6xGpcllbQG7lDjhQf8pQHcTIhqQIYx1hfwtHmk/6jM96ele0UxPqQ==} + + '@vue/reactivity@3.5.40': + resolution: {integrity: sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==} + + '@vue/runtime-core@3.5.40': + resolution: {integrity: sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==} + + '@vue/runtime-dom@3.5.40': + resolution: {integrity: sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==} + + '@vue/server-renderer@3.5.40': + resolution: {integrity: sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==} + + '@vue/shared@3.5.40': + resolution: {integrity: sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==} + + '@vueuse/core@14.3.0': + resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@14.3.0': + resolution: {integrity: sha512-76I5FT2ESvCmCaSwapI+a/u/CFtNXmzl9f9lNp1hRtx8vKB8hfiokJr8IvQqcQG5ckGXElyXK516b54ozV3MvA==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 || ^8 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@14.3.0': + resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} + + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + focus-trap@8.2.2: + resolution: {integrity: sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + postcss@8.5.19: + resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} + engines: {node: ^10 || ^12 || >=14} + + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + shiki@4.3.1: + resolution: {integrity: sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==} + engines: {node: '>=20'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@8.1.5: + resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitepress@2.0.0-alpha.18: + resolution: {integrity: sha512-Lk1G2/QqSf+MwNLICl9fmzWOtoCEwjZoWgaQy41QvWTfcGpLE9XwJDbcCyES/9rj6R2g1zFqFvLVkYKLLDALFw==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + vue@3.5.40: + resolution: {integrity: sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@docsearch/css@4.6.3': {} + + '@docsearch/js@4.6.3': {} + + '@docsearch/sidepanel-js@4.6.3': {} + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@iconify-json/simple-icons@1.2.90': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@oxc-project/types@0.139.0': {} + + '@rolldown/binding-android-arm64@1.1.5': + optional: true + + '@rolldown/binding-darwin-arm64@1.1.5': + optional: true + + '@rolldown/binding-darwin-x64@1.1.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.1.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.1.5': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.1.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.1.5': + optional: true + + '@rolldown/binding-wasm32-wasi@1.1.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.1.5': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@shikijs/core@4.3.1': + dependencies: + '@shikijs/primitive': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/primitive@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/themes@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/transformers@4.3.1': + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/types': 4.3.1 + + '@shikijs/types@4.3.1': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@ungap/structured-clone@1.3.3': {} + + '@vitejs/plugin-vue@6.0.8(vite@8.1.5)(vue@3.5.40)': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.1.5 + vue: 3.5.40 + + '@vue/compiler-core@3.5.40': + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.40 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.40': + dependencies: + '@vue/compiler-core': 3.5.40 + '@vue/shared': 3.5.40 + + '@vue/compiler-sfc@3.5.40': + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.40 + '@vue/compiler-dom': 3.5.40 + '@vue/compiler-ssr': 3.5.40 + '@vue/shared': 3.5.40 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.19 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.40': + dependencies: + '@vue/compiler-dom': 3.5.40 + '@vue/shared': 3.5.40 + + '@vue/devtools-api@8.1.5': + dependencies: + '@vue/devtools-kit': 8.1.5 + + '@vue/devtools-kit@8.1.5': + dependencies: + '@vue/devtools-shared': 8.1.5 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + + '@vue/devtools-shared@8.1.5': {} + + '@vue/reactivity@3.5.40': + dependencies: + '@vue/shared': 3.5.40 + + '@vue/runtime-core@3.5.40': + dependencies: + '@vue/reactivity': 3.5.40 + '@vue/shared': 3.5.40 + + '@vue/runtime-dom@3.5.40': + dependencies: + '@vue/reactivity': 3.5.40 + '@vue/runtime-core': 3.5.40 + '@vue/shared': 3.5.40 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.40': + dependencies: + '@vue/compiler-ssr': 3.5.40 + '@vue/runtime-dom': 3.5.40 + '@vue/shared': 3.5.40 + + '@vue/shared@3.5.40': {} + + '@vueuse/core@14.3.0(vue@3.5.40)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.40) + vue: 3.5.40 + + '@vueuse/integrations@14.3.0(focus-trap@8.2.2)(vue@3.5.40)': + dependencies: + '@vueuse/core': 14.3.0(vue@3.5.40) + '@vueuse/shared': 14.3.0(vue@3.5.40) + vue: 3.5.40 + optionalDependencies: + focus-trap: 8.2.2 + + '@vueuse/metadata@14.3.0': {} + + '@vueuse/shared@14.3.0(vue@3.5.40)': + dependencies: + vue: 3.5.40 + + birpc@2.9.0: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + comma-separated-tokens@2.0.3: {} + + csstype@3.2.3: {} + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + entities@7.0.1: {} + + estree-walker@2.0.2: {} + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + focus-trap@8.2.2: + dependencies: + tabbable: 6.5.0 + + fsevents@2.3.3: + optional: true + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hookable@5.5.3: {} + + html-void-elements@3.0.0: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mark.js@8.11.1: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.3 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + minisearch@7.2.0: {} + + nanoid@3.3.16: {} + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + perfect-debounce@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + postcss@8.5.19: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + property-information@7.2.0: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rolldown@1.1.5: + dependencies: + '@oxc-project/types': 0.139.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 + + shiki@4.3.1: + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/engine-javascript': 4.3.1 + '@shikijs/engine-oniguruma': 4.3.1 + '@shikijs/langs': 4.3.1 + '@shikijs/themes': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + tabbable@6.5.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + trim-lines@3.0.1: {} + + tslib@2.8.1: + optional: true + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@8.1.5: + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.5 + postcss: 8.5.19 + rolldown: 1.1.5 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + + vitepress@2.0.0-alpha.18(postcss@8.5.19): + dependencies: + '@docsearch/css': 4.6.3 + '@docsearch/js': 4.6.3 + '@docsearch/sidepanel-js': 4.6.3 + '@iconify-json/simple-icons': 1.2.90 + '@shikijs/core': 4.3.1 + '@shikijs/transformers': 4.3.1 + '@shikijs/types': 4.3.1 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 6.0.8(vite@8.1.5)(vue@3.5.40) + '@vue/devtools-api': 8.1.5 + '@vue/shared': 3.5.40 + '@vueuse/core': 14.3.0(vue@3.5.40) + '@vueuse/integrations': 14.3.0(focus-trap@8.2.2)(vue@3.5.40) + focus-trap: 8.2.2 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 4.3.1 + vite: 8.1.5 + vue: 3.5.40 + optionalDependencies: + postcss: 8.5.19 + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - async-validator + - axios + - change-case + - drauu + - esbuild + - fuse.js + - idb-keyval + - jiti + - jwt-decode + - less + - nprogress + - qrcode + - sass + - sass-embedded + - sortablejs + - stylus + - sugarss + - terser + - tsx + - typescript + - universal-cookie + - yaml + + vue@3.5.40: + dependencies: + '@vue/compiler-dom': 3.5.40 + '@vue/compiler-sfc': 3.5.40 + '@vue/runtime-dom': 3.5.40 + '@vue/server-renderer': 3.5.40 + '@vue/shared': 3.5.40 + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..24a72ca --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + '@parcel/watcher': true + esbuild: true diff --git a/wrangler.jsonc b/wrangler.jsonc new file mode 100644 index 0000000..d4012a1 --- /dev/null +++ b/wrangler.jsonc @@ -0,0 +1,7 @@ +// -*- mode: json-ts; -*- +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "config-phundrak-com", + "pages_build_output_dir": ".vitepress/dist/", + "compatibility_date": "2026-07-11" +}