diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml
new file mode 100644
index 000000000..11c81b436
--- /dev/null
+++ b/.github/workflows/release-tag.yml
@@ -0,0 +1,383 @@
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: "Version to deploy (format: vX.Y.Z)"
+ required: true
+ upload:
+ description: "Upload final artifacts to R2"
+ default: false
+ push:
+ tags:
+ - "v[0-9]+.[0-9]+.[0-9]+"
+
+name: Release Tag
+
+# We must only run one release workflow at a time to prevent corrupting
+# our release artifacts.
+concurrency:
+ group: ${{ github.workflow }}
+ cancel-in-progress: false
+
+jobs:
+ setup:
+ runs-on: namespace-profile-ghostty-sm
+ outputs:
+ version: ${{ steps.extract_version.outputs.version }}
+ build: ${{ steps.extract_build_info.outputs.build }}
+ commit: ${{ steps.extract_build_info.outputs.commit }}
+ commit_long: ${{ steps.extract_build_info.outputs.commit_long }}
+ steps:
+ - name: Validate Version Input
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ if [[ ! "${{ github.event.inputs.version }}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+ echo "Error: Version must follow the format vX.Y.Z (e.g., v1.0.0)."
+ exit 1
+ fi
+
+ echo "Version is valid: ${{ github.event.inputs.version }}"
+
+ - name: Exract the Version
+ id: extract_version
+ run: |
+ if [[ "${{ github.event_name }}" == "push" ]]; then
+ # Remove the leading 'v' from the tag
+ VERSION=${GITHUB_REF#refs/tags/v}
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
+ elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
+ VERSION=${{ github.event.inputs.version }}
+ VERSION=${VERSION#v}
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
+ else
+ echo "Error: Unsupported event type."
+ exit 1
+ fi
+
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ # Important so that build number generation works
+ fetch-depth: 0
+
+ - name: Extract build info
+ id: extract_build_info
+ run: |
+ GHOSTTY_BUILD=$(git rev-list --count HEAD)
+ GHOSTTY_COMMIT=$(git rev-parse --short HEAD)
+ GHOSTTY_COMMIT_LONG=$(git rev-parse HEAD)
+ echo "build=$GHOSTTY_BUILD" >> $GITHUB_OUTPUT
+ echo "commit=$GHOSTTY_COMMIT" >> $GITHUB_OUTPUT
+ echo "commit_long=$GHOSTTY_COMMIT_LONG" >> $GITHUB_OUTPUT
+ cat $GITHUB_OUTPUT
+
+ source-tarball:
+ runs-on: namespace-profile-ghostty-md
+ needs: [setup]
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: cachix/install-nix-action@v30
+ with:
+ nix_path: nixpkgs=channel:nixos-unstable
+
+ - uses: cachix/cachix-action@v15
+ with:
+ name: ghostty
+ authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
+
+ - name: Create Tarball
+ run: git archive --format=tgz --prefix=ghostty-source/ -o ghostty-source.tar.gz HEAD
+
+ - name: Sign Tarball
+ run: |
+ echo -n "${{ secrets.MINISIGN_KEY }}" > minisign.key
+ echo -n "${{ secrets.MINISIGN_PASSWORD }}" > minisign.password
+ nix develop -c minisign -S -m ghostty-source.tar.gz -s minisign.key < minisign.password
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: source-tarball
+ path: |-
+ ghostty-source.tar.gz
+ ghostty-source.tar.gz.minisig
+
+ build-macos:
+ needs: [setup]
+ runs-on: namespace-profile-ghostty-macos
+ timeout-minutes: 90
+ env:
+ GHOSTTY_VERSION: ${{ needs.setup.outputs.version }}
+ GHOSTTY_BUILD: ${{ needs.setup.outputs.build }}
+ GHOSTTY_COMMIT: ${{ needs.setup.outputs.commit }}
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - uses: cachix/install-nix-action@v30
+ with:
+ nix_path: nixpkgs=channel:nixos-unstable
+ - uses: cachix/cachix-action@v15
+ with:
+ name: ghostty
+ authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
+
+ - name: XCode Select
+ run: sudo xcode-select -s /Applications/Xcode_16.0.app
+
+ - name: Setup Sparkle
+ env:
+ SPARKLE_VERSION: 2.6.3
+ run: |
+ mkdir -p .action/sparkle
+ cd .action/sparkle
+ curl -L https://github.com/sparkle-project/Sparkle/releases/download/${SPARKLE_VERSION}/Sparkle-for-Swift-Package-Manager.zip > sparkle.zip
+ unzip sparkle.zip
+ echo "$(pwd)/bin" >> $GITHUB_PATH
+
+ # GhosttyKit is the framework that is built from Zig for our native
+ # Mac app to access. Build this in release mode.
+ - name: Build GhosttyKit
+ run: |
+ nix develop -c \
+ zig build \
+ -Doptimize=ReleaseFast \
+ -Dversion-string=${GHOSTTY_VERSION}
+
+ # The native app is built with native XCode tooling. This also does
+ # codesigning. IMPORTANT: this must NOT run in a Nix environment.
+ # Nix breaks xcodebuild so this has to be run outside.
+ - name: Build Ghostty.app
+ run: |
+ cd macos
+ xcodebuild -target Ghostty -configuration Release
+
+ # Add all our metadata to Info.plist so we can reference it later.
+ - name: Update Info.plist
+ env:
+ SPARKLE_KEY_PUB: ${{ secrets.PROD_MACOS_SPARKLE_KEY_PUB }}
+ run: |
+ # Version Info
+ /usr/libexec/PlistBuddy -c "Set :GhosttyCommit $GHOSTTY_COMMIT" "macos/build/Release/Ghostty.app/Contents/Info.plist"
+ /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $GHOSTTY_BUILD" "macos/build/Release/Ghostty.app/Contents/Info.plist"
+ /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $GHOSTTY_VERSION" "macos/build/Release/Ghostty.app/Contents/Info.plist"
+
+ # Updater
+ /usr/libexec/PlistBuddy -c "Set :SUPublicEDKey $SPARKLE_KEY_PUB" "macos/build/Release/Ghostty.app/Contents/Info.plist"
+
+ - name: Codesign app bundle
+ env:
+ MACOS_CERTIFICATE: ${{ secrets.PROD_MACOS_CERTIFICATE }}
+ MACOS_CERTIFICATE_PWD: ${{ secrets.PROD_MACOS_CERTIFICATE_PWD }}
+ MACOS_CERTIFICATE_NAME: ${{ secrets.PROD_MACOS_CERTIFICATE_NAME }}
+ MACOS_CI_KEYCHAIN_PWD: ${{ secrets.PROD_MACOS_CI_KEYCHAIN_PWD }}
+ run: |
+ # Turn our base64-encoded certificate back to a regular .p12 file
+ echo $MACOS_CERTIFICATE | base64 --decode > certificate.p12
+
+ # We need to create a new keychain, otherwise using the certificate will prompt
+ # with a UI dialog asking for the certificate password, which we can't
+ # use in a headless CI environment
+ security create-keychain -p "$MACOS_CI_KEYCHAIN_PWD" build.keychain
+ security default-keychain -s build.keychain
+ security unlock-keychain -p "$MACOS_CI_KEYCHAIN_PWD" build.keychain
+ security import certificate.p12 -k build.keychain -P "$MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign
+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_CI_KEYCHAIN_PWD" build.keychain
+
+ # Codesign Sparkle. Some notes here:
+ # - The XPC services aren't used since we don't sandbox Ghostty,
+ # but since they're part of the build, they still need to be
+ # codesigned.
+ # - The binaries in the "Versions" folders need to NOT be symlinks.
+ /usr/bin/codesign --verbose -f -s "$MACOS_CERTIFICATE_NAME" -o runtime "macos/build/Release/Ghostty.app/Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc"
+ /usr/bin/codesign --verbose -f -s "$MACOS_CERTIFICATE_NAME" -o runtime "macos/build/Release/Ghostty.app/Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Installer.xpc"
+ /usr/bin/codesign --verbose -f -s "$MACOS_CERTIFICATE_NAME" -o runtime "macos/build/Release/Ghostty.app/Contents/Frameworks/Sparkle.framework/Versions/B/Autoupdate"
+ /usr/bin/codesign --verbose -f -s "$MACOS_CERTIFICATE_NAME" -o runtime "macos/build/Release/Ghostty.app/Contents/Frameworks/Sparkle.framework/Versions/B/Updater.app"
+ /usr/bin/codesign --verbose -f -s "$MACOS_CERTIFICATE_NAME" -o runtime "macos/build/Release/Ghostty.app/Contents/Frameworks/Sparkle.framework"
+
+ # Codesign the app bundle
+ /usr/bin/codesign --verbose -f -s "$MACOS_CERTIFICATE_NAME" -o runtime --entitlements "macos/Ghostty.entitlements" macos/build/Release/Ghostty.app
+
+ - name: Create DMG
+ env:
+ MACOS_CERTIFICATE_NAME: ${{ secrets.PROD_MACOS_CERTIFICATE_NAME }}
+ run: |
+ npm install --global create-dmg
+ create-dmg \
+ --identity="$MACOS_CERTIFICATE_NAME" \
+ ./macos/build/Release/Ghostty.app \
+ ./
+ mv ./Ghostty*.dmg ./Ghostty.dmg
+
+ - name: "Notarize DMG"
+ env:
+ PROD_MACOS_NOTARIZATION_APPLE_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }}
+ PROD_MACOS_NOTARIZATION_TEAM_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }}
+ PROD_MACOS_NOTARIZATION_PWD: ${{ secrets.PROD_MACOS_NOTARIZATION_PWD }}
+ run: |
+ # Store the notarization credentials so that we can prevent a UI password dialog
+ # from blocking the CI
+ echo "Create keychain profile"
+ xcrun notarytool store-credentials "notarytool-profile" --apple-id "$PROD_MACOS_NOTARIZATION_APPLE_ID" --team-id "$PROD_MACOS_NOTARIZATION_TEAM_ID" --password "$PROD_MACOS_NOTARIZATION_PWD"
+
+ # Here we send the notarization request to the Apple's Notarization service, waiting for the result.
+ # This typically takes a few seconds inside a CI environment, but it might take more depending on the App
+ # characteristics. Visit the Notarization docs for more information and strategies on how to optimize it if
+ # you're curious
+ echo "Notarize dmg"
+ xcrun notarytool submit "Ghostty.dmg" --keychain-profile "notarytool-profile" --wait
+
+ # Finally, we need to "attach the staple" to our executable, which will allow our app to be
+ # validated by macOS even when an internet connection is not available. We do this to
+ # both the app and the dmg
+ echo "Attach staple"
+ xcrun stapler staple "Ghostty.dmg"
+ xcrun stapler staple "macos/build/Release/Ghostty.app"
+
+ # Zip up the app and symbols
+ - name: Zip App
+ run: |
+ cd macos/build/Release
+ zip -9 -r --symlinks ../../../ghostty-macos-universal.zip Ghostty.app
+ zip -9 -r --symlinks ../../../ghostty-macos-universal-dsym.zip Ghostty.app.dSYM/
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: macos
+ path: |-
+ Ghostty.dmg
+ ghostty-macos-universal.zip
+ ghostty-macos-universal-dsym.zip
+
+ sentry-dsym:
+ runs-on: namespace-profile-ghostty-sm
+ needs: [build-macos]
+ steps:
+ - name: Install sentry-cli
+ run: |
+ curl -sL https://sentry.io/get-cli/ | bash
+
+ - name: Download macOS Artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: macos
+
+ - name: Upload dSYM to Sentry
+ env:
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
+ run: |
+ sentry-cli dif upload --project ghostty --wait ghostty-macos-universal-dsym.zip
+
+ appcast:
+ needs: [setup, build-macos]
+ runs-on: namespace-profile-ghostty-macos
+ env:
+ GHOSTTY_VERSION: ${{ needs.setup.outputs.version }}
+ GHOSTTY_BUILD: ${{ needs.setup.outputs.build }}
+ GHOSTTY_COMMIT: ${{ needs.setup.outputs.commit }}
+ GHOSTTY_COMMIT_LONG: ${{ needs.setup.outputs.commit_long }}
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Download macOS Artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: macos
+
+ - name: Setup Sparkle
+ env:
+ SPARKLE_VERSION: 2.6.3
+ run: |
+ mkdir -p .action/sparkle
+ cd .action/sparkle
+ curl -L https://github.com/sparkle-project/Sparkle/releases/download/${SPARKLE_VERSION}/Sparkle-for-Swift-Package-Manager.zip > sparkle.zip
+ unzip sparkle.zip
+ echo "$(pwd)/bin" >> $GITHUB_PATH
+
+ - name: Generate Appcast
+ env:
+ SPARKLE_KEY: ${{ secrets.PROD_MACOS_SPARKLE_KEY }}
+ run: |
+ echo "GHOSTTY_VERSION=$GHOSTTY_VERSION"
+ echo "GHOSTTY_BUILD=$GHOSTTY_BUILD"
+ echo "GHOSTTY_COMMIT=$GHOSTTY_COMMIT"
+ echo "GHOSTTY_COMMIT_LONG=$GHOSTTY_COMMIT_LONG"
+
+ echo $SPARKLE_KEY > signing.key
+ sign_update -f signing.key Ghostty.dmg > sign_update.txt
+ curl -L https://release.files.ghostty.org/appcast.xml > appcast.xml
+ python3 ./dist/macos/update_appcast_tag.py
+ test -f appcast_new.xml
+ mv appcast_new.xml appcast.xml
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: sparkle
+ path: |-
+ appcast.xml
+
+ upload:
+ if: |-
+ (github.event_name == 'workflow_dispatch' &&
+ github.event.inputs.upload == 'true') ||
+ github.event_name == 'push'
+ needs: [setup, source-tarball, build-macos, appcast]
+ runs-on: namespace-profile-ghostty-sm
+ env:
+ GHOSTTY_VERSION: ${{ needs.setup.outputs.version }}
+ steps:
+ - name: Download macOS Artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: macos
+
+ - name: Download Sparkle Artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: sparkle
+
+ - name: Download Source Tarball Artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: source-tarball
+
+ # Upload all of our files EXCEPT the appcast. The appcast triggers
+ # updates in clients and we don't want to do that until we're
+ # sure these are uploaded.
+ - name: Prep Files
+ run: |
+ mkdir blob
+ mkdir -p blob/${GHOSTTY_VERSION}
+ mv ghostty-source.tar.gz blob/${GHOSTTY_VERSION}/ghostty-source.tar.gz
+ mv ghostty-source.tar.gz.minisig blob/${GHOSTTY_VERSION}/ghostty-source.tar.gz.minisig
+ mv ghostty-macos-universal.zip blob/${GHOSTTY_VERSION}/ghostty-macos-universal.zip
+ mv ghostty-macos-universal-dsym.zip blob/${GHOSTTY_VERSION}/ghostty-macos-universal-dsym.zip
+ mv Ghostty.dmg blob/${GHOSTTY_VERSION}/Ghostty.dmg
+ - name: Upload to R2
+ uses: ryand56/r2-upload-action@latest
+ with:
+ r2-account-id: ${{ secrets.CF_R2_RELEASE_ACCOUNT_ID }}
+ r2-access-key-id: ${{ secrets.CF_R2_RELEASE_AWS_KEY }}
+ r2-secret-access-key: ${{ secrets.CF_R2_RELEASE_SECRET_KEY }}
+ r2-bucket: ghostty-release
+ source-dir: blob
+ destination-dir: ./
+
+ - name: Prep Appcast
+ run: |
+ rm -rf blob
+ mkdir blob
+ mv appcast.xml blob/appcast.xml
+ - name: Upload Appcast to R2
+ uses: ryand56/r2-upload-action@latest
+ with:
+ r2-account-id: ${{ secrets.CF_R2_RELEASE_ACCOUNT_ID }}
+ r2-access-key-id: ${{ secrets.CF_R2_RELEASE_AWS_KEY }}
+ r2-secret-access-key: ${{ secrets.CF_R2_RELEASE_SECRET_KEY }}
+ r2-bucket: ghostty-release
+ source-dir: blob
+ destination-dir: ./
diff --git a/.github/workflows/release-tip.yml b/.github/workflows/release-tip.yml
index 3310898a5..a6caa64ce 100644
--- a/.github/workflows/release-tip.yml
+++ b/.github/workflows/release-tip.yml
@@ -111,7 +111,7 @@ jobs:
name: ghostty
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
- name: Create Tarball
- run: git archive --format=tgz -o ghostty-source.tar.gz HEAD
+ run: git archive --format=tgz --prefix=ghostty-source/ -o ghostty-source.tar.gz HEAD
- name: Sign Tarball
run: |
echo -n "${{ secrets.MINISIGN_KEY }}" > minisign.key
@@ -239,7 +239,18 @@ jobs:
# Codesign the app bundle
/usr/bin/codesign --verbose -f -s "$MACOS_CERTIFICATE_NAME" -o runtime --entitlements "macos/Ghostty.entitlements" macos/build/Release/Ghostty.app
- - name: "Notarize app bundle"
+ - name: Create DMG
+ env:
+ MACOS_CERTIFICATE_NAME: ${{ secrets.PROD_MACOS_CERTIFICATE_NAME }}
+ run: |
+ npm install --global create-dmg
+ create-dmg \
+ --identity="$MACOS_CERTIFICATE_NAME" \
+ ./macos/build/Release/Ghostty.app \
+ ./
+ mv ./Ghostty*.dmg ./Ghostty.dmg
+
+ - name: "Notarize DMG"
env:
PROD_MACOS_NOTARIZATION_APPLE_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }}
PROD_MACOS_NOTARIZATION_TEAM_ID: ${{ secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }}
@@ -250,22 +261,18 @@ jobs:
echo "Create keychain profile"
xcrun notarytool store-credentials "notarytool-profile" --apple-id "$PROD_MACOS_NOTARIZATION_APPLE_ID" --team-id "$PROD_MACOS_NOTARIZATION_TEAM_ID" --password "$PROD_MACOS_NOTARIZATION_PWD"
- # We can't notarize an app bundle directly, but we need to compress it as an archive.
- # Therefore, we create a zip file containing our app bundle, so that we can send it to the
- # notarization service
- echo "Creating temp notarization archive"
- ditto -c -k --keepParent "macos/build/Release/Ghostty.app" "notarization.zip"
-
# Here we send the notarization request to the Apple's Notarization service, waiting for the result.
# This typically takes a few seconds inside a CI environment, but it might take more depending on the App
# characteristics. Visit the Notarization docs for more information and strategies on how to optimize it if
# you're curious
- echo "Notarize app"
- xcrun notarytool submit "notarization.zip" --keychain-profile "notarytool-profile" --wait
+ echo "Notarize dmg"
+ xcrun notarytool submit "Ghostty.dmg" --keychain-profile "notarytool-profile" --wait
# Finally, we need to "attach the staple" to our executable, which will allow our app to be
- # validated by macOS even when an internet connection is not available.
+ # validated by macOS even when an internet connection is not available. We do this to
+ # both the app and the dmg
echo "Attach staple"
+ xcrun stapler staple "Ghostty.dmg"
xcrun stapler staple "macos/build/Release/Ghostty.app"
# Zip up the app and symbols
@@ -283,7 +290,9 @@ jobs:
prerelease: true
tag_name: tip
target_commitish: ${{ github.sha }}
- files: ghostty-macos-universal.zip
+ files: |
+ ghostty-macos-universal.zip
+ Ghostty.dmg
token: ${{ secrets.GH_RELEASE_TOKEN }}
# Create our appcast for Sparkle
@@ -292,8 +301,8 @@ jobs:
SPARKLE_KEY: ${{ secrets.PROD_MACOS_SPARKLE_KEY }}
run: |
echo $SPARKLE_KEY > signing.key
- sign_update -f signing.key ghostty-macos-universal.zip > sign_update.txt
- curl -L https://tip.files.ghostty.dev/appcast.xml > appcast.xml
+ sign_update -f signing.key Ghostty.dmg > sign_update.txt
+ curl -L https://tip.files.ghostty.org/appcast.xml > appcast.xml
python3 ./dist/macos/update_appcast_tip.py
test -f appcast_new.xml
@@ -304,6 +313,7 @@ jobs:
mkdir -p blob/${GHOSTTY_COMMIT_LONG}
cp ghostty-macos-universal.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal.zip
cp ghostty-macos-universal-dsym.zip blob/${GHOSTTY_COMMIT_LONG}/ghostty-macos-universal-dsym.zip
+ cp Ghostty.dmg blob/${GHOSTTY_COMMIT_LONG}/Ghostty.dmg
- name: Upload to R2
uses: ryand56/r2-upload-action@latest
diff --git a/PACKAGING.md b/PACKAGING.md
index f429c27cc..aadad0b65 100644
--- a/PACKAGING.md
+++ b/PACKAGING.md
@@ -14,17 +14,29 @@ package Ghostty for distribution.
## Source Tarballs
-Source tarballs with stable checksums are available on the
-[GitHub releases page](https://github.com/ghostty-org/ghostty/releases).
-Use the `ghostty-source.tar.gz` asset and _not the GitHub auto-generated
-source tarball_.
+Source tarballs with stable checksums are available for tagged releases
+at `release.files.ghostty.org` in the following URL format where
+`VERSION` is the version number with no prefix such as `1.0.0`:
-Signature files are signed with [minisign](https://jedisct1.github.io/minisign/) using the following public key:
+```
+https://release.files.ghostty.org/VERSION/ghostty-source.tar.gz
+https://release.files.ghostty.org/VERSION/ghostty-source.tar.gz.minisig
+```
+
+Signature files are signed with
+[minisign](https://jedisct1.github.io/minisign/)
+using the following public key:
```
RWQlAjJC23149WL2sEpT/l0QKy7hMIFhYdQOFy0Z7z7PbneUgvlsnYcV
```
+**Tip source tarballs** are available on the
+[GitHub releases page](https://github.com/ghostty-org/ghostty/releases/tag/tip).
+Use the `ghostty-source.tar.gz` asset and _not the GitHub auto-generated
+source tarball_. These tarballs are generated for every commit to
+the `main` branch and are not associated with a specific version.
+
## Zig Version
[Zig](https://ziglang.org) is required to build Ghostty. Prior to Zig 1.0,
diff --git a/README.md b/README.md
index 5052ac214..9e5a3b0e1 100644
--- a/README.md
+++ b/README.md
@@ -9,29 +9,29 @@
About
·
- Download
+ Download
·
- Roadmap
+ Documentation
·
Developing
-
- Testers! Read This Too!
-
## About
-Ghostty is a cross-platform, GPU-accelerated terminal emulator that aims to
-push the boundaries of what is possible with a terminal emulator by exposing
-modern, opt-in features that enable CLI tool developers to build more feature
-rich, interactive applications.
+Ghostty is a terminal emulator that differentiates itself by being
+fast, feature-rich, and native. While there are many excellent terminal
+emulators available, they all force you to choose between speed,
+features, or native UIs. Ghostty provides all three.
-There are a number of excellent terminal emulator options that exist
-today. The unique goal of Ghostty is to have a platform for experimenting
-with modern, optional, non-standards-compliant features to enhance the
-capabilities of CLI applications. We aim to be the best in this category,
-and competitive in the rest.
+In all categories, I am not trying to claim that Ghostty is the
+best (i.e. the fastest, most feature-rich, or most native). But
+Ghostty is competitive in all three categories and Ghostty
+doesn't make you choose between them.
+
+Ghostty also intends to push the boundaries of what is possible with a
+terminal emulator by exposing modern, opt-in features that enable CLI tool
+developers to build more feature rich, interactive applications.
While aiming for this ambitious goal, our first step is to make Ghostty
one of the best fully standards compliant terminal emulator, remaining
@@ -39,332 +39,15 @@ compatible with all existing shells and software while supporting all of
the latest terminal innovations in the ecosystem. You can use Ghostty
as a drop-in replacement for your existing terminal emulator.
-**Project Status:** Ghostty is still in beta but implements most of the
-features you'd expect for a daily driver. We currently have hundreds of active
-beta users using Ghostty as their primary terminal. See more in
-[Roadmap and Status](#roadmap-and-status).
+For more details, see [About Ghostty](https://ghostty.org/docs/about).
## Download
-| Platform / Package | Links | Notes |
-| ------------------ | -------------------------------------------------------------------------- | -------------------------- |
-| macOS | [Tip ("Nightly")](https://github.com/ghostty-org/ghostty/releases/tag/tip) | MacOS 13+ Universal Binary |
-| Linux | [Build from Source](#developing-ghostty) | |
-| Linux (NixOS/Nix) | [Use the Flake](#nix-package) | |
-| Linux (Arch) | [Use the AUR package](https://aur.archlinux.org/packages/ghostty-git) | |
-| Windows | [Build from Source](#developing-ghostty) | [Notes](#windows-notes) |
+See the [download page](https://ghostty.org/download) on the Ghostty website.
-### Configuration
+## Documentation
-To configure Ghostty, you must use a configuration file. GUI-based configuration
-is on the roadmap but not yet supported. The configuration file must be
-placed at `$XDG_CONFIG_HOME/ghostty/config`, which defaults to
-`~/.config/ghostty/config` if the [XDG environment is not set](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html).
-
-The file format is documented below as an example:
-
-```ini
-# The syntax is "key = value". The whitespace around the equals doesn't matter.
-background = 282c34
-foreground= ffffff
-
-# Comments start with a `#` and are only valid on their own line.
-# Blank lines are ignored!
-
-keybind = ctrl+z=close_surface
-keybind = ctrl+d=new_split:right
-
-# Empty values reset the configuration to the default value
-
-font-family =
-
-# Colors can be changed by setting the 16 colors of `palette`, which each color
-# being defined as regular and bold.
-#
-# black
-palette = 0=#1d2021
-palette = 8=#7c6f64
-# red
-palette = 1=#cc241d
-palette = 9=#fb4934
-# green
-palette = 2=#98971a
-palette = 10=#b8bb26
-# yellow
-palette = 3=#d79921
-palette = 11=#fabd2f
-# blue
-palette = 4=#458588
-palette = 12=#83a598
-# purple
-palette = 5=#b16286
-palette = 13=#d3869b
-# aqua
-palette = 6=#689d6a
-palette = 14=#8ec07c
-# white
-palette = 7=#a89984
-palette = 15=#fbf1c7
-```
-
-#### Configuration Documentation
-
-There are multiple places to find documentation on the configuration options.
-All locations are identical (they're all generated from the same source):
-
-1. There are HTML and Markdown formatted docs in the
- `$prefix/share/ghostty/docs` directory. This directory is created
- when you build or install Ghostty. The `$prefix` is `zig-out` if you're
- building from source (or the specified `--prefix` flag). On macOS,
- `$prefix` is the `Contents/Resources` subdirectory of the `.app` bundle.
-
-2. There are man pages in the `$prefix/share/man` directory. This directory
- is created when you build or install Ghostty.
-
-3. In the CLI, you can run `ghostty +show-config --default --docs`.
- Note that this will output the full default configuration with docs to
- stdout, so you may want to pipe that through a pager, an editor, etc.
-
-4. In the source code, you can find the configuration structure in the
- [Config structure](https://github.com/ghostty-org/ghostty/blob/main/src/config/Config.zig).
- The available keys are the keys verbatim, and their possible values are typically
- documented in the comments.
-
-5. Not documentation per se, but you can search for the
- [public config files](https://github.com/search?q=path%3Aghostty%2Fconfig&type=code)
- of many Ghostty users for examples and inspiration.
-
-> [!NOTE]
->
-> You may see strange looking blank configurations like `font-family =`. This
-> is a valid syntax to specify the default behavior (no value). The
-> `+show-config` outputs it so it's clear that key is defaulting and also
-> to have something to attach the doc comment to.
-
-> [!NOTE]
->
-> Configuration can be reloaded on the fly with the `reload_config`
-> command. Not all configuration options can change without restarting Ghostty.
-> Any options that require a restart should be documented.
-
-#### Configuration Errors
-
-If your configuration file has any errors, Ghostty does its best to ignore
-them and move on. Configuration errors currently show up in the log. The
-log is written directly to stderr, so it is up to you to figure out how to
-access that for your system (for now). On macOS, you can also use the
-system `log` CLI utility. See the [Mac App](#mac-app) section for more
-information.
-
-#### Debugging Configuration
-
-You can verify that configuration is being properly loaded by looking at
-the debug output of Ghostty. Documentation for how to view the debug output
-is in the "building Ghostty" section at the end of the README.
-
-In the debug output, you should see in the first 20 lines or so messages
-about loading (or not loading) a configuration file, as well as any errors
-it may have encountered. Configuration errors are also shown in a dedicated
-window on both macOS and Linux (GTK). Ghostty does not treat configuration
-errors as fatal and will fall back to default values for erroneous keys.
-
-You can also view the full configuration Ghostty is loading using
-`ghostty +show-config` from the command-line. Use the `--help` flag to
-additional options for that command.
-
-### Themes
-
-Ghostty ships with 300+ built-in themes (from
-[iTerm2 Color Schemes](https://github.com/mbadolato/iTerm2-Color-Schemes)).
-You can configure Ghostty to use any of these themes using the `theme`
-configuration. Example:
-
-```
-theme = Solarized Dark - Patched
-```
-
-You can find a list of built-in themes using the `+list-themes` action:
-
-```
-ghostty +list-themes
-...
-```
-
-On macOS, the themes are built-in to the `Ghostty.app` bundle. On Linux,
-theme support requires a valid Ghostty resources dir ("share" directory).
-More details about how to validate the resources directory on Linux
-is covered in the [shell integration section](#shell-integration-installation-and-verification).
-
-Any custom color configuration (`palette`, `background`, `foreground`, etc.)
-in your configuration files will override the theme settings. This can be
-used to load a theme and fine-tune specific colors to your liking.
-
-**Interested in contributing a new theme or updating an existing theme?**
-Please send theme changes upstream to the
-[iTerm2 Color Schemes](https://github.com/mbadolato/iTerm2-Color-Schemes))
-repository. Ghostty periodically updates the themes from this source.
-_Do not send theme changes to the Ghostty project directly_.
-
-### Shell Integration
-
-Ghostty supports some features that require shell integration. I am aiming
-to support many of the features that
-[Kitty supports for shell integration](https://sw.kovidgoyal.net/kitty/shell-integration/).
-
-The currently supported shell integration features in Ghostty:
-
-- We do not confirm close for windows where the cursor is at a prompt.
-- New terminals start in the working directory of the previously focused terminal.
-- Complex prompts resize correctly by allowing the shell to redraw the prompt line.
-- Triple-click while holding control (Linux) or command (macOS) to select the output of a command.
-- The cursor at the prompt is turned into a bar.
-- The `jump_to_prompt` keybinding can be used to scroll the terminal window
- forward and back through prompts.
-- Alt+click (option+click on macOS) to move the cursor at the prompt.
-- `sudo` is wrapped to preserve Ghostty terminfo (disabled by default)
-
-#### Shell Integration Installation and Verification
-
-Ghostty will automatically inject the shell integration code for `bash`, `zsh`
-and `fish`. Other shells do not have shell integration code written but will
-function fine within Ghostty with the above mentioned shell integration features
-inoperative. **If you want to disable automatic shell integration,** set
-`shell-integration = none` in your configuration file.
-
-Automatic `bash` shell integration requires Bash version 4 or later and must be
-explicitly enabled by setting `shell-integration = bash`.
-
-**For the automatic shell integration to work,** Ghostty must either be run
-from the macOS app bundle or be installed in a location where the contents of
-`zig-out/share` are available somewhere above the directory where Ghostty
-is running from. On Linux, this should automatically work if you run from
-the `zig-out` directory tree structure (a standard FHS-style tree).
-
-You may also manually set the `GHOSTTY_RESOURCES_DIR` to point to the
-`zig-out/share/ghostty` contents. To validate this directory the file
-`$GHOSTTY_RESOURCES_DIR/../terminfo/ghostty.terminfo` should exist.
-
-To verify shell integration is working, look for the following log lines:
-
-```
-info(io_exec): using Ghostty resources dir from env var: /Applications/Ghostty.app/Contents/Resources
-info(io_exec): shell integration automatically injected shell=termio.shell_integration.Shell.fish
-```
-
-If you see any of the following, something is not working correctly.
-The main culprit is usually that `GHOSTTY_RESOURCES_DIR` is not pointing
-to the right place.
-
-```
-ghostty terminfo not found, using xterm-256color
-
-or
-
-shell could not be detected, no automatic shell integration will be injected
-```
-
-#### Switching Shells with Shell Integration
-
-Automatic shell integration as described in the previous section only works
-for the _initially launched shell_ when Ghostty is started. If you switch
-shells within Ghostty, i.e. you manually run `bash` or you use a command
-like `nix-shell`, the shell integration _will be lost_ in that shell
-(it will keep working in the original shell process).
-
-To make shell integration work in these cases, you must manually source
-the Ghostty shell-specific code at the top of your shell configuration
-files. Ghostty will automatically set the `GHOSTTY_RESOURCES_DIR` environment
-variable when it starts, so you can use this to (1) detect your shell
-is launched within Ghostty and (2) to find the shell-integration.
-
-For example, for bash, you'd put this _at the top_ of your `~/.bashrc`:
-
-```bash
-# Ghostty shell integration for Bash. This must be at the top of your bashrc!
-if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
- builtin source "${GHOSTTY_RESOURCES_DIR}/shell-integration/bash/ghostty.bash"
-fi
-```
-
-For details see shell-integration/README.md.
-
-Each shell integration's installation instructions are documented inline:
-
-| Shell | Integration |
-| -------- | ---------------------------------------------------------------------------------------------- |
-| `bash` | `${GHOSTTY_RESOURCES_DIR}/shell-integration/bash/ghostty.bash` |
-| `fish` | `${GHOSTTY_RESOURCES_DIR}/shell-integration/fish/vendor_conf.d/ghostty-shell-integration.fish` |
-| `zsh` | `${GHOSTTY_RESOURCES_DIR}/shell-integration/zsh/ghostty-integration` |
-| `elvish` | `${GHOSTTY_RESOURCES_DIR}/shell-integration/elvish/lib/ghostty-integration.elv` |
-
-### Terminfo
-
-Ghostty ships with its own [terminfo](https://en.wikipedia.org/wiki/Terminfo)
-entry to tell software about its capabilities. When that entry is detected,
-Ghostty sets the `TERM` environment variable to `xterm-ghostty`.
-
-If the Ghostty resources dir ("share" directory) is detected, Ghostty will
-set a `TERMINFO` environment variable so `xterm-ghostty` properly advertises
-the available capabilities of Ghostty. On macOS, this always happens because
-the terminfo is embedded in the app bundle. On Linux, this depends on
-appropriate installation (see the installation instructions).
-
-If you use `sudo`, sudo may reset your environment variables and you may see
-an error about `missing or unsuitable terminal: xterm-ghostty` when running
-some programs. To resolve this, you must either configure sudo to preserve
-the `TERMINFO` environment variable, or you can use shell-integration with
-the `sudo` feature enabled and Ghostty will alias sudo to automatically do
-this for you. To enable the shell-integration feature specify
-`shell-integration-features = sudo` in your configuration.
-
-If you use SSH to connect to other machines that do not have Ghostty's terminfo
-entry, you will see error messages like `missing or unsuitable terminal:
-xterm-ghostty`.
-
-Hopefully someday Ghostty will have terminfo entries pre-distributed
-everywhere, but in the meantime there are two ways to resolve the situation:
-
-1. Copy Ghostty's terminfo entry to the remote machine.
-2. Configure SSH to fall back to a known terminfo entry.
-
-#### Copy Ghostty's terminfo to a remote machine
-
-The following one-liner will export the terminfo entry from your host and
-import it on the remote machine:
-
-```shell-session
-infocmp -x | ssh YOUR-SERVER -- tic -x -
-```
-
-> [!NOTE]
->
-> **macOS versions before Sonoma cannot use the system-bundled `infocmp`.**
-> The bundled version of `ncurses` is too old to emit a terminfo entry that can be
-> read by more recent versions of `tic`, and the command will fail with a bunch
-> of `Illegal character` messages. You can fix this by using Homebrew to install
-> a recent version of `ncurses` and replacing `infocmp` above with the full path
-> `/opt/homebrew/opt/ncurses/bin/infocmp`.
-
-#### Configure SSH to fall back to a known terminfo entry
-
-If copying around terminfo entries is untenable, you can override `TERM` to a
-fallback value using SSH config.
-
-```ssh-config
-# .ssh/config
-Host example.com
- SetEnv TERM=xterm-256color
-```
-
-**Requires OpenSSH 8.7 or newer.** [The 8.7 release added
-support](https://www.openssh.com/txt/release-8.7) for setting `TERM` via
-`SetEnv`.
-
-> [!WARNING]
->
-> **Fallback does not support advanced terminal features.** Because
-> `xterm-256color` does not include all of Ghostty's capabilities, terminal
-> features beyond xterm's like colored and styled underlines will not work.
+See the [documentation](https://ghostty.org/docs) on the Ghostty website.
## Roadmap and Status
@@ -425,8 +108,6 @@ feature rich.
> [!NOTE]
> Despite being _very fast_, there is a lot of room for improvement here.
-> We still consider some aspects of our performance a "bug" and plan on
-> taking a dedicated pass to improve performance before public release.
#### Richer Windowing Features
@@ -506,40 +187,9 @@ SENTRY_DSN=https://e914ee84fd895c4fe324afa3e53dac76@o4507352570920960.ingest.us.
## Developing Ghostty
-To build Ghostty, you need [Zig 0.13](https://ziglang.org/) installed.
-
-On Linux, you may need to install additional dependencies. See
-[Linux Installation Tips](#linux-installation-tips). On macOS, you
-need Xcode installed with the macOS and iOS SDKs enabled. See
-[Mac `.app`](#mac-app).
-
-The official development environment is defined by Nix. You do not need
-to use Nix to develop Ghostty, but the Nix environment is the environment
-which runs CI tests and builds release artifacts. Any development work on
-Ghostty must pass within these Nix environments.
-
-> [!NOTE]
->
-> **Zig 0.13 is required.** Ghostty only guarantees that it can build
-> against 0.13. Zig is still a fast-moving project so it is likely newer
-> versions will not be able to build Ghostty yet. You can find binary
-> releases of Zig release builds on the
-> [Zig downloads page](https://ziglang.org/download/).
-
-With Zig and necessary dependencies installed, a binary can be built using
-`zig build`:
-
-```shell-session
-zig build
-...
-
-zig-out/bin/ghostty
-```
-
-This will build a binary for the currently running system (if supported).
-**Note: macOS does not result in a runnable binary with this command.**
-macOS builds produce a library (`libghostty.a`) that is used by the Xcode
-project in the `macos` directory to produce the final `Ghostty.app`.
+See the documentation on the Ghostty website for
+[building Ghostty from source](http://ghostty.org/docs/install/build).
+For development, omit the `-Doptimize` flag to build a debug build.
On Linux or macOS, you can use `zig build -Dapp-runtime=glfw run` for a quick
GLFW-based app for a faster development cycle while developing core
@@ -556,189 +206,6 @@ Other useful commands:
in the current running terminal emulator so if you want to check the
behavior of this project, you must run this command in Ghostty.
-### Compiling a Release Build
-
-The normal build will be a _debug build_ which includes a number of
-safety features as well as debugging features that dramatically slow down
-normal operation of the terminal (by as much as 100x). If you are building
-a terminal for day to day usage, build a release version:
-
-```shell-session
-zig build -Doptimize=ReleaseFast
-...
-```
-
-You can verify you have a release version by checking the filesize of the
-built binary (`zig-out/bin/ghostty`). The release version should be significantly
-smaller than debug builds. On Linux, the release build is around 31MB while the
-debug build is around 145MB.
-
-When using the GTK runtime (`-Dapp-runtime=gtk`) a release build will
-use a [single-instance application](https://developer.gnome.org/documentation/tutorials/application.html).
-If you're developing Ghostty from _inside_ a release build and build & launch a
-new one that will not reflect the changes you made, but instead launch a new
-window for the existing instance. You can disable this behaviour with the
-`--gtk-single-instance=false` flag or by adding `gtk-single-instance = false` to
-the configuration file.
-
-### Linux Installation Tips
-
-On Linux, you'll need to install header packages for Ghostty's dependencies
-before building it. Typically, these are only gtk4 and libadwaita, since
-Ghostty will build everything else static by default. On Ubuntu and Debian, use
-
-```
-sudo apt install libgtk-4-dev libadwaita-1-dev git
-```
-
-> [!NOTE]
->
-> **A recent GTK is required for Ghostty to work with Nvidia (GL) drivers
-> under x11.** Ubuntu 22.04 LTS has GTK 4.6 which is not new enough. Ubuntu 23.10
-> has GTK 4.12 and works. From [this discussion](https://discourse.gnome.org/t/opengl-context-version-not-respected-on-gtk4-rs/12162?u=cdehais)
-> the problem was fixed in GTK by Dec 2022. Also, if you are a BTRFS user, make
-> sure to manually upgrade your Kernel (6.6.6 will work). The stock kernel in
-> Ubuntu 23.10 is 6.5.0 which has a bug which
-> [causes zig to fail its hash check for packages](https://github.com/ziglang/zig/issues/17282).
-
-> [!WARNING]
->
-> GTK 4.14 on Wayland has a bug which may cause an immediate crash.
-> There is an [open issue](https://gitlab.gnome.org/GNOME/gtk/-/issues/6589/note_2072039)
-> to track this GTK bug. You can workaround this issue by running ghostty with
-> `GDK_DEBUG=gl-disable-gles ghostty`
->
-> However, that fix may not work for you if the GTK version Ghostty is compiled
-> against is too old, which mainly currently happens with development builds on NixOS.
->
-> If your build of Ghostty immediately crashes after launch, try looking
-> through the debug output. If running `./zig-out/bin/ghostty 2>&1 | grep "Unrecognized value"`
-> result in the line `Unrecognized value "gl-disable-gles". Try GDK_DEBUG=help`,
-> then the GTK version used is too old.
->
-> To fix this, you might need to manually tie the `nixpkgs-stable` inputs to your
-> system's `nixpkgs` in `flake.nix`:
->
-> ```nix
-> {
-> inputs = {
-> # nixpkgs-stable.url = "github:nixos/nixpkgs/release-23.05";
->
-> # Assumes your system nixpkgs is called "nixpkgs"
-> nixpkgs-stable.url = "nixpkgs";
-> }
-> }
-> ```
-
-On Arch Linux, use
-
-```
-sudo pacman -S gtk4 libadwaita
-```
-
-On Fedora variants, use
-
-```
-sudo dnf install gtk4-devel zig libadwaita-devel
-```
-
-On Fedora Atomic variants, use
-
-```
-rpm-ostree install gtk4-devel zig libadwaita-devel
-```
-
-If you're planning to use a build from source as your daily driver,
-I recommend using the `-p` (prefix) flag for `zig build` to install
-Ghostty into `~/.local`. This will setup the proper FHS directory structure
-that ensures features such as shell integration, icons, GTK shortcuts, etc.
-all work.
-
-```
-zig build -p $HOME/.local -Doptimize=ReleaseFast
-...
-```
-
-With a typical Freedesktop-compatible desktop environment (i.e. Gnome,
-KDE), this will make Ghostty available as an app in your app launcher.
-Note, if you don't see it immediately you may have to log out and log back
-in or maybe even restart. For my Gnome environment, it showed up within a
-few seconds. For any other desktop environment, you can launch Ghostty
-directly using `~/.local/bin/ghostty`.
-
-If Ghostty fails to launch using an app icon in your app launcher,
-ensure that `~/.local/bin` is on your _system_ `PATH`. The desktop environment
-itself must have that path in the `PATH`. Google for your specific desktop
-environment and distribution to learn how to do that.
-
-This _isn't required_, but `~/.local` is a directory that happens to be
-on the search path for a lot of software (such as Gnome and KDE) and
-installing into a prefix with `-p` sets up a directory structure to ensure
-all features of Ghostty work.
-
-### Mac `.app`
-
-To build the official, fully featured macOS application, you must
-build on a macOS machine with Xcode installed, and the active developer
-directory pointing to it. If you're not sure that's the case, check the
-output of `xcode-select --print-path`:
-
-```shell-session
-xcode-select --print-path
-/Library/Developer/CommandLineTools # <-- BAD
-sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
-xcode-select --print-path
-/Applications/Xcode.app/Contents/Developer # <-- GOOD
-```
-
-The above can happen if you install the Xcode Command Line Tools _after_ Xcode
-is installed. With that out of the way, make sure you have both the macOS and
-iOS SDKs installed (from inside Xcode → Settings → Platforms), and let's move
-on to building Ghostty:
-
-```shell-session
-zig build -Doptimize=ReleaseFast
-cd macos && xcodebuild
-```
-
-> [!NOTE]
-> If you're using the Nix environment on macOS, `xcodebuild` will
-> fail due to the linker environment variables Nix sets. You must
-> run the `xcodebuild` command specifically outside of the Nix
-> environment.
-
-This will output the app to `macos/build/ReleaseLocal/Ghostty.app`.
-This app will be not be signed or notarized.
-[Official continuous builds are available](https://github.com/ghostty-org/ghostty/releases/tag/tip)
-that are both signed and notarized.
-
-The "ReleaseLocal" build configuration is specifically for local release
-builds and disables some security features (such as "Library Validation")
-to make it easier to run without having to have a code signing identity
-and so on. These builds aren't meant for distribution. If you want a release
-build with all security features, I highly recommend you use
-[the official continuous builds](https://github.com/ghostty-org/ghostty/releases/tag/tip).
-
-When running the app, logs are available via macOS unified logging such
-as `Console.app`. The easiest way I've found to view these is to just use the CLI:
-
-```sh
-sudo log stream --level debug --predicate 'subsystem=="com.mitchellh.ghostty"'
-...
-```
-
-### Windows Notes
-
-Windows support is still a [work-in-progress](https://github.com/ghostty-org/ghostty/issues/437).
-The current status is that a bare bones glfw-based build _works_! The experience
-with this build is super minimal: there are no native experiences, only a
-single window is supported, no tabs, etc. Therefore, the current status is
-simply that the core terminal experience works.
-
-If you want to help with Windows development, please see the
-[tracking issue](https://github.com/ghostty-org/ghostty/issues/437). We plan
-on vastly improving this experience over time.
-
### Linting
#### Prettier
@@ -780,59 +247,6 @@ alejandra .
Make sure your Alejandra version matches the version of Alejandra in [devShell.nix](https://github.com/ghostty-org/ghostty/blob/main/nix/devShell.nix).
-### Nix Package
-
-There is Nix package that can be used in the flake (`packages.ghostty` or `packages.default`).
-It can be used in NixOS configurations and otherwise built off of.
-
-Below is an example:
-
-```nix
-{
- inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
-
- # NOTE: This will require your git SSH access to the repo.
- #
- # WARNING:
- # Do NOT pin the `nixpkgs` input, as that will
- # declare the cache useless. If you do, you will have
- # to compile LLVM, Zig and Ghostty itself on your machine,
- # which will take a very very long time.
- #
- # Additionally, if you use NixOS, be sure to **NOT**
- # run `nixos-rebuild` as root! Root has a different Git config
- # that will ignore any SSH keys configured for the current user,
- # denying access to the repository.
- #
- # Instead, either run `nix flake update` or `nixos-rebuild build`
- # as the current user, and then run `sudo nixos-rebuild switch`.
- ghostty = {
- url = "git+ssh://git@github.com/ghostty-org/ghostty";
-
- # NOTE: The below 2 lines are only required on nixos-unstable,
- # if you're on stable, they may break your build
- inputs.nixpkgs-stable.follows = "nixpkgs";
- inputs.nixpkgs-unstable.follows = "nixpkgs";
- };
- };
-
- outputs = { nixpkgs, ghostty, ... }: {
- nixosConfigurations.mysystem = nixpkgs.lib.nixosSystem {
- modules = [
- {
- environment.systemPackages = [
- ghostty.packages.x86_64-linux.default
- ];
- }
- ];
- };
- };
-}
-```
-
-You can also test the build of the nix package at any time by running `nix build .`.
-
#### Updating the Zig Cache Fixed-Output Derivation Hash
The Nix package depends on a [fixed-output
diff --git a/README_TESTERS.md b/README_TESTERS.md
deleted file mode 100644
index 8a63ecee5..000000000
--- a/README_TESTERS.md
+++ /dev/null
@@ -1,105 +0,0 @@
-# Hello Ghostty Testers! 👋👻
-
-Thank you for being an early Ghostty user! I'm super excited to have you
-here. **Please, please read the [README](https://github.com/ghostty-org/ghostty#readme)!**
-There is a lot of information in the README that I will not be repeating here,
-especially about how to get Ghostty and configure it.
-
-## Let's Build An Excellent Terminal
-
-The Ghostty development process so far has been a cycle of inviting people,
-getting Ghostty to work great for them, then inviting new people once it
-feels stable.
-
-So, if you're part of a new group, _expect there will be bugs_!
-Ghostty may work really great for previous testers, but every new group of
-users has their own OS quirks, programs, expected features, etc. that tend
-to surface new issues. **That's why you're here and I appreciate you so much!**
-
-**I will not invite new groups of testers until Ghostty is _very stable and
-excellent_ for the previous group of testers.** So let's work together on getting
-Ghostty to a place that works well for you.
-
-## Talking About Ghostty Publicly
-
-Feel free to talk about Ghostty, share screenshots, etc. in the public!
-Please don't share source access yet. And obviously, if Ghostty is buggy
-or you want to say something mean, I'd rather you talk to me first so
-I can try to fix it, this is an early beta after all... I hope no testers
-I invite would be mean, though!
-
-## Reporting Issues and Contributing
-
-Please report any issues you have, including feature requests! Because we're
-in a closed beta period, there aren't really many rules -- just open 'em up
-and we'll have a discussion.
-
-That said, **feel free to contribute!** I would _love_ that. If you want
-any help, ask in Discord and I'll do my best to point you in the right direction
-or even pair (time permitting) if you're interested.
-
-### Bug Priority
-
-This is the priority of bugs:
-
-1. Crashes. 💥 These are just unacceptable and I'll drop everything to
- fix a crash.
-
-2. Escape sequence logic or rendering issues. These are almost as bad as
- crashes because they usually make your workflow unusable. This includes
- unsupported escape sequences that impact your workflow.
-
-3. Anything else...
-
-## Let's Talk!
-
-You likely landed in the Discord community first, if for some reason you're not
-in there, join [here](https://discord.gg/ghostty). Discord is a great place to
-share feedback, discuss issues, ask questions and talk to other testers.
-
-## Other FAQ
-
-### Can I Invite a Friend?
-
-Yes, if you have any friends you'd like to add to the beta, you can use
-the `/vouch` command in the Ghostty Discord server and mods will be notified
-of your vouch request.
-
-If the username of your friend doesn't show up for the `/vouch` command,
-it means they either haven't joined the Discord yet or they haven't accepted
-the server rules. Please ask them to join the Discord and accept the rules
-and then try again.
-
-Vouches are handled on a as-available basis, so please be patient. They're
-usually processed quickly, but sometimes it may take a day or two. In very
-rare cases, we pause vouches to ensure the stability of the beta. But that's
-very rare and has only happened a handful of times.
-
-Anyone you vouch is your responsibility, so please make sure they're a good
-fit for the beta and will follow the rules. There is no limit on the number
-of people you can vouch in total, but we do rate limit the number of vouches
-you can do. If any mods feel you're vouching for too many people, they may
-reject your requests.
-
-### I want to help, what can I work on?
-
-I'd really love that, I want to foster a healthy contributing community
-with Ghostty over time, and I really appreciate the help.
-
-Take a look at the issues list. Feel free to suggest new things. If you
-have a favorite feature from some other terminal emulator, let's build it!
-My only ask is that for big features, please ask the Discord first to gauge
-interest/acceptance for it before opening up some huge PR.
-
-There are also non-core help we can use: docs, website work, Discord bots,
-etc. etc. For example, a web UI to generate a configuration file would be
-cool. Or a web UI to preview your color settings.
-
-### Is Ghostty Open Source?
-
-Right now technically not (no license file). But yes, it will be full
-open source (by the OSI definition). I'm not sure what license to choose
-yet, leaning towards going with MIT for this project but open to ideas.
-
-We will add a license prior to opening up the repository. During the private
-beta period, I'll continue with a no license project.
diff --git a/build.zig b/build.zig
index 6904a4815..d642f254a 100644
--- a/build.zig
+++ b/build.zig
@@ -13,6 +13,7 @@ const config_vim = @import("src/config/vim.zig");
const config_sublime_syntax = @import("src/config/sublime_syntax.zig");
const fish_completions = @import("src/build/fish_completions.zig");
const zsh_completions = @import("src/build/zsh_completions.zig");
+const bash_completions = @import("src/build/bash_completions.zig");
const build_config = @import("src/build_config.zig");
const BuildConfig = build_config.BuildConfig;
const WasmTarget = @import("src/os/wasm/target.zig").Target;
@@ -152,6 +153,12 @@ pub fn build(b: *std.Build) !void {
break :emit_docs path != null;
};
+ const emit_webdata = b.option(
+ bool,
+ "emit-webdata",
+ "Build the website data for the website.",
+ ) orelse false;
+
const emit_xcframework = b.option(
bool,
"emit-xcframework",
@@ -517,6 +524,18 @@ pub fn build(b: *std.Build) !void {
});
}
+ // bash shell completions
+ {
+ const wf = b.addWriteFiles();
+ _ = wf.add("ghostty.bash", bash_completions.bash_completions);
+
+ b.installDirectory(.{
+ .source_dir = wf.getDirectory(),
+ .install_dir = .prefix,
+ .install_subdir = "share/bash-completion/completions",
+ });
+ }
+
// Vim plugin
{
const wf = b.addWriteFiles();
@@ -575,6 +594,11 @@ pub fn build(b: *std.Build) !void {
b.getInstallStep().dependOn(&b.addInstallFile(placeholder, path).step);
}
+ // Web data
+ if (emit_webdata) {
+ try buildWebData(b, config);
+ }
+
// App (Linux)
if (target.result.os.tag == .linux and config.app_runtime != .none) {
// https://developer.gnome.org/documentation/guidelines/maintainer/integrating.html
@@ -1565,6 +1589,72 @@ fn buildDocumentation(
}
}
+/// Generate the website reference data that we merge into the
+/// official Ghostty website. This isn't meant to be part of any
+/// actual build.
+fn buildWebData(
+ b: *std.Build,
+ config: BuildConfig,
+) !void {
+ {
+ const webgen_config = b.addExecutable(.{
+ .name = "webgen_config",
+ .root_source_file = b.path("src/main.zig"),
+ .target = b.host,
+ });
+ try addHelp(b, webgen_config, config);
+
+ {
+ const buildconfig = config: {
+ var copy = config;
+ copy.exe_entrypoint = .webgen_config;
+ break :config copy;
+ };
+
+ const options = b.addOptions();
+ try buildconfig.addOptions(options);
+ webgen_config.root_module.addOptions("build_options", options);
+ }
+
+ const webgen_config_step = b.addRunArtifact(webgen_config);
+ const webgen_config_out = webgen_config_step.captureStdOut();
+
+ b.getInstallStep().dependOn(&b.addInstallFile(
+ webgen_config_out,
+ "share/ghostty/webdata/config.mdx",
+ ).step);
+ }
+
+ {
+ const webgen_actions = b.addExecutable(.{
+ .name = "webgen_actions",
+ .root_source_file = b.path("src/main.zig"),
+ .target = b.host,
+ });
+ try addHelp(b, webgen_actions, config);
+
+ {
+ const buildconfig = config: {
+ var copy = config;
+ copy.exe_entrypoint = .webgen_actions;
+ break :config copy;
+ };
+
+ const options = b.addOptions();
+ try buildconfig.addOptions(options);
+ webgen_actions.root_module.addOptions("build_options", options);
+ }
+
+ const webgen_actions_step = b.addRunArtifact(webgen_actions);
+ const webgen_actions_out = webgen_actions_step.captureStdOut();
+
+ b.getInstallStep().dependOn(&b.addInstallFile(
+ webgen_actions_out,
+ "share/ghostty/webdata/actions.mdx",
+ ).step);
+ }
+}
+
fn benchSteps(
b: *std.Build,
target: std.Build.ResolvedTarget,
diff --git a/build.zig.zon b/build.zig.zon
index e2bb11da1..0a209385f 100644
--- a/build.zig.zon
+++ b/build.zig.zon
@@ -22,7 +22,7 @@
.hash = "12205a66d423259567764fa0fc60c82be35365c21aeb76c5a7dc99698401f4f6fefc",
},
.ziglyph = .{
- .url = "https://deps.files.ghostty.dev/ziglyph-b89d43d1e3fb01b6074bc1f7fc980324b04d26a5.tar.gz",
+ .url = "https://deps.files.ghostty.org/ziglyph-b89d43d1e3fb01b6074bc1f7fc980324b04d26a5.tar.gz",
.hash = "12207831bce7d4abce57b5a98e8f3635811cfefd160bca022eb91fe905d36a02cf25",
},
@@ -49,8 +49,8 @@
// Other
.apple_sdk = .{ .path = "./pkg/apple-sdk" },
.iterm2_themes = .{
- .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/5fd82e34a349e36a5b3422d8225c4e044c8b3b4b.tar.gz",
- .hash = "122083713c189f1ceab516efd494123386f3a29132a68a6896b651319a8c57d747e4",
+ .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/d6c42066b3045292e0b1154ad84ff22d6863ebf7.tar.gz",
+ .hash = "12204358b2848ffd993d3425055bff0a5ba9b1b60bead763a6dea0517965d7290a6c",
},
.vaxis = .{
.url = "git+https://github.com/rockorager/libvaxis/?ref=main#6d729a2dc3b934818dffe06d2ba3ce02841ed74b",
diff --git a/dist/macos/update_appcast_tag.py b/dist/macos/update_appcast_tag.py
new file mode 100644
index 000000000..4ef526019
--- /dev/null
+++ b/dist/macos/update_appcast_tag.py
@@ -0,0 +1,105 @@
+"""
+This script is used to update the appcast.xml file for tagged
+Ghostty releases.
+
+This expects the following files in the current directory:
+ - sign_update.txt - contains the output from "sign_update" in the Sparkle
+ framework for the current build.
+ - appcast.xml - the existing appcast file.
+
+And the following environment variables to be set:
+ - GHOSTTY_VERSION - the version number (X.Y.Z format)
+ - GHOSTTY_BUILD - the build number
+ - GHOSTTY_COMMIT - the commit hash
+
+The script will output a new appcast file called appcast_new.xml.
+"""
+
+import os
+import xml.etree.ElementTree as ET
+from datetime import datetime, timezone
+
+now = datetime.now(timezone.utc)
+version = os.environ["GHOSTTY_VERSION"]
+build = os.environ["GHOSTTY_BUILD"]
+commit = os.environ["GHOSTTY_COMMIT"]
+commit_long = os.environ["GHOSTTY_COMMIT_LONG"]
+repo = "https://github.com/ghostty-org/ghostty"
+
+# Read our sign_update output
+with open("sign_update.txt", "r") as f:
+ # format is a=b b=c etc. create a map of this. values may contain equal
+ # signs, so we can't just split on equal signs.
+ attrs = {}
+ for pair in f.read().split(" "):
+ key, value = pair.split("=", 1)
+ value = value.strip()
+ if value[0] == '"':
+ value = value[1:-1]
+ attrs[key] = value
+
+# We need to register our namespaces before reading or writing any files.
+namespaces = { "sparkle": "http://www.andymatuschak.org/xml-namespaces/sparkle" }
+for prefix, uri in namespaces.items():
+ ET.register_namespace(prefix, uri)
+
+# Open our existing appcast and find the channel element. This is where
+# we'll add our new item.
+et = ET.parse('appcast.xml')
+channel = et.find("channel")
+
+# Remove any items with the same version. If we have multiple items with
+# the same version, Sparkle will report invalid signatures if it picks
+# the wrong one when updating.
+for item in channel.findall("item"):
+ sparkle_version = item.find("sparkle:version", namespaces)
+ if sparkle_version is not None and sparkle_version.text == build:
+ channel.remove(item)
+
+ # We also remove any item that doesn't have a pubDate. This should
+ # never happen but it prevents us from having to deal with it later.
+ if item.find("pubDate") is None:
+ channel.remove(item)
+
+# Prune the oldest items if we have more than a limit.
+prune_amount = 15
+pubdate_format = "%a, %d %b %Y %H:%M:%S %z"
+items = channel.findall("item")
+items.sort(key=lambda item: datetime.strptime(item.find("pubDate").text, pubdate_format))
+if len(items) > prune_amount:
+ for item in items[:-prune_amount]:
+ channel.remove(item)
+
+# Create the item using some absolutely terrible XML manipulation.
+item = ET.SubElement(channel, "item")
+elem = ET.SubElement(item, "title")
+elem.text = f"Build {build}"
+elem = ET.SubElement(item, "pubDate")
+elem.text = now.strftime(pubdate_format)
+elem = ET.SubElement(item, "sparkle:version")
+elem.text = build
+elem = ET.SubElement(item, "sparkle:shortVersionString")
+elem.text = f"{version}"
+elem = ET.SubElement(item, "sparkle:minimumSystemVersion")
+elem.text = "13.0.0"
+elem = ET.SubElement(item, "description")
+elem.text = f"""
+Ghostty v{version}
+
+This release was built from commit {commit}
+on {now.strftime('%Y-%m-%d')}.
+
+
+We don't currently generate release notes for auto-updates.
+You can view the complete changelog and release notes on
+the Ghostty website.
+
+"""
+elem = ET.SubElement(item, "enclosure")
+elem.set("url", f"https://release.files.ghostty.org/{version}/Ghostty.dmg")
+elem.set("type", "application/octet-stream")
+for key, value in attrs.items():
+ elem.set(key, value)
+
+# Output the new appcast.
+et.write("appcast_new.xml", xml_declaration=True, encoding="utf-8")
diff --git a/dist/macos/update_appcast_tip.py b/dist/macos/update_appcast_tip.py
index f58ab00ba..ff1fb4be5 100644
--- a/dist/macos/update_appcast_tip.py
+++ b/dist/macos/update_appcast_tip.py
@@ -80,7 +80,7 @@ elem.text = build
elem = ET.SubElement(item, "sparkle:shortVersionString")
elem.text = f"{commit} ({now.strftime('%Y-%m-%d')})"
elem = ET.SubElement(item, "sparkle:minimumSystemVersion")
-elem.text = "12.0.0"
+elem.text = "13.0.0"
elem = ET.SubElement(item, "description")
elem.text = f"""
@@ -94,7 +94,7 @@ commit history on GitHub for all changes.
"""
elem = ET.SubElement(item, "enclosure")
-elem.set("url", f"https://tip.files.ghostty.dev/{commit_long}/ghostty-macos-universal.zip")
+elem.set("url", f"https://tip.files.ghostty.org/{commit_long}/Ghostty.dmg")
elem.set("type", "application/octet-stream")
for key, value in attrs.items():
elem.set(key, value)
diff --git a/include/ghostty.h b/include/ghostty.h
index d2e59b09f..61c3aad32 100644
--- a/include/ghostty.h
+++ b/include/ghostty.h
@@ -333,6 +333,21 @@ typedef struct {
uint32_t cell_height_px;
} ghostty_surface_size_s;
+// Config types
+
+// config.Color
+typedef struct {
+ uint8_t r;
+ uint8_t g;
+ uint8_t b;
+} ghostty_config_color_s;
+
+// config.ColorList
+typedef struct {
+ const ghostty_config_color_s* colors;
+ size_t len;
+} ghostty_config_color_list_s;
+
// apprt.Target.Key
typedef enum {
GHOSTTY_TARGET_APP,
diff --git a/macos/Assets.xcassets/Custom Icon/Contents.json b/macos/Assets.xcassets/Custom Icon/Contents.json
new file mode 100644
index 000000000..73c00596a
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconBaseAluminum.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconBaseAluminum.imageset/Contents.json
new file mode 100644
index 000000000..cc28dc42e
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconBaseAluminum.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "base.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "original"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconBaseAluminum.imageset/base.png b/macos/Assets.xcassets/Custom Icon/CustomIconBaseAluminum.imageset/base.png
new file mode 100644
index 000000000..2c6f3a34b
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconBaseAluminum.imageset/base.png differ
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconBaseBeige.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconBaseBeige.imageset/Contents.json
new file mode 100644
index 000000000..db7850446
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconBaseBeige.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "beige.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "original"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconBaseBeige.imageset/beige.png b/macos/Assets.xcassets/Custom Icon/CustomIconBaseBeige.imageset/beige.png
new file mode 100644
index 000000000..20c081611
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconBaseBeige.imageset/beige.png differ
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconBaseChrome.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconBaseChrome.imageset/Contents.json
new file mode 100644
index 000000000..3889bd273
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconBaseChrome.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "chrome.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "original"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconBaseChrome.imageset/chrome.png b/macos/Assets.xcassets/Custom Icon/CustomIconBaseChrome.imageset/chrome.png
new file mode 100644
index 000000000..66f2f86dd
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconBaseChrome.imageset/chrome.png differ
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconBasePlastic.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconBasePlastic.imageset/Contents.json
new file mode 100644
index 000000000..37ca4585c
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconBasePlastic.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "plastic.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "original"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconBasePlastic.imageset/plastic.png b/macos/Assets.xcassets/Custom Icon/CustomIconBasePlastic.imageset/plastic.png
new file mode 100644
index 000000000..a73470481
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconBasePlastic.imageset/plastic.png differ
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconCRT.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconCRT.imageset/Contents.json
new file mode 100644
index 000000000..ec32cf191
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconCRT.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "crt-effect.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "original"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconCRT.imageset/crt-effect.png b/macos/Assets.xcassets/Custom Icon/CustomIconCRT.imageset/crt-effect.png
new file mode 100644
index 000000000..c032c8400
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconCRT.imageset/crt-effect.png differ
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconGhost.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconGhost.imageset/Contents.json
new file mode 100644
index 000000000..286506fd9
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconGhost.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "ghosty.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "template"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconGhost.imageset/ghosty.png b/macos/Assets.xcassets/Custom Icon/CustomIconGhost.imageset/ghosty.png
new file mode 100644
index 000000000..5df106fe6
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconGhost.imageset/ghosty.png differ
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconGloss.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconGloss.imageset/Contents.json
new file mode 100644
index 000000000..ed8e4328f
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconGloss.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "gloss.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "original"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconGloss.imageset/gloss.png b/macos/Assets.xcassets/Custom Icon/CustomIconGloss.imageset/gloss.png
new file mode 100644
index 000000000..f57bc72a0
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconGloss.imageset/gloss.png differ
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconScreen.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconScreen.imageset/Contents.json
new file mode 100644
index 000000000..6d6a03eaf
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconScreen.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "screen-dark.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "original"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconScreen.imageset/screen-dark.png b/macos/Assets.xcassets/Custom Icon/CustomIconScreen.imageset/screen-dark.png
new file mode 100644
index 000000000..2995fb9da
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconScreen.imageset/screen-dark.png differ
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconScreenMask.imageset/Contents.json b/macos/Assets.xcassets/Custom Icon/CustomIconScreenMask.imageset/Contents.json
new file mode 100644
index 000000000..083891019
--- /dev/null
+++ b/macos/Assets.xcassets/Custom Icon/CustomIconScreenMask.imageset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "images" : [
+ {
+ "filename" : "screen-mask.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "template-rendering-intent" : "original"
+ }
+}
diff --git a/macos/Assets.xcassets/Custom Icon/CustomIconScreenMask.imageset/screen-mask.png b/macos/Assets.xcassets/Custom Icon/CustomIconScreenMask.imageset/screen-mask.png
new file mode 100644
index 000000000..acc431862
Binary files /dev/null and b/macos/Assets.xcassets/Custom Icon/CustomIconScreenMask.imageset/screen-mask.png differ
diff --git a/macos/Ghostty-Info.plist b/macos/Ghostty-Info.plist
index cde2496c7..83194e136 100644
--- a/macos/Ghostty-Info.plist
+++ b/macos/Ghostty-Info.plist
@@ -42,6 +42,8 @@
+ GhosttyBuild
+
GhosttyCommit
LSEnvironment
diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj
index d529e23c2..68322756b 100644
--- a/macos/Ghostty.xcodeproj/project.pbxproj
+++ b/macos/Ghostty.xcodeproj/project.pbxproj
@@ -39,6 +39,10 @@
A53D0C952B53B4D800305CE6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5B30538299BEAAB0047F10C /* Assets.xcassets */; };
A53D0C9B2B543F3B00305CE6 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; };
A53D0C9C2B543F7B00305CE6 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55B7BB729B6F53A0055DE60 /* Package.swift */; };
+ A54B0CE92D0CECD100CBEFF8 /* ColorizedGhosttyIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CE82D0CECD100CBEFF8 /* ColorizedGhosttyIconView.swift */; };
+ A54B0CEB2D0CFB4C00CBEFF8 /* NSImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CEA2D0CFB4A00CBEFF8 /* NSImage+Extension.swift */; };
+ A54B0CED2D0CFB7700CBEFF8 /* ColorizedGhosttyIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CEC2D0CFB7300CBEFF8 /* ColorizedGhosttyIcon.swift */; };
+ A54B0CEF2D0D2E2800CBEFF8 /* ColorizedGhosttyIconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CEE2D0D2E2400CBEFF8 /* ColorizedGhosttyIconImage.swift */; };
A54D786C2CA7978E001B19B1 /* BaseTerminalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */; };
A55685E029A03A9F004303CE /* AppError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55685DF29A03A9F004303CE /* AppError.swift */; };
A55B7BB829B6F53A0055DE60 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55B7BB729B6F53A0055DE60 /* Package.swift */; };
@@ -94,6 +98,8 @@
C159E89D2B69A2EF00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; };
C1F26EA72B738B9900404083 /* NSView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F26EA62B738B9900404083 /* NSView+Extension.swift */; };
C1F26EE92B76CBFC00404083 /* VibrantLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C1F26EE82B76CBFC00404083 /* VibrantLayer.m */; };
+ FC5218FA2D10FFCE004C93E0 /* zsh in Resources */ = {isa = PBXBuildFile; fileRef = FC5218F92D10FFC7004C93E0 /* zsh */; };
+ FC9ABA9C2D0F53F80020D4C8 /* bash-completion in Resources */ = {isa = PBXBuildFile; fileRef = FC9ABA9B2D0F538D0020D4C8 /* bash-completion */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -122,6 +128,10 @@
A53A6C022CCC1B7D00943E98 /* Ghostty.Action.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Action.swift; sourceTree = ""; };
A53D0C932B53B43700305CE6 /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; };
A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.App.swift; sourceTree = ""; };
+ A54B0CE82D0CECD100CBEFF8 /* ColorizedGhosttyIconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorizedGhosttyIconView.swift; sourceTree = ""; };
+ A54B0CEA2D0CFB4A00CBEFF8 /* NSImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSImage+Extension.swift"; sourceTree = ""; };
+ A54B0CEC2D0CFB7300CBEFF8 /* ColorizedGhosttyIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorizedGhosttyIcon.swift; sourceTree = ""; };
+ A54B0CEE2D0D2E2400CBEFF8 /* ColorizedGhosttyIconImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorizedGhosttyIconImage.swift; sourceTree = ""; };
A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTerminalController.swift; sourceTree = ""; };
A55685DF29A03A9F004303CE /* AppError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppError.swift; sourceTree = ""; };
A55B7BB729B6F53A0055DE60 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; };
@@ -180,6 +190,8 @@
C1F26EE72B76CBFC00404083 /* VibrantLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VibrantLayer.h; sourceTree = ""; };
C1F26EE82B76CBFC00404083 /* VibrantLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VibrantLayer.m; sourceTree = ""; };
C1F26EEA2B76CC2400404083 /* ghostty-bridging-header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ghostty-bridging-header.h"; sourceTree = ""; };
+ FC5218F92D10FFC7004C93E0 /* zsh */ = {isa = PBXFileReference; lastKnownFileType = folder; name = zsh; path = "../zig-out/share/zsh"; sourceTree = ""; };
+ FC9ABA9B2D0F538D0020D4C8 /* bash-completion */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "bash-completion"; path = "../zig-out/share/bash-completion"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -233,6 +245,7 @@
A57D79252C9C8782001D522E /* Secure Input */,
A534263E2A7DCC5800EBB7A2 /* Settings */,
A51BFC1C2B2FB5AB00E92F16 /* About */,
+ A54B0CE72D0CEC9800CBEFF8 /* Colorized Ghostty Icon */,
A51BFC292B30F69F00E92F16 /* Update */,
);
path = Features;
@@ -252,6 +265,7 @@
A5CBD0552C9E65A50017A1AE /* DraggableWindowView.swift */,
C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */,
A599CDAF2CF103F20049FA26 /* NSAppearance+Extension.swift */,
+ A54B0CEA2D0CFB4A00CBEFF8 /* NSImage+Extension.swift */,
A52FFF5C2CAB4D05000C6A5B /* NSScreen+Extension.swift */,
C1F26EA62B738B9900404083 /* NSView+Extension.swift */,
AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */,
@@ -303,6 +317,16 @@
path = macOS;
sourceTree = "";
};
+ A54B0CE72D0CEC9800CBEFF8 /* Colorized Ghostty Icon */ = {
+ isa = PBXGroup;
+ children = (
+ A54B0CEC2D0CFB7300CBEFF8 /* ColorizedGhosttyIcon.swift */,
+ A54B0CEE2D0D2E2400CBEFF8 /* ColorizedGhosttyIconImage.swift */,
+ A54B0CE82D0CECD100CBEFF8 /* ColorizedGhosttyIconView.swift */,
+ );
+ path = "Colorized Ghostty Icon";
+ sourceTree = "";
+ };
A54CD6ED299BEB14008C95BB /* Sources */ = {
isa = PBXGroup;
children = (
@@ -371,12 +395,14 @@
A5A1F8862A489D7400D1E8BC /* Resources */ = {
isa = PBXGroup;
children = (
+ FC9ABA9B2D0F538D0020D4C8 /* bash-completion */,
29C15B1C2CDC3B2000520DD4 /* bat */,
55154BDF2B33911F001622DC /* ghostty */,
552964E52B34A9B400030505 /* vim */,
A586167B2B7703CC009BDB1D /* fish */,
A5985CE52C33060F00C57AD3 /* man */,
A5A1F8842A489D6800D1E8BC /* terminfo */,
+ FC5218F92D10FFC7004C93E0 /* zsh */,
);
name = Resources;
sourceTree = "";
@@ -539,6 +565,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ FC9ABA9C2D0F53F80020D4C8 /* bash-completion in Resources */,
A5B30539299BEAAB0047F10C /* Assets.xcassets in Resources */,
A51BFC1E2B2FB5CE00E92F16 /* About.xib in Resources */,
A5E112932AF73E6E00C6E0C2 /* ClipboardConfirmation.xib in Resources */,
@@ -547,6 +574,7 @@
29C15B1D2CDC3B2900520DD4 /* bat in Resources */,
A596309A2AEE1C6400D64628 /* Terminal.xib in Resources */,
A586167C2B7703CC009BDB1D /* fish in Resources */,
+ FC5218FA2D10FFCE004C93E0 /* zsh in Resources */,
55154BE02B33911F001622DC /* ghostty in Resources */,
A5985CE62C33060F00C57AD3 /* man in Resources */,
A5A1F8852A489D6800D1E8BC /* terminfo in Resources */,
@@ -572,8 +600,10 @@
files = (
A59630A42AF059BB00D64628 /* Ghostty.SplitNode.swift in Sources */,
A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */,
+ A54B0CEB2D0CFB4C00CBEFF8 /* NSImage+Extension.swift in Sources */,
A54D786C2CA7978E001B19B1 /* BaseTerminalController.swift in Sources */,
A59FB5CF2AE0DB50009128F3 /* InspectorView.swift in Sources */,
+ A54B0CE92D0CECD100CBEFF8 /* ColorizedGhosttyIconView.swift in Sources */,
A5D0AF3D2B37804400D21823 /* CodableBridge.swift in Sources */,
A5D0AF3B2B36A1DE00D21823 /* TerminalRestorable.swift in Sources */,
C1F26EA72B738B9900404083 /* NSView+Extension.swift in Sources */,
@@ -612,6 +642,8 @@
A5CEAFDC29B8009000646FDA /* SplitView.swift in Sources */,
A5CDF1932AAF9E0800513312 /* ConfigurationErrorsController.swift in Sources */,
A53A6C032CCC1B7F00943E98 /* Ghostty.Action.swift in Sources */,
+ A54B0CED2D0CFB7700CBEFF8 /* ColorizedGhosttyIcon.swift in Sources */,
+ A54B0CEF2D0D2E2800CBEFF8 /* ColorizedGhosttyIconImage.swift in Sources */,
A59FB5D12AE0DEA7009128F3 /* MetalView.swift in Sources */,
A55685E029A03A9F004303CE /* AppError.swift in Sources */,
A599CDB02CF103F60049FA26 /* NSAppearance+Extension.swift in Sources */,
diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift
index ed257d9ec..b38a019f0 100644
--- a/macos/Sources/App/macOS/AppDelegate.swift
+++ b/macos/Sources/App/macOS/AppDelegate.swift
@@ -98,6 +98,13 @@ class AppDelegate: NSObject,
/// The observer for the app appearance.
private var appearanceObserver: NSKeyValueObservation? = nil
+ /// The custom app icon image that is currently in use.
+ @Published private(set) var appIcon: NSImage? = nil {
+ didSet {
+ NSApplication.shared.applicationIconImage = appIcon
+ }
+ }
+
override init() {
terminalManager = TerminalManager(ghostty)
updaterController = SPUStandardUpdaterController(
@@ -519,6 +526,22 @@ class AppDelegate: NSObject,
} else {
GlobalEventTap.shared.disable()
}
+
+ switch (config.macosIcon) {
+ case .official:
+ self.appIcon = nil
+ break
+
+ case .customStyle:
+ guard let ghostColor = config.macosIconGhostColor else { break }
+ guard let screenColors = config.macosIconScreenColor else { break }
+ guard let icon = ColorizedGhosttyIcon(
+ screenColors: screenColors,
+ ghostColor: ghostColor,
+ frame: config.macosIconFrame
+ ).makeImage() else { break }
+ self.appIcon = icon
+ }
}
/// Sync the appearance of our app with the theme specified in the config.
diff --git a/macos/Sources/Features/About/AboutView.swift b/macos/Sources/Features/About/AboutView.swift
index d9372aa15..6ed3285ed 100644
--- a/macos/Sources/Features/About/AboutView.swift
+++ b/macos/Sources/Features/About/AboutView.swift
@@ -4,6 +4,7 @@ struct AboutView: View {
@Environment(\.openURL) var openURL
private let githubURL = URL(string: "https://github.com/ghostty-org/ghostty")
+ private let docsURL = URL(string: "https://ghostty.org/docs")
/// Read the commit from the bundle.
private var build: String? { Bundle.main.infoDictionary?["CFBundleVersion"] as? String }
@@ -43,7 +44,7 @@ struct AboutView: View {
var body: some View {
VStack(alignment: .center) {
- Image("AppIconImage")
+ ghosttyIconImage()
.resizable()
.aspectRatio(contentMode: .fit)
.frame(height: 128)
@@ -77,12 +78,16 @@ struct AboutView: View {
.frame(maxWidth: .infinity)
HStack(spacing: 8) {
+ if let url = docsURL {
+ Button("Docs") {
+ openURL(url)
+ }
+ }
if let url = githubURL {
Button("GitHub") {
openURL(url)
}
}
-
}
if let copy = self.copyright {
diff --git a/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIcon.swift b/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIcon.swift
new file mode 100644
index 000000000..58de8f771
--- /dev/null
+++ b/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIcon.swift
@@ -0,0 +1,55 @@
+import Cocoa
+
+struct ColorizedGhosttyIcon {
+ /// The colors that make up the gradient of the screen.
+ let screenColors: [NSColor]
+
+ /// The color of the ghost.
+ let ghostColor: NSColor
+
+ /// The frame type to use
+ let frame: Ghostty.MacOSIconFrame
+
+ /// Make a custom colorized ghostty icon.
+ func makeImage() -> NSImage? {
+ // All of our layers (not in order)
+ guard let screen = NSImage(named: "CustomIconScreen") else { return nil }
+ guard let screenMask = NSImage(named: "CustomIconScreenMask") else { return nil }
+ guard let ghost = NSImage(named: "CustomIconGhost") else { return nil }
+ guard let crt = NSImage(named: "CustomIconCRT") else { return nil }
+ guard let gloss = NSImage(named: "CustomIconGloss") else { return nil }
+
+ let baseName = switch (frame) {
+ case .aluminum: "CustomIconBaseAluminum"
+ case .beige: "CustomIconBaseBeige"
+ case .chrome: "CustomIconBaseChrome"
+ case .plastic: "CustomIconBasePlastic"
+ }
+ guard let base = NSImage(named: baseName) else { return nil }
+
+ // Apply our color in various ways to our layers.
+ // NOTE: These functions are not built-in, they're implemented as an extension
+ // to NSImage in NSImage+Extension.swift.
+ guard let screenGradient = screenMask.gradient(colors: screenColors) else { return nil }
+ guard let tintedGhost = ghost.tint(color: ghostColor) else { return nil }
+
+ // Combine our layers using the proper blending modes
+ return.combine(images: [
+ base,
+ screen,
+ screenGradient,
+ ghost,
+ tintedGhost,
+ crt,
+ gloss,
+ ], blendingModes: [
+ .normal,
+ .normal,
+ .color,
+ .normal,
+ .color,
+ .overlay,
+ .normal,
+ ])
+ }
+}
diff --git a/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIconImage.swift b/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIconImage.swift
new file mode 100644
index 000000000..4d522067e
--- /dev/null
+++ b/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIconImage.swift
@@ -0,0 +1,15 @@
+import SwiftUI
+
+extension View {
+ /// Returns the ghostty icon to use for views.
+ func ghosttyIconImage() -> Image {
+ #if os(macOS)
+ if let delegate = NSApplication.shared.delegate as? AppDelegate,
+ let nsImage = delegate.appIcon {
+ return Image(nsImage: nsImage)
+ }
+ #endif
+
+ return Image("AppIconImage")
+ }
+}
diff --git a/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIconView.swift b/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIconView.swift
new file mode 100644
index 000000000..8fbebfdc8
--- /dev/null
+++ b/macos/Sources/Features/Colorized Ghostty Icon/ColorizedGhosttyIconView.swift
@@ -0,0 +1,13 @@
+import SwiftUI
+import Cocoa
+
+// For testing.
+struct ColorizedGhosttyIconView: View {
+ var body: some View {
+ Image(nsImage: ColorizedGhosttyIcon(
+ screenColors: [.purple, .blue],
+ ghostColor: .yellow,
+ frame: .aluminum
+ ).makeImage()!)
+ }
+}
diff --git a/macos/Sources/Features/Update/UpdateDelegate.swift b/macos/Sources/Features/Update/UpdateDelegate.swift
index d010ddf2f..4699ba14a 100644
--- a/macos/Sources/Features/Update/UpdateDelegate.swift
+++ b/macos/Sources/Features/Update/UpdateDelegate.swift
@@ -3,11 +3,17 @@ import Cocoa
class UpdaterDelegate: NSObject, SPUUpdaterDelegate {
func feedURLString(for updater: SPUUpdater) -> String? {
- // Eventually w want to support multiple channels. Sparkle itself supports
- // channels but we probably don't want some appcasts in the same file (i.e.
- // tip) so this would be the place to change that. For now, we hardcode the
- // tip appcast URL since it is all we support.
- return "https://tip.files.ghostty.dev/appcast.xml"
+ guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else {
+ return nil
+ }
+
+ // Sparkle supports a native concept of "channels" but it requires that
+ // you share a single appcast file. We don't want to do that so we
+ // do this instead.
+ switch (appDelegate.ghostty.config.autoUpdateChannel) {
+ case .tip: return "https://tip.files.ghostty.org/appcast.xml"
+ case .stable: return "https://release.files.ghostty.org/appcast.xml"
+ }
}
func updaterWillRelaunchApplication(_ updater: SPUUpdater) {
diff --git a/macos/Sources/Ghostty/Ghostty.Config.swift b/macos/Sources/Ghostty/Ghostty.Config.swift
index 3a58455d9..af76ca2c3 100644
--- a/macos/Sources/Ghostty/Ghostty.Config.swift
+++ b/macos/Sources/Ghostty/Ghostty.Config.swift
@@ -252,6 +252,46 @@ extension Ghostty {
return v
}
+ var macosIcon: MacOSIcon {
+ let defaultValue = MacOSIcon.official
+ guard let config = self.config else { return defaultValue }
+ var v: UnsafePointer? = nil
+ let key = "macos-icon"
+ guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return defaultValue }
+ guard let ptr = v else { return defaultValue }
+ let str = String(cString: ptr)
+ return MacOSIcon(rawValue: str) ?? defaultValue
+ }
+
+ var macosIconFrame: MacOSIconFrame {
+ let defaultValue = MacOSIconFrame.aluminum
+ guard let config = self.config else { return defaultValue }
+ var v: UnsafePointer? = nil
+ let key = "macos-icon-frame"
+ guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return defaultValue }
+ guard let ptr = v else { return defaultValue }
+ let str = String(cString: ptr)
+ return MacOSIconFrame(rawValue: str) ?? defaultValue
+ }
+
+ var macosIconGhostColor: OSColor? {
+ guard let config = self.config else { return nil }
+ var v: ghostty_config_color_s = .init()
+ let key = "macos-icon-ghost-color"
+ guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return nil }
+ return .init(ghostty: v)
+ }
+
+ var macosIconScreenColor: [OSColor]? {
+ guard let config = self.config else { return nil }
+ var v: ghostty_config_color_list_s = .init()
+ let key = "macos-icon-screen-color"
+ guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return nil }
+ guard v.len > 0 else { return nil }
+ let buffer = UnsafeBufferPointer(start: v.colors, count: v.len)
+ return buffer.map { .init(ghostty: $0) }
+ }
+
var focusFollowsMouse : Bool {
guard let config = self.config else { return false }
var v = false;
@@ -261,9 +301,9 @@ extension Ghostty {
}
var backgroundColor: Color {
- var rgb: UInt32 = 0
+ var color: ghostty_config_color_s = .init();
let bg_key = "background"
- if (!ghostty_config_get(config, &rgb, bg_key, UInt(bg_key.count))) {
+ if (!ghostty_config_get(config, &color, bg_key, UInt(bg_key.count))) {
#if os(macOS)
return Color(NSColor.windowBackgroundColor)
#elseif os(iOS)
@@ -273,14 +313,10 @@ extension Ghostty {
#endif
}
- let red = Double(rgb & 0xff)
- let green = Double((rgb >> 8) & 0xff)
- let blue = Double((rgb >> 16) & 0xff)
-
- return Color(
- red: red / 255,
- green: green / 255,
- blue: blue / 255
+ return .init(
+ red: Double(color.r) / 255,
+ green: Double(color.g) / 255,
+ blue: Double(color.b) / 255
)
}
@@ -311,21 +347,17 @@ extension Ghostty {
var unfocusedSplitFill: Color {
guard let config = self.config else { return .white }
- var rgb: UInt32 = 16777215 // white default
+ var color: ghostty_config_color_s = .init();
let key = "unfocused-split-fill"
- if (!ghostty_config_get(config, &rgb, key, UInt(key.count))) {
+ if (!ghostty_config_get(config, &color, key, UInt(key.count))) {
let bg_key = "background"
- _ = ghostty_config_get(config, &rgb, bg_key, UInt(bg_key.count));
+ _ = ghostty_config_get(config, &color, bg_key, UInt(bg_key.count));
}
- let red = Double(rgb & 0xff)
- let green = Double((rgb >> 8) & 0xff)
- let blue = Double((rgb >> 16) & 0xff)
-
- return Color(
- red: red / 255,
- green: green / 255,
- blue: blue / 255
+ return .init(
+ red: Double(color.r),
+ green: Double(color.g) / 255,
+ blue: Double(color.b) / 255
)
}
@@ -408,6 +440,17 @@ extension Ghostty {
return AutoUpdate(rawValue: str) ?? defaultValue
}
+ var autoUpdateChannel: AutoUpdateChannel {
+ let defaultValue = AutoUpdateChannel.stable
+ guard let config = self.config else { return defaultValue }
+ var v: UnsafePointer? = nil
+ let key = "auto-update-channel"
+ guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return defaultValue }
+ guard let ptr = v else { return defaultValue }
+ let str = String(cString: ptr)
+ return AutoUpdateChannel(rawValue: str) ?? defaultValue
+ }
+
var autoSecureInput: Bool {
guard let config = self.config else { return true }
var v = false;
diff --git a/macos/Sources/Ghostty/Package.swift b/macos/Sources/Ghostty/Package.swift
index a4d1914e0..65f928443 100644
--- a/macos/Sources/Ghostty/Package.swift
+++ b/macos/Sources/Ghostty/Package.swift
@@ -194,13 +194,32 @@ extension Ghostty {
}
}
}
-
+
+ /// macos-icon
+ enum MacOSIcon: String {
+ case official
+ case customStyle = "custom-style"
+ }
+
+ /// macos-icon-frame
+ enum MacOSIconFrame: String {
+ case aluminum
+ case beige
+ case plastic
+ case chrome
+ }
+
/// Enum for the macos-titlebar-proxy-icon config option
enum MacOSTitlebarProxyIcon: String {
case visible
case hidden
}
-
+
+ /// Enum for auto-update-channel config option
+ enum AutoUpdateChannel: String {
+ case tip
+ case stable
+ }
}
// MARK: Surface Notification
diff --git a/macos/Sources/Helpers/NSImage+Extension.swift b/macos/Sources/Helpers/NSImage+Extension.swift
new file mode 100644
index 000000000..670148e27
--- /dev/null
+++ b/macos/Sources/Helpers/NSImage+Extension.swift
@@ -0,0 +1,90 @@
+import Cocoa
+
+extension NSImage {
+ /// Combine multiple images with the given blend modes. This is useful given a set
+ /// of layers to create a final rasterized image.
+ static func combine(images: [NSImage], blendingModes: [CGBlendMode]) -> NSImage? {
+ guard images.count == blendingModes.count else { return nil }
+ guard images.count > 0 else { return nil }
+
+ // The final size will be the same size as our first image.
+ let size = images.first!.size
+
+ // Create a bitmap context manually
+ guard let bitmapContext = CGContext(
+ data: nil,
+ width: Int(size.width),
+ height: Int(size.height),
+ bitsPerComponent: 8,
+ bytesPerRow: 0,
+ space: CGColorSpaceCreateDeviceRGB(),
+ bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue
+ ) else { return nil }
+
+ // Clear the context
+ bitmapContext.setFillColor(.clear)
+ bitmapContext.fill(.init(origin: .zero, size: size))
+
+ // Draw each image with its corresponding blend mode
+ for (index, image) in images.enumerated() {
+ guard let cgImage = image.cgImage(
+ forProposedRect: nil,
+ context: nil,
+ hints: nil
+ ) else { return nil }
+
+ let blendMode = blendingModes[index]
+ bitmapContext.setBlendMode(blendMode)
+ bitmapContext.draw(cgImage, in: CGRect(origin: .zero, size: size))
+ }
+
+ // Create a CGImage from the context
+ guard let combinedCGImage = bitmapContext.makeImage() else { return nil }
+
+ // Wrap the CGImage in an NSImage
+ return NSImage(cgImage: combinedCGImage, size: size)
+ }
+
+ /// Apply a gradient onto this image, using this image as a mask.
+ func gradient(colors: [NSColor]) -> NSImage? {
+ let resultImage = NSImage(size: size)
+ resultImage.lockFocus()
+ defer { resultImage.unlockFocus() }
+
+ // Draw the gradient
+ guard let gradient = NSGradient(colors: colors) else { return nil }
+ gradient.draw(in: .init(origin: .zero, size: size), angle: 90)
+
+ // Apply the mask
+ draw(at: .zero, from: .zero, operation: .destinationIn, fraction: 1.0)
+
+ return resultImage
+ }
+
+ // Tint an NSImage with the given color by applying a basic fill on top of it.
+ func tint(color: NSColor) -> NSImage? {
+ // Create a new image with the same size as the base image
+ let newImage = NSImage(size: size)
+
+ // Draw into the new image
+ newImage.lockFocus()
+ defer { newImage.unlockFocus() }
+
+ // Set up the drawing context
+ guard let context = NSGraphicsContext.current?.cgContext else { return nil }
+ defer { context.restoreGState() }
+
+ // Draw the base image
+ guard let cgImage = cgImage(forProposedRect: nil, context: nil, hints: nil) else { return nil }
+ context.draw(cgImage, in: .init(origin: .zero, size: size))
+
+ // Set the tint color and blend mode
+ context.setFillColor(color.cgColor)
+ context.setBlendMode(.sourceAtop)
+
+ // Apply the tint color over the entire image
+ context.fill(.init(origin: .zero, size: size))
+
+ return newImage
+ }
+}
diff --git a/macos/Sources/Helpers/OSColor+Extension.swift b/macos/Sources/Helpers/OSColor+Extension.swift
index 2d08e1cd2..54b3e1fab 100644
--- a/macos/Sources/Helpers/OSColor+Extension.swift
+++ b/macos/Sources/Helpers/OSColor+Extension.swift
@@ -1,4 +1,5 @@
import Foundation
+import GhosttyKit
extension OSColor {
var isLightColor: Bool {
@@ -47,6 +48,37 @@ extension OSColor {
#endif
}
+ /// Create an OSColor from a hex string.
+ convenience init?(hex: String) {
+ var cleanedHex = hex.trimmingCharacters(in: .whitespacesAndNewlines)
+
+ // Remove `#` if present
+ if cleanedHex.hasPrefix("#") {
+ cleanedHex.removeFirst()
+ }
+
+ guard cleanedHex.count == 6 || cleanedHex.count == 8 else { return nil }
+
+ let scanner = Scanner(string: cleanedHex)
+ var hexNumber: UInt64 = 0
+ guard scanner.scanHexInt64(&hexNumber) else { return nil }
+
+ let red, green, blue, alpha: CGFloat
+ if cleanedHex.count == 8 {
+ alpha = CGFloat((hexNumber & 0xFF000000) >> 24) / 255
+ red = CGFloat((hexNumber & 0x00FF0000) >> 16) / 255
+ green = CGFloat((hexNumber & 0x0000FF00) >> 8) / 255
+ blue = CGFloat(hexNumber & 0x000000FF) / 255
+ } else { // 6 characters
+ alpha = 1.0
+ red = CGFloat((hexNumber & 0xFF0000) >> 16) / 255
+ green = CGFloat((hexNumber & 0x00FF00) >> 8) / 255
+ blue = CGFloat(hexNumber & 0x0000FF) / 255
+ }
+
+ self.init(red: red, green: green, blue: blue, alpha: alpha)
+ }
+
func darken(by amount: CGFloat) -> OSColor {
var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
self.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
@@ -58,3 +90,15 @@ extension OSColor {
)
}
}
+
+// MARK: Ghostty Types
+
+extension OSColor {
+ /// Create a color from a Ghostty color.
+ convenience init(ghostty: ghostty_config_color_s) {
+ let red = Double(ghostty.r) / 255
+ let green = Double(ghostty.g) / 255
+ let blue = Double(ghostty.b) / 255
+ self.init(red: red, green: green, blue: blue, alpha: 1)
+ }
+}
diff --git a/nix/devShell.nix b/nix/devShell.nix
index b2502d92d..5e86427fe 100644
--- a/nix/devShell.nix
+++ b/nix/devShell.nix
@@ -31,7 +31,7 @@
glslang,
gtk4,
libadwaita,
- gnome,
+ adwaita-icon-theme,
hicolor-icon-theme,
harfbuzz,
libpng,
@@ -165,7 +165,7 @@ in
# is available (namely icons).
# Minimal subset of env set by wrapGAppsHook4 for icons and global settings
- export XDG_DATA_DIRS=$XDG_DATA_DIRS:${hicolor-icon-theme}/share:${gnome.adwaita-icon-theme}/share
+ export XDG_DATA_DIRS=$XDG_DATA_DIRS:${hicolor-icon-theme}/share:${adwaita-icon-theme}/share
export XDG_DATA_DIRS=$XDG_DATA_DIRS:$GSETTINGS_SCHEMAS_PATH # from glib setup hook
'')
+ (lib.optionalString stdenv.hostPlatform.isDarwin ''
diff --git a/nix/package.nix b/nix/package.nix
index 889eb978f..27dd29003 100644
--- a/nix/package.nix
+++ b/nix/package.nix
@@ -157,7 +157,7 @@ in
chmod u+rwX -R $ZIG_GLOBAL_CACHE_DIR
'';
- outputs = ["out" "terminfo" "shell_integration"];
+ outputs = ["out" "terminfo" "shell_integration" "vim"];
postInstall = ''
terminfo_src=${
@@ -177,6 +177,8 @@ in
mv "$out/share/ghostty/shell-integration" "$shell_integration/shell-integration"
ln -sf "$shell_integration/shell-integration" "$out/share/ghostty/shell-integration"
echo "$shell_integration" >> "$out/nix-support/propagated-user-env-packages"
+
+ cp -r $out/share/vim/vimfiles "$vim"
'';
postFixup = ''
diff --git a/nix/zigCacheHash.nix b/nix/zigCacheHash.nix
index 81ee3c5a1..0eebdee76 100644
--- a/nix/zigCacheHash.nix
+++ b/nix/zigCacheHash.nix
@@ -1,3 +1,3 @@
# This file is auto-generated! check build-support/check-zig-cache-hash.sh for
# more details.
-"sha256-q9UDVryP50HfeeafgnrOd+D6K+cEy33/05K2TB5qiqw="
+"sha256-vP8f8KQyM4CwKlw7Esmxv1q4ANu8pDXXsnVorgpWCr4="
diff --git a/pkg/fontconfig/build.zig.zon b/pkg/fontconfig/build.zig.zon
index 3cb6b82db..36b51288b 100644
--- a/pkg/fontconfig/build.zig.zon
+++ b/pkg/fontconfig/build.zig.zon
@@ -3,7 +3,7 @@
.version = "2.14.2",
.dependencies = .{
.fontconfig = .{
- .url = "https://deps.files.ghostty.dev/fontconfig-2.14.2.tar.gz",
+ .url = "https://deps.files.ghostty.org/fontconfig-2.14.2.tar.gz",
.hash = "12201149afb3326c56c05bb0a577f54f76ac20deece63aa2f5cd6ff31a4fa4fcb3b7",
},
diff --git a/pkg/macos/text/font.zig b/pkg/macos/text/font.zig
index 67a303018..6423d82ea 100644
--- a/pkg/macos/text/font.zig
+++ b/pkg/macos/text/font.zig
@@ -217,6 +217,10 @@ pub const FontOrientation = enum(c_uint) {
pub const FontTableTag = enum(u32) {
svg = c.kCTFontTableSVG,
+ os2 = c.kCTFontTableOS2,
+ head = c.kCTFontTableHead,
+ hhea = c.kCTFontTableHhea,
+ post = c.kCTFontTablePost,
_,
pub fn init(v: *const [4]u8) FontTableTag {
diff --git a/src/Surface.zig b/src/Surface.zig
index 9fc5b1d90..1442af869 100644
--- a/src/Surface.zig
+++ b/src/Surface.zig
@@ -3298,9 +3298,10 @@ pub fn cursorPosCallback(
// No mouse point so we don't highlight links
self.renderer_state.mouse.point = null;
- self.renderer_state.terminal.screen.dirty.hyperlink_hover = true;
- return;
+ // Mark the link's row as dirty, but continue with updating the
+ // mouse state below so we can scroll when our position is negative.
+ self.renderer_state.terminal.screen.dirty.hyperlink_hover = true;
}
// Always show the mouse again if it is hidden
diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig
index 23265c101..0f6a14c8c 100644
--- a/src/apprt/gtk/Window.zig
+++ b/src/apprt/gtk/Window.zig
@@ -23,6 +23,7 @@ const c = @import("c.zig").c;
const adwaita = @import("adwaita.zig");
const gtk_key = @import("key.zig");
const Notebook = @import("notebook.zig").Notebook;
+const HeaderBar = @import("headerbar.zig").HeaderBar;
const version = @import("version.zig");
const log = std.log.scoped(.gtk);
@@ -35,7 +36,7 @@ window: *c.GtkWindow,
/// The header bar for the window. This is possibly null since it can be
/// disabled using gtk-titlebar. This is either an AdwHeaderBar or
/// GtkHeaderBar depending on if adw is enabled and linked.
-header: ?*c.GtkWidget,
+header: ?HeaderBar,
/// The tab overview for the window. This is possibly null since there is no
/// taboverview without a AdwApplicationWindow (libadwaita >= 1.4.0).
@@ -120,9 +121,13 @@ pub fn init(self: *Window, app: *App) !void {
// Create our box which will hold our widgets in the main content area.
const box = c.gtk_box_new(c.GTK_ORIENTATION_VERTICAL, 0);
+ // Setup our notebook
+ self.notebook = Notebook.create(self);
+
// If we are using an AdwWindow then we can support the tab overview.
self.tab_overview = if (self.isAdwWindow()) overview: {
const tab_overview = c.adw_tab_overview_new();
+ c.adw_tab_overview_set_view(@ptrCast(tab_overview), self.notebook.adw_tab_view);
c.adw_tab_overview_set_enable_new_tab(@ptrCast(tab_overview), 1);
_ = c.g_signal_connect_data(
tab_overview,
@@ -149,49 +154,53 @@ pub fn init(self: *Window, app: *App) !void {
// are decorated or not because we can have a keybind to toggle the
// decorations.
if (app.config.@"gtk-titlebar") {
- const header: *c.GtkWidget = if (self.isAdwWindow())
- @ptrCast(c.adw_header_bar_new())
- else
- @ptrCast(c.gtk_header_bar_new());
+ const header = HeaderBar.init(self);
{
const btn = c.gtk_menu_button_new();
c.gtk_widget_set_tooltip_text(btn, "Main Menu");
c.gtk_menu_button_set_icon_name(@ptrCast(btn), "open-menu-symbolic");
c.gtk_menu_button_set_menu_model(@ptrCast(btn), @ptrCast(@alignCast(app.menu)));
- if (self.isAdwWindow()) {
- if (comptime !adwaita.versionAtLeast(1, 4, 0)) unreachable;
- c.adw_header_bar_pack_end(@ptrCast(header), btn);
- } else c.gtk_header_bar_pack_end(@ptrCast(header), btn);
+ header.packEnd(btn);
}
// If we're using an AdwWindow then we can support the tab overview.
if (self.tab_overview) |tab_overview| {
if (comptime !adwaita.versionAtLeast(1, 4, 0)) unreachable;
assert(self.isAdwWindow());
+ const btn = switch (app.config.@"gtk-tabs-location") {
+ .top, .bottom, .left, .right => btn: {
+ const btn = c.gtk_toggle_button_new();
+ c.gtk_widget_set_tooltip_text(btn, "View Open Tabs");
+ c.gtk_button_set_icon_name(@ptrCast(btn), "view-grid-symbolic");
+ _ = c.g_object_bind_property(
+ btn,
+ "active",
+ tab_overview,
+ "open",
+ c.G_BINDING_BIDIRECTIONAL | c.G_BINDING_SYNC_CREATE,
+ );
+
+ break :btn btn;
+ },
+
+ .hidden => btn: {
+ const btn = c.adw_tab_button_new();
+ c.adw_tab_button_set_view(@ptrCast(btn), self.notebook.adw_tab_view);
+ c.gtk_actionable_set_action_name(@ptrCast(btn), "overview.open");
+ break :btn btn;
+ },
+ };
- const btn = c.gtk_toggle_button_new();
- c.gtk_widget_set_tooltip_text(btn, "Show Open Tabs");
- c.gtk_button_set_icon_name(@ptrCast(btn), "view-grid-symbolic");
c.gtk_widget_set_focus_on_click(btn, c.FALSE);
- c.adw_header_bar_pack_end(@ptrCast(header), btn);
- _ = c.g_object_bind_property(
- btn,
- "active",
- tab_overview,
- "open",
- c.G_BINDING_BIDIRECTIONAL | c.G_BINDING_SYNC_CREATE,
- );
+ header.packEnd(btn);
}
{
const btn = c.gtk_button_new_from_icon_name("tab-new-symbolic");
c.gtk_widget_set_tooltip_text(btn, "New Tab");
_ = c.g_signal_connect_data(btn, "clicked", c.G_CALLBACK(>kTabNewClick), self, null, c.G_CONNECT_DEFAULT);
- if (self.isAdwWindow())
- c.adw_header_bar_pack_end(@ptrCast(header), btn)
- else
- c.gtk_header_bar_pack_end(@ptrCast(header), btn);
+ header.packEnd(btn);
}
self.header = header;
@@ -225,9 +234,6 @@ pub fn init(self: *Window, app: *App) !void {
c.gtk_box_append(@ptrCast(box), warning_box);
}
- // Setup our notebook
- self.notebook = Notebook.create(self);
-
// Setup our toast overlay if we have one
self.toast_overlay = if (adwaita.enabled(&self.app.config)) toast: {
const toast_overlay = c.adw_toast_overlay_new();
@@ -277,18 +283,22 @@ pub fn init(self: *Window, app: *App) !void {
if (comptime !adwaita.versionAtLeast(1, 4, 0)) unreachable;
const toolbar_view: *c.AdwToolbarView = @ptrCast(c.adw_toolbar_view_new());
- const header_widget: *c.GtkWidget = @ptrCast(@alignCast(self.header.?));
+ const header_widget: *c.GtkWidget = self.header.?.asWidget();
c.adw_toolbar_view_add_top_bar(toolbar_view, header_widget);
- const tab_bar = c.adw_tab_bar_new();
- c.adw_tab_bar_set_view(tab_bar, self.notebook.adw_tab_view);
- if (!app.config.@"gtk-wide-tabs") c.adw_tab_bar_set_expand_tabs(tab_bar, 0);
+ if (self.app.config.@"gtk-tabs-location" != .hidden) {
+ const tab_bar = c.adw_tab_bar_new();
+ c.adw_tab_bar_set_view(tab_bar, self.notebook.adw_tab_view);
- const tab_bar_widget: *c.GtkWidget = @ptrCast(@alignCast(tab_bar));
- switch (self.app.config.@"gtk-tabs-location") {
- // left and right is not supported in libadwaita.
- .top, .left, .right => c.adw_toolbar_view_add_top_bar(toolbar_view, tab_bar_widget),
- .bottom => c.adw_toolbar_view_add_bottom_bar(toolbar_view, tab_bar_widget),
+ if (!app.config.@"gtk-wide-tabs") c.adw_tab_bar_set_expand_tabs(tab_bar, 0);
+
+ const tab_bar_widget: *c.GtkWidget = @ptrCast(@alignCast(tab_bar));
+ switch (self.app.config.@"gtk-tabs-location") {
+ // left and right are not supported in libadwaita.
+ .top, .left, .right => c.adw_toolbar_view_add_top_bar(toolbar_view, tab_bar_widget),
+ .bottom => c.adw_toolbar_view_add_bottom_bar(toolbar_view, tab_bar_widget),
+ .hidden => unreachable,
+ }
}
c.adw_toolbar_view_set_content(toolbar_view, box);
@@ -322,15 +332,16 @@ pub fn init(self: *Window, app: *App) !void {
@ptrCast(@alignCast(toolbar_view)),
);
}
- } else {
+ } else tab_bar: {
switch (self.notebook) {
.adw_tab_view => |tab_view| if (comptime adwaita.versionAtLeast(0, 0, 0)) {
+ if (app.config.@"gtk-tabs-location" == .hidden) break :tab_bar;
+
// In earlier adwaita versions, we need to add the tabbar manually since we do not use
// an AdwToolbarView.
const tab_bar: *c.AdwTabBar = c.adw_tab_bar_new().?;
c.gtk_widget_add_css_class(@ptrCast(@alignCast(tab_bar)), "inline");
switch (app.config.@"gtk-tabs-location") {
- // left and right is not supported in libadwaita.
.top,
.left,
.right,
@@ -343,12 +354,11 @@ pub fn init(self: *Window, app: *App) !void {
@ptrCast(box),
@ptrCast(@alignCast(tab_bar)),
),
+ .hidden => unreachable,
}
c.adw_tab_bar_set_view(tab_bar, tab_view);
- if (!app.config.@"gtk-wide-tabs") {
- c.adw_tab_bar_set_expand_tabs(tab_bar, 0);
- }
+ if (!app.config.@"gtk-wide-tabs") c.adw_tab_bar_set_expand_tabs(tab_bar, 0);
},
.gtk_notebook => {},
@@ -356,7 +366,7 @@ pub fn init(self: *Window, app: *App) !void {
// The box is our main child
c.gtk_window_set_child(gtk_window, box);
- if (self.header) |h| c.gtk_window_set_titlebar(gtk_window, @ptrCast(@alignCast(h)));
+ if (self.header) |h| c.gtk_window_set_titlebar(gtk_window, h.asWidget());
}
// Show the window
@@ -507,7 +517,7 @@ pub fn toggleWindowDecorations(self: *Window) void {
// and hides it with decorations, but libadwaita doesn't. This makes it
// explicit.
if (self.header) |v| {
- const widget: *c.GtkWidget = @alignCast(@ptrCast(v));
+ const widget = v.asWidget();
c.gtk_widget_set_visible(widget, @intFromBool(new_decorated));
}
}
diff --git a/src/apprt/gtk/headerbar.zig b/src/apprt/gtk/headerbar.zig
new file mode 100644
index 000000000..b1567ce27
--- /dev/null
+++ b/src/apprt/gtk/headerbar.zig
@@ -0,0 +1,69 @@
+const std = @import("std");
+const c = @import("c.zig").c;
+
+const Window = @import("Window.zig");
+const adwaita = @import("adwaita.zig");
+
+const AdwHeaderBar = if (adwaita.versionAtLeast(0, 0, 0)) c.AdwHeaderBar else void;
+
+pub const HeaderBar = union(enum) {
+ adw: *AdwHeaderBar,
+ gtk: *c.GtkHeaderBar,
+
+ pub fn init(window: *Window) HeaderBar {
+ if ((comptime adwaita.versionAtLeast(1, 4, 0)) and
+ adwaita.enabled(&window.app.config))
+ {
+ return initAdw();
+ }
+
+ return initGtk();
+ }
+
+ fn initAdw() HeaderBar {
+ const headerbar = c.adw_header_bar_new();
+ return .{ .adw = @ptrCast(headerbar) };
+ }
+
+ fn initGtk() HeaderBar {
+ const headerbar = c.gtk_header_bar_new();
+ return .{ .gtk = @ptrCast(headerbar) };
+ }
+
+ pub fn asWidget(self: HeaderBar) *c.GtkWidget {
+ return switch (self) {
+ .adw => |headerbar| @ptrCast(@alignCast(headerbar)),
+ .gtk => |headerbar| @ptrCast(@alignCast(headerbar)),
+ };
+ }
+
+ pub fn packEnd(self: HeaderBar, widget: *c.GtkWidget) void {
+ switch (self) {
+ .adw => |headerbar| if (comptime adwaita.versionAtLeast(0, 0, 0)) {
+ c.adw_header_bar_pack_end(
+ @ptrCast(@alignCast(headerbar)),
+ widget,
+ );
+ },
+ .gtk => |headerbar| c.gtk_header_bar_pack_end(
+ @ptrCast(@alignCast(headerbar)),
+ widget,
+ ),
+ }
+ }
+
+ pub fn packStart(self: HeaderBar, widget: *c.GtkWidget) void {
+ switch (self) {
+ .adw => |headerbar| if (comptime adwaita.versionAtLeast(0, 0, 0)) {
+ c.adw_header_bar_pack_start(
+ @ptrCast(@alignCast(headerbar)),
+ widget,
+ );
+ },
+ .gtk => |headerbar| c.gtk_header_bar_pack_start(
+ @ptrCast(@alignCast(headerbar)),
+ widget,
+ ),
+ }
+ }
+};
diff --git a/src/apprt/gtk/notebook.zig b/src/apprt/gtk/notebook.zig
index 73213e9da..5faebd788 100644
--- a/src/apprt/gtk/notebook.zig
+++ b/src/apprt/gtk/notebook.zig
@@ -29,7 +29,7 @@ pub const Notebook = union(enum) {
const notebook_widget: *c.GtkWidget = c.gtk_notebook_new();
const notebook: *c.GtkNotebook = @ptrCast(notebook_widget);
const notebook_tab_pos: c_uint = switch (app.config.@"gtk-tabs-location") {
- .top => c.GTK_POS_TOP,
+ .top, .hidden => c.GTK_POS_TOP,
.bottom => c.GTK_POS_BOTTOM,
.left => c.GTK_POS_LEFT,
.right => c.GTK_POS_RIGHT,
diff --git a/src/build/bash_completions.zig b/src/build/bash_completions.zig
new file mode 100644
index 000000000..6649bcb01
--- /dev/null
+++ b/src/build/bash_completions.zig
@@ -0,0 +1,338 @@
+const std = @import("std");
+
+const Config = @import("../config/Config.zig");
+const Action = @import("../cli/action.zig").Action;
+
+/// A bash completions configuration that contains all the available commands
+/// and options.
+///
+/// Notes: bash completion support for --= depends on setting the completion
+/// system to _not_ print a space following each successful completion (see -o nospace).
+/// This results leading or tailing spaces being necessary to move onto the next match.
+///
+/// bash completion will read = as it's own completiong word regardless of whether or not
+/// it's part of an on going completion like --=. Working around this requires looking
+/// backward in the command line args to pretend the = is an empty string
+/// see: https://www.gnu.org/software/gnuastro/manual/html_node/Bash-TAB-completion-tutorial.html
+pub const bash_completions = comptimeGenerateBashCompletions();
+
+fn comptimeGenerateBashCompletions() []const u8 {
+ comptime {
+ @setEvalBranchQuota(50000);
+ var counter = std.io.countingWriter(std.io.null_writer);
+ try writeBashCompletions(&counter.writer());
+
+ var buf: [counter.bytes_written]u8 = undefined;
+ var stream = std.io.fixedBufferStream(&buf);
+ try writeBashCompletions(stream.writer());
+ const final = buf;
+ return final[0..stream.getWritten().len];
+ }
+}
+
+fn writeBashCompletions(writer: anytype) !void {
+ const pad1 = " ";
+ const pad2 = pad1 ++ pad1;
+ const pad3 = pad2 ++ pad1;
+ const pad4 = pad3 ++ pad1;
+ const pad5 = pad4 ++ pad1;
+
+ try writer.writeAll(
+ \\_ghostty() {
+ \\
+ \\ # -o nospace requires we add back a space when a completion is finished
+ \\ # and not part of a --key= completion
+ \\ _add_spaces() {
+ \\ for idx in "${!COMPREPLY[@]}"; do
+ \\ [ -n "${COMPREPLY[idx]}" ] && COMPREPLY[idx]="${COMPREPLY[idx]} ";
+ \\ done
+ \\ }
+ \\
+ \\ _fonts() {
+ \\ local IFS=$'\n'
+ \\ mapfile -t COMPREPLY < <( compgen -P '"' -S '"' -W "$($ghostty +list-fonts | grep '^[A-Z]' )" -- "$cur")
+ \\ }
+ \\
+ \\ _themes() {
+ \\ local IFS=$'\n'
+ \\ mapfile -t COMPREPLY < <( compgen -P '"' -S '"' -W "$($ghostty +list-themes | sed -E 's/^(.*) \(.*$/\1/')" -- "$cur")
+ \\ }
+ \\
+ \\ _files() {
+ \\ mapfile -t COMPREPLY < <( compgen -o filenames -f -- "$cur" )
+ \\ for i in "${!COMPREPLY[@]}"; do
+ \\ if [[ -d "${COMPREPLY[i]}" ]]; then
+ \\ COMPREPLY[i]="${COMPREPLY[i]}/";
+ \\ fi
+ \\ if [[ -f "${COMPREPLY[i]}" ]]; then
+ \\ COMPREPLY[i]="${COMPREPLY[i]} ";
+ \\ fi
+ \\ done
+ \\ }
+ \\
+ \\ _dirs() {
+ \\ mapfile -t COMPREPLY < <( compgen -o dirnames -d -- "$cur" )
+ \\ for i in "${!COMPREPLY[@]}"; do
+ \\ if [[ -d "${COMPREPLY[i]}" ]]; then
+ \\ COMPREPLY[i]="${COMPREPLY[i]}/";
+ \\ fi
+ \\ done
+ \\ if [[ "${#COMPREPLY[@]}" == 0 && -d "$cur" ]]; then
+ \\ COMPREPLY=( "$cur " )
+ \\ fi
+ \\ }
+ \\
+ \\ _handle_config() {
+ \\ local config="--help"
+ \\ config+=" --version"
+ \\
+ );
+
+ for (@typeInfo(Config).Struct.fields) |field| {
+ if (field.name[0] == '_') continue;
+ switch (field.type) {
+ bool, ?bool => try writer.writeAll(pad2 ++ "config+=\" '--" ++ field.name ++ " '\"\n"),
+ else => try writer.writeAll(pad2 ++ "config+=\" --" ++ field.name ++ "=\"\n"),
+ }
+ }
+
+ try writer.writeAll(
+ \\
+ \\ case "$prev" in
+ \\
+ );
+
+ for (@typeInfo(Config).Struct.fields) |field| {
+ if (field.name[0] == '_') continue;
+ try writer.writeAll(pad3 ++ "--" ++ field.name ++ ") ");
+
+ if (std.mem.startsWith(u8, field.name, "font-family"))
+ try writer.writeAll("_fonts ;;")
+ else if (std.mem.eql(u8, "theme", field.name))
+ try writer.writeAll("_themes ;;")
+ else if (std.mem.eql(u8, "working-directory", field.name))
+ try writer.writeAll("_dirs ;;")
+ else if (field.type == Config.RepeatablePath)
+ try writer.writeAll("_files ;;")
+ else {
+ const compgenPrefix = "mapfile -t COMPREPLY < <( compgen -W \"";
+ const compgenSuffix = "\" -- \"$cur\" ); _add_spaces ;;";
+ switch (@typeInfo(field.type)) {
+ .Bool => try writer.writeAll("return ;;"),
+ .Enum => |info| {
+ try writer.writeAll(compgenPrefix);
+ for (info.fields, 0..) |f, i| {
+ if (i > 0) try writer.writeAll(" ");
+ try writer.writeAll(f.name);
+ }
+ try writer.writeAll(compgenSuffix);
+ },
+ .Struct => |info| {
+ if (!@hasDecl(field.type, "parseCLI") and info.layout == .@"packed") {
+ try writer.writeAll(compgenPrefix);
+ for (info.fields, 0..) |f, i| {
+ if (i > 0) try writer.writeAll(" ");
+ try writer.writeAll(f.name ++ " no-" ++ f.name);
+ }
+ try writer.writeAll(compgenSuffix);
+ } else {
+ try writer.writeAll("return ;;");
+ }
+ },
+ else => try writer.writeAll("return ;;"),
+ }
+ }
+
+ try writer.writeAll("\n");
+ }
+
+ try writer.writeAll(
+ \\ *) mapfile -t COMPREPLY < <( compgen -W "$config" -- "$cur" ) ;;
+ \\ esac
+ \\
+ \\ return 0
+ \\ }
+ \\
+ \\ _handle_actions() {
+ \\
+ );
+
+ for (@typeInfo(Action).Enum.fields) |field| {
+ if (std.mem.eql(u8, "help", field.name)) continue;
+ if (std.mem.eql(u8, "version", field.name)) continue;
+
+ const options = @field(Action, field.name).options();
+ // assumes options will never be created with only <_name> members
+ if (@typeInfo(options).Struct.fields.len == 0) continue;
+
+ var buffer: [field.name.len]u8 = undefined;
+ const bashName: []u8 = buffer[0..field.name.len];
+ @memcpy(bashName, field.name);
+
+ std.mem.replaceScalar(u8, bashName, '-', '_');
+ try writer.writeAll(pad2 ++ "local " ++ bashName ++ "=\"");
+
+ {
+ var count = 0;
+ for (@typeInfo(options).Struct.fields) |opt| {
+ if (opt.name[0] == '_') continue;
+ if (count > 0) try writer.writeAll(" ");
+ switch (opt.type) {
+ bool, ?bool => try writer.writeAll("'--" ++ opt.name ++ " '"),
+ else => try writer.writeAll("--" ++ opt.name ++ "="),
+ }
+ count += 1;
+ }
+ }
+ try writer.writeAll(" --help\"\n");
+ }
+
+ try writer.writeAll(
+ \\
+ \\ case "${COMP_WORDS[1]}" in
+ \\
+ );
+
+ for (@typeInfo(Action).Enum.fields) |field| {
+ if (std.mem.eql(u8, "help", field.name)) continue;
+ if (std.mem.eql(u8, "version", field.name)) continue;
+
+ const options = @field(Action, field.name).options();
+ if (@typeInfo(options).Struct.fields.len == 0) continue;
+
+ // bash doesn't allow variable names containing '-' so replace them
+ var buffer: [field.name.len]u8 = undefined;
+ const bashName: []u8 = buffer[0..field.name.len];
+ _ = std.mem.replace(u8, field.name, "-", "_", bashName);
+
+ try writer.writeAll(pad3 ++ "+" ++ field.name ++ ")\n");
+ try writer.writeAll(pad4 ++ "case $prev in\n");
+ for (@typeInfo(options).Struct.fields) |opt| {
+ if (opt.name[0] == '_') continue;
+
+ try writer.writeAll(pad5 ++ "--" ++ opt.name ++ ") ");
+
+ const compgenPrefix = "mapfile -t COMPREPLY < <( compgen -W \"";
+ const compgenSuffix = "\" -- \"$cur\" ); _add_spaces ;;";
+ switch (@typeInfo(opt.type)) {
+ .Bool => try writer.writeAll("return ;;"),
+ .Enum => |info| {
+ try writer.writeAll(compgenPrefix);
+ for (info.fields, 0..) |f, i| {
+ if (i > 0) try writer.writeAll(" ");
+ try writer.writeAll(f.name);
+ }
+ try writer.writeAll(compgenSuffix);
+ },
+ .Optional => |optional| {
+ switch (@typeInfo(optional.child)) {
+ .Enum => |info| {
+ try writer.writeAll(compgenPrefix);
+ for (info.fields, 0..) |f, i| {
+ if (i > 0) try writer.writeAll(" ");
+ try writer.writeAll(f.name);
+ }
+ try writer.writeAll(compgenSuffix);
+ },
+ else => {
+ if (std.mem.eql(u8, "config-file", opt.name)) {
+ try writer.writeAll("return ;;");
+ } else try writer.writeAll("return;;");
+ },
+ }
+ },
+ else => {
+ if (std.mem.eql(u8, "config-file", opt.name)) {
+ try writer.writeAll("_files ;;");
+ } else try writer.writeAll("return;;");
+ },
+ }
+ try writer.writeAll("\n");
+ }
+ try writer.writeAll(pad5 ++ "*) mapfile -t COMPREPLY < <( compgen -W \"$" ++ bashName ++ "\" -- \"$cur\" ) ;;\n");
+ try writer.writeAll(
+ \\ esac
+ \\ ;;
+ \\
+ );
+ }
+
+ try writer.writeAll(
+ \\ *) mapfile -t COMPREPLY < <( compgen -W "--help" -- "$cur" ) ;;
+ \\ esac
+ \\
+ \\ return 0
+ \\ }
+ \\
+ \\ # begin main logic
+ \\ local topLevel="-e"
+ \\ topLevel+=" --help"
+ \\ topLevel+=" --version"
+ \\
+ );
+
+ for (@typeInfo(Action).Enum.fields) |field| {
+ if (std.mem.eql(u8, "help", field.name)) continue;
+ if (std.mem.eql(u8, "version", field.name)) continue;
+
+ try writer.writeAll(pad1 ++ "topLevel+=\" +" ++ field.name ++ "\"\n");
+ }
+
+ try writer.writeAll(
+ \\
+ \\ local cur=""; local prev=""; local prevWasEq=false; COMPREPLY=()
+ \\ local ghostty="$1"
+ \\
+ \\ # script assumes default COMP_WORDBREAKS of roughly $' \t\n"\'><=;|&(:'
+ \\ # if = is missing this script will degrade to matching on keys only.
+ \\ # eg: --key=
+ \\ # this can be improved if needed see: https://github.com/ghostty-org/ghostty/discussions/2994
+ \\
+ \\ if [ "$2" = "=" ]; then cur=""
+ \\ else cur="$2"
+ \\ fi
+ \\
+ \\ if [ "$3" = "=" ]; then prev="${COMP_WORDS[COMP_CWORD-2]}"; prevWasEq=true;
+ \\ else prev="${COMP_WORDS[COMP_CWORD-1]}"
+ \\ fi
+ \\
+ \\ # current completion is double quoted add a space so the curor progresses
+ \\ if [[ "$2" == \"*\" ]]; then
+ \\ COMPREPLY=( "$cur " );
+ \\ return;
+ \\ fi
+ \\
+ \\ case "$COMP_CWORD" in
+ \\ 1)
+ \\ case "${COMP_WORDS[1]}" in
+ \\ -e | --help | --version) return 0 ;;
+ \\ --*) _handle_config ;;
+ \\ *) mapfile -t COMPREPLY < <( compgen -W "${topLevel}" -- "$cur" ); _add_spaces ;;
+ \\ esac
+ \\ ;;
+ \\ *)
+ \\ case "$prev" in
+ \\ -e | --help | --version) return 0 ;;
+ \\ *)
+ \\ if [[ "=" != "${COMP_WORDS[COMP_CWORD]}" && $prevWasEq != true ]]; then
+ \\ # must be completing with a space after the key eg: '-- '
+ \\ # clear out prev so we don't run any of the key specific completions
+ \\ prev=""
+ \\ fi
+ \\
+ \\ case "${COMP_WORDS[1]}" in
+ \\ --*) _handle_config ;;
+ \\ +*) _handle_actions ;;
+ \\ esac
+ \\ ;;
+ \\ esac
+ \\ ;;
+ \\ esac
+ \\
+ \\ return 0
+ \\}
+ \\
+ \\complete -o nospace -o bashdefault -F _ghostty ghostty
+ \\
+ );
+}
diff --git a/src/build/fish_completions.zig b/src/build/fish_completions.zig
index 049ff06be..a06199256 100644
--- a/src/build/fish_completions.zig
+++ b/src/build/fish_completions.zig
@@ -117,12 +117,25 @@ fn writeFishCompletions(writer: anytype) !void {
.Bool => try writer.writeAll(" -a \"true false\""),
.Enum => |info| {
try writer.writeAll(" -a \"");
- for (info.opts, 0..) |f, i| {
+ for (info.fields, 0..) |f, i| {
if (i > 0) try writer.writeAll(" ");
try writer.writeAll(f.name);
}
try writer.writeAll("\"");
},
+ .Optional => |optional| {
+ switch (@typeInfo(optional.child)) {
+ .Enum => |info| {
+ try writer.writeAll(" -a \"");
+ for (info.fields, 0..) |f, i| {
+ if (i > 0) try writer.writeAll(" ");
+ try writer.writeAll(f.name);
+ }
+ try writer.writeAll("\"");
+ },
+ else => {},
+ }
+ },
else => {},
}
try writer.writeAll("\n");
diff --git a/src/build/webgen/main_actions.zig b/src/build/webgen/main_actions.zig
new file mode 100644
index 000000000..587851003
--- /dev/null
+++ b/src/build/webgen/main_actions.zig
@@ -0,0 +1,46 @@
+const std = @import("std");
+const help_strings = @import("help_strings");
+const KeybindAction = @import("../../input/Binding.zig").Action;
+
+pub fn main() !void {
+ const output = std.io.getStdOut().writer();
+ try genKeybindActions(output);
+}
+
+pub fn genKeybindActions(writer: anytype) !void {
+ // Write the header
+ try writer.writeAll(
+ \\---
+ \\title: Keybinding Action Reference
+ \\description: Reference of all Ghostty keybinding actions.
+ \\---
+ \\
+ \\This is a reference of all Ghostty keybinding actions.
+ \\
+ \\
+ );
+
+ @setEvalBranchQuota(5_000);
+ const fields = @typeInfo(KeybindAction).Union.fields;
+ inline for (fields) |field| {
+ if (field.name[0] == '_') continue;
+
+ // Write the field name.
+ try writer.writeAll("## `");
+ try writer.writeAll(field.name);
+ try writer.writeAll("`\n");
+
+ if (@hasDecl(help_strings.KeybindAction, field.name)) {
+ var iter = std.mem.splitScalar(
+ u8,
+ @field(help_strings.KeybindAction, field.name),
+ '\n',
+ );
+ while (iter.next()) |s| {
+ try writer.writeAll(s);
+ try writer.writeAll("\n");
+ }
+ try writer.writeAll("\n\n");
+ }
+ }
+}
diff --git a/src/build/webgen/main_config.zig b/src/build/webgen/main_config.zig
new file mode 100644
index 000000000..842d17bf9
--- /dev/null
+++ b/src/build/webgen/main_config.zig
@@ -0,0 +1,131 @@
+const std = @import("std");
+const Config = @import("../../config/Config.zig");
+const help_strings = @import("help_strings");
+
+pub fn main() !void {
+ const output = std.io.getStdOut().writer();
+ try genConfig(output);
+}
+
+pub fn genConfig(writer: anytype) !void {
+ // Write the header
+ try writer.writeAll(
+ \\---
+ \\title: Reference
+ \\description: Reference of all Ghostty configuration options.
+ \\---
+ \\
+ \\This is a reference of all Ghostty configuration options. These
+ \\options are ordered roughly by how common they are to be used
+ \\and grouped with related options. I recommend utilizing your
+ \\browser's search functionality to find the option you're looking
+ \\for.
+ \\
+ \\In the future, we'll have a more user-friendly way to view and
+ \\organize these options.
+ \\
+ \\
+ );
+
+ @setEvalBranchQuota(50_000);
+ const fields = @typeInfo(Config).Struct.fields;
+ inline for (fields, 0..) |field, i| {
+ if (field.name[0] == '_') continue;
+ if (!@hasDecl(help_strings.Config, field.name)) continue;
+
+ // Write the field name.
+ try writer.writeAll("## `");
+ try writer.writeAll(field.name);
+ try writer.writeAll("`\n");
+
+ // For all subsequent fields with no docs, they are grouped
+ // with the previous field.
+ if (i + 1 < fields.len) {
+ inline for (fields[i + 1 ..]) |next_field| {
+ if (next_field.name[0] == '_') break;
+ if (@hasDecl(help_strings.Config, next_field.name)) break;
+
+ try writer.writeAll("## `");
+ try writer.writeAll(next_field.name);
+ try writer.writeAll("`\n");
+ }
+ }
+
+ // Newline after our headers
+ try writer.writeAll("\n");
+
+ var iter = std.mem.splitScalar(
+ u8,
+ @field(help_strings.Config, field.name),
+ '\n',
+ );
+
+ // We do some really rough markdown "parsing" here so that
+ // we can fix up some styles for what our website expects.
+ var block: ?enum {
+ /// Plaintext, do nothing.
+ text,
+
+ /// Code block, wrap in triple backticks. We use indented
+ /// code blocks in our comments but the website parser only
+ /// supports triple backticks.
+ code,
+
+ /// Callouts. We detect these based on paragraphs starting
+ /// with "Note:", "Warning:", etc. (case-insensitive).
+ callout_note,
+ callout_warning,
+ } = null;
+
+ while (iter.next()) |s| {
+ // Empty line resets our block
+ if (std.mem.eql(u8, s, "")) {
+ try endBlock(writer, block);
+ block = null;
+
+ try writer.writeAll("\n");
+ continue;
+ }
+
+ // If we don't have a block figure out our type.
+ const first: bool = block == null;
+ if (block == null) {
+ if (std.mem.startsWith(u8, s, " ")) {
+ block = .code;
+ try writer.writeAll("```\n");
+ } else if (std.ascii.startsWithIgnoreCase(s, "note:")) {
+ block = .callout_note;
+ try writer.writeAll("\n");
+ } else if (std.ascii.startsWithIgnoreCase(s, "warning:")) {
+ block = .callout_warning;
+ try writer.writeAll("\n");
+ } else {
+ block = .text;
+ }
+ }
+
+ try writer.writeAll(switch (block.?) {
+ .text => s,
+ .callout_note => if (first) s["note:".len..] else s,
+ .callout_warning => if (first) s["warning:".len..] else s,
+
+ .code => if (std.mem.startsWith(u8, s, " "))
+ s[4..]
+ else
+ s,
+ });
+ try writer.writeAll("\n");
+ }
+ try endBlock(writer, block);
+ try writer.writeAll("\n");
+ }
+}
+
+fn endBlock(writer: anytype, block: anytype) !void {
+ if (block) |v| switch (v) {
+ .text => {},
+ .code => try writer.writeAll("```\n"),
+ .callout_note => try writer.writeAll("\n"),
+ .callout_warning => try writer.writeAll("\n"),
+ };
+}
diff --git a/src/build/zsh_completions.zig b/src/build/zsh_completions.zig
index 6a4e88a66..a451c7175 100644
--- a/src/build/zsh_completions.zig
+++ b/src/build/zsh_completions.zig
@@ -9,7 +9,7 @@ pub const zsh_completions = comptimeGenerateZshCompletions();
fn comptimeGenerateZshCompletions() []const u8 {
comptime {
- @setEvalBranchQuota(19000);
+ @setEvalBranchQuota(50000);
var counter = std.io.countingWriter(std.io.null_writer);
try writeZshCompletions(&counter.writer());
@@ -175,12 +175,29 @@ fn writeZshCompletions(writer: anytype) !void {
.Bool => try writer.writeAll("(true false)"),
.Enum => |info| {
try writer.writeAll("(");
- for (info.opts, 0..) |f, i| {
+ for (info.fields, 0..) |f, i| {
if (i > 0) try writer.writeAll(" ");
try writer.writeAll(f.name);
}
try writer.writeAll(")");
},
+ .Optional => |optional| {
+ switch (@typeInfo(optional.child)) {
+ .Enum => |info| {
+ try writer.writeAll("(");
+ for (info.fields, 0..) |f, i| {
+ if (i > 0) try writer.writeAll(" ");
+ try writer.writeAll(f.name);
+ }
+ try writer.writeAll(")");
+ },
+ else => {
+ if (std.mem.eql(u8, "config-file", opt.name)) {
+ try writer.writeAll("_files");
+ } else try writer.writeAll("( )");
+ },
+ }
+ },
else => {
if (std.mem.eql(u8, "config-file", opt.name)) {
try writer.writeAll("_files");
diff --git a/src/build_config.zig b/src/build_config.zig
index 1448f9de5..1f3b35e03 100644
--- a/src/build_config.zig
+++ b/src/build_config.zig
@@ -58,6 +58,15 @@ pub const BuildConfig = struct {
"{}",
.{self.version},
));
+ step.addOption(
+ ReleaseChannel,
+ "release_channel",
+ channel: {
+ const pre = self.version.pre orelse break :channel .stable;
+ if (pre.len == 0) break :channel .stable;
+ break :channel .tip;
+ },
+ );
}
/// Rehydrate our BuildConfig from the comptime options. Note that not all
@@ -82,6 +91,9 @@ pub const BuildConfig = struct {
pub const version = options.app_version;
pub const version_string = options.app_version_string;
+/// The release channel for this build.
+pub const release_channel = std.meta.stringToEnum(ReleaseChannel, @tagName(options.release_channel)).?;
+
/// The optimization mode as a string.
pub const mode_string = mode: {
const m = @tagName(builtin.mode);
@@ -172,9 +184,20 @@ pub const ExeEntrypoint = enum {
helpgen,
mdgen_ghostty_1,
mdgen_ghostty_5,
+ webgen_config,
+ webgen_actions,
bench_parser,
bench_stream,
bench_codepoint_width,
bench_grapheme_break,
bench_page_init,
};
+
+/// The release channel for the build.
+pub const ReleaseChannel = enum {
+ /// Unstable builds on every commit.
+ tip,
+
+ /// Stable tagged releases.
+ stable,
+};
diff --git a/src/cli/version.zig b/src/cli/version.zig
index 259cb7453..b781398f2 100644
--- a/src/cli/version.zig
+++ b/src/cli/version.zig
@@ -25,6 +25,10 @@ pub fn run(alloc: Allocator) !u8 {
try stdout.print("Ghostty {s}\n\n", .{build_config.version_string});
if (tty) try stdout.print("\x1b]8;;\x1b\\", .{});
+ try stdout.print("Version\n", .{});
+ try stdout.print(" - version: {s}\n", .{build_config.version_string});
+ try stdout.print(" - channel: {s}\n", .{@tagName(build_config.release_channel)});
+
try stdout.print("Build Config\n", .{});
try stdout.print(" - Zig version: {s}\n", .{builtin.zig_version_string});
try stdout.print(" - build mode : {}\n", .{builtin.mode});
diff --git a/src/config/Config.zig b/src/config/Config.zig
index 0da9f6c6e..41ddd175f 100644
--- a/src/config/Config.zig
+++ b/src/config/Config.zig
@@ -12,6 +12,7 @@ const Config = @This();
const std = @import("std");
const builtin = @import("builtin");
+const build_config = @import("../build_config.zig");
const assert = std.debug.assert;
const Allocator = std.mem.Allocator;
const ArenaAllocator = std.heap.ArenaAllocator;
@@ -138,7 +139,7 @@ const c = @cImport({
/// requested style, then the font will be used as-is since the style is
/// not synthetic.
///
-/// Warning! An easy mistake is to disable `bold` or `italic` but not
+/// Warning: An easy mistake is to disable `bold` or `italic` but not
/// `bold-italic`. Disabling only `bold` or `italic` will NOT disable either
/// in the `bold-italic` style. If you want to disable `bold-italic`, you must
/// explicitly disable it. You cannot partially disable `bold-italic`.
@@ -255,12 +256,28 @@ const c = @cImport({
/// that things like status lines continue to look aligned.
@"adjust-cell-width": ?MetricModifier = null,
@"adjust-cell-height": ?MetricModifier = null,
+/// Distance in pixels from the bottom of the cell to the text baseline.
+/// Increase to move baseline UP, decrease to move baseline DOWN.
@"adjust-font-baseline": ?MetricModifier = null,
+/// Distance in pixels from the top of the cell to the top of the underline.
+/// Increase to move underline DOWN, decrease to move underline UP.
@"adjust-underline-position": ?MetricModifier = null,
+/// Thickness in pixels of the underline.
@"adjust-underline-thickness": ?MetricModifier = null,
+/// Distance in pixels from the top of the cell to the top of the strikethrough.
+/// Increase to move strikethrough DOWN, decrease to move underline UP.
@"adjust-strikethrough-position": ?MetricModifier = null,
+/// Thickness in pixels of the strikethrough.
@"adjust-strikethrough-thickness": ?MetricModifier = null,
+/// Distance in pixels from the top of the cell to the top of the overline.
+/// Increase to move overline DOWN, decrease to move underline UP.
+@"adjust-overline-position": ?MetricModifier = null,
+/// Thickness in pixels of the overline.
+@"adjust-overline-thickness": ?MetricModifier = null,
+/// Thickness in pixels of the bar cursor and outlined rect cursor.
@"adjust-cursor-thickness": ?MetricModifier = null,
+/// Thickness in pixels of box drawing characters.
+@"adjust-box-thickness": ?MetricModifier = null,
/// The method to use for calculating the cell width of a grapheme cluster.
/// The default value is `unicode` which uses the Unicode standard to determine
@@ -270,16 +287,16 @@ const c = @cImport({
///
/// Valid values are:
///
-/// * `legacy` - Use a legacy method to determine grapheme width, such as
-/// wcswidth This maximizes compatibility with legacy programs but may result
-/// in incorrect grapheme width for certain graphemes such as skin-tone
-/// emoji, non-English characters, etc.
+/// * `legacy` - Use a legacy method to determine grapheme width, such as
+/// wcswidth This maximizes compatibility with legacy programs but may result
+/// in incorrect grapheme width for certain graphemes such as skin-tone
+/// emoji, non-English characters, etc.
///
-/// This is called "legacy" and not something more specific because the
-/// behavior is undefined and we want to retain the ability to modify it.
-/// For example, we may or may not use libc `wcswidth` now or in the future.
+/// This is called "legacy" and not something more specific because the
+/// behavior is undefined and we want to retain the ability to modify it.
+/// For example, we may or may not use libc `wcswidth` now or in the future.
///
-/// * `unicode` - Use the Unicode standard to determine grapheme width.
+/// * `unicode` - Use the Unicode standard to determine grapheme width.
///
/// If a running program explicitly enables terminal mode 2027, then `unicode`
/// width will be forced regardless of this configuration. When mode 2027 is
@@ -602,6 +619,16 @@ command: ?[]const u8 = null,
/// process will exit when the command exits. Additionally, the
/// `quit-after-last-window-closed-delay` is unset.
///
+/// * `shell-integration=detect` (if not `none`) - This prevents forcibly
+/// injecting any configured shell integration into the command's
+/// environment. With `-e` its highly unlikely that you're executing a
+/// shell and forced shell integration is likely to cause problems
+/// (i.e. by wrapping your command in a shell, setting env vars, etc.).
+/// This is a safety measure to prevent unexpected behavior. If you want
+/// shell integration with a `-e`-executed command, you must either
+/// name your binary appopriately or source the shell integration script
+/// manually.
+///
@"initial-command": ?[]const u8 = null,
/// If true, keep the terminal open after the command exits. Normally, the
@@ -677,6 +704,11 @@ fullscreen: bool = false,
/// window to be this title at all times and Ghostty will ignore any set title
/// escape sequences programs (such as Neovim) may send.
///
+/// If you want a blank title, set this to one or more spaces by quoting
+/// the value. For example, `title = " "`. This effectively hides the title.
+/// This is necessary because setting a blank value resets the title to the
+/// default value of the running program.
+///
/// This configuration can be reloaded at runtime. If it is set, the title
/// will update for all windows. If it is unset, the next title change escape
/// sequence will be honored but previous changes will not retroactively
@@ -754,7 +786,7 @@ class: ?[:0]const u8 = null,
/// or the alias. When debugging keybinds, the non-aliased modifier will always
/// be used in output.
///
-/// Note that the fn or "globe" key on keyboards are not supported as a
+/// Note: The fn or "globe" key on keyboards are not supported as a
/// modifier. This is a limitation of the operating systems and GUI toolkits
/// that Ghostty uses.
///
@@ -765,7 +797,7 @@ class: ?[:0]const u8 = null,
/// is sometimes called a leader key, a key chord, a key table, etc. There
/// is no hardcoded limit on the number of parts in a sequence.
///
-/// Warning: if you define a sequence as a CLI argument to `ghostty`,
+/// Warning: If you define a sequence as a CLI argument to `ghostty`,
/// you probably have to quote the keybind since `>` is a special character
/// in most shells. Example: ghostty --keybind='ctrl+a>n=new_window'
///
@@ -854,7 +886,7 @@ class: ?[:0]const u8 = null,
/// Since they are not associated with a specific terminal surface,
/// they're never encoded.
///
-/// Keybind trigger are not unique per prefix combination. For example,
+/// Keybind triggers are not unique per prefix combination. For example,
/// `ctrl+a` and `global:ctrl+a` are not two separate keybinds. The keybind
/// set later will overwrite the keybind set earlier. In this case, the
/// `global:` keybind will be used.
@@ -863,7 +895,7 @@ class: ?[:0]const u8 = null,
/// `global:unconsumed:ctrl+a=reload_config` will make the keybind global
/// and not consume the input to reload the config.
///
-/// A note on `global:`: this feature is only supported on macOS. On macOS,
+/// Note: `global:` is only supported on macOS. On macOS,
/// this feature requires accessibility permissions to be granted to Ghostty.
/// When a `global:` keybind is specified and Ghostty is launched or reloaded,
/// Ghostty will attempt to request these permissions. If the permissions are
@@ -977,7 +1009,7 @@ keybind: Keybinds = .{},
/// * `false` - windows won't have native decorations, i.e. titlebar and
/// borders. On macOS this also disables tabs and tab overview.
///
-/// The "toggle_window_decoration" keybind action can be used to create
+/// The "toggle_window_decorations" keybind action can be used to create
/// a keybinding to toggle this setting at runtime.
///
/// Changing this configuration in your configuration and reloading will
@@ -1192,7 +1224,7 @@ keybind: Keybinds = .{},
@"clipboard-paste-bracketed-safe": bool = true,
/// The total amount of bytes that can be used for image data (i.e. the Kitty
-/// image protocol) per terminal scren. The maximum value is 4,294,967,295
+/// image protocol) per terminal screen. The maximum value is 4,294,967,295
/// (4GiB). The default is 320MB. If this is set to zero, then all image
/// protocols will be disabled.
///
@@ -1445,7 +1477,7 @@ keybind: Keybinds = .{},
/// Custom shaders to run after the default shaders. This is a file path
/// to a GLSL-syntax shader for all platforms.
///
-/// WARNING: Invalid shaders can cause Ghostty to become unusable such as by
+/// Warning: Invalid shaders can cause Ghostty to become unusable such as by
/// causing the window to be completely black. If this happens, you can
/// unset this configuration to disable the shader.
///
@@ -1643,6 +1675,73 @@ keybind: Keybinds = .{},
/// you may want to disable it.
@"macos-secure-input-indication": bool = true,
+/// Customize the macOS app icon.
+///
+/// This only affects the icon that appears in the dock, application
+/// switcher, etc. This does not affect the icon in Finder because
+/// that is controlled by a hardcoded value in the signed application
+/// bundle and can't be changed at runtime. For more details on what
+/// exactly is affected, see the `NSApplication.icon` Apple documentation;
+/// that is the API that is being used to set the icon.
+///
+/// Valid values:
+///
+/// * `official` - Use the official Ghostty icon.
+/// * `custom-style` - Use the official Ghostty icon but with custom
+/// styles applied to various layers. The custom styles must be
+/// specified using the additional `macos-icon`-prefixed configurations.
+/// The `macos-icon-ghost-color` and `macos-icon-screen-color`
+/// configurations are required for this style.
+///
+/// WARNING: The `custom-style` option is _experimental_. We may change
+/// the format of the custom styles in the future. We're still finalizing
+/// the exact layers and customization options that will be available.
+///
+/// Other caveats:
+///
+/// * The icon in the update dialog will always be the official icon.
+/// This is because the update dialog is managed through a
+/// separate framework and cannot be customized without significant
+/// effort.
+///
+@"macos-icon": MacAppIcon = .official,
+
+/// The material to use for the frame of the macOS app icon.
+///
+/// Valid values:
+///
+/// * `aluminum` - A brushed aluminum frame. This is the default.
+/// * `beige` - A classic 90's computer beige frame.
+/// * `plastic` - A glossy, dark plastic frame.
+/// * `chrome` - A shiny chrome frame.
+///
+/// This only has an effect when `macos-icon` is set to `custom-style`.
+@"macos-icon-frame": MacAppIconFrame = .aluminum,
+
+/// The color of the ghost in the macOS app icon.
+///
+/// The format of the color is the same as the `background` configuration;
+/// see that for more information.
+///
+/// Note: This configuration is required when `macos-icon` is set to
+/// `custom-style`.
+///
+/// This only has an effect when `macos-icon` is set to `custom-style`.
+@"macos-icon-ghost-color": ?Color = null,
+
+/// The color of the screen in the macOS app icon.
+///
+/// The screen is a gradient so you can specify multiple colors that
+/// make up the gradient. Colors should be separated by commas. The
+/// format of the color is the same as the `background` configuration;
+/// see that for more information.
+///
+/// Note: This configuration is required when `macos-icon` is set to
+/// `custom-style`.
+///
+/// This only has an effect when `macos-icon` is set to `custom-style`.
+@"macos-icon-screen-color": ?ColorList = null,
+
/// Put every surface (tab, split, window) into a dedicated Linux cgroup.
///
/// This makes it so that resource management can be done on a per-surface
@@ -1696,7 +1795,7 @@ keybind: Keybinds = .{},
/// If this is true, then any cgroup initialization failure will cause
/// Ghostty to exit or new surfaces to not be created.
///
-/// Note: this currently only affects cgroup initialization. Subprocesses
+/// Note: This currently only affects cgroup initialization. Subprocesses
/// must always be able to move themselves into an isolated cgroup.
@"linux-cgroup-hard-fail": bool = false,
@@ -1727,10 +1826,17 @@ keybind: Keybinds = .{},
@"gtk-titlebar": bool = true,
/// Determines the side of the screen that the GTK tab bar will stick to.
-/// Top, bottom, left, and right are supported. The default is top.
+/// Top, bottom, left, right, and hidden are supported. The default is top.
///
/// If this option has value `left` or `right` when using Adwaita, it falls
-/// back to `top`.
+/// back to `top`. `hidden`, meaning that tabs don't exist, is not supported
+/// without using Adwaita, falling back to `top`.
+///
+/// When `hidden` is set and Adwaita is enabled, a tab button displaying the
+/// number of tabs will appear in the title bar. It has the ability to open a
+/// tab overview for displaying tabs. Alternatively, you can use the
+/// `toggle_tab_overview` action in a keybind if your window doesn't have a
+/// title bar, or you can switch tabs with keybinds.
@"gtk-tabs-location": GtkTabsLocation = .top,
/// Determines the appearance of the top and bottom bars when using the
@@ -1810,6 +1916,28 @@ term: []const u8 = "xterm-ghostty",
/// Changing this value at runtime works after a small delay.
@"auto-update": AutoUpdate = .check,
+/// The release channel to use for auto-updates.
+///
+/// The default value of this matches the release channel of the currently
+/// running Ghostty version. If you download a pre-release version of Ghostty
+/// then this will be set to `tip` and you will receive pre-release updates.
+/// If you download a stable version of Ghostty then this will be set to
+/// `stable` and you will receive stable updates.
+///
+/// Valid values are:
+///
+/// * `stable` - Stable, tagged releases such as "1.0.0".
+/// * `tip` - Pre-release versions generated from each commit to the
+/// main branch. This is the version that was in use during private
+/// beta testing by thousands of people. It is generally stable but
+/// will likely have more bugs than the stable channel.
+///
+/// Changing this configuration requires a full restart of
+/// Ghostty to take effect.
+///
+/// This only works on macOS since only macOS has an auto-update feature.
+@"auto-update-channel": ?build_config.ReleaseChannel = null,
+
/// This is set by the CLI parser for deinit.
_arena: ?ArenaAllocator = null,
@@ -3036,6 +3164,12 @@ pub fn finalize(self: *Config) !void {
);
}
}
+
+ // We can't set this as a struct default because our config is
+ // loaded in environments where a build config isn't available.
+ if (self.@"auto-update-channel" == null) {
+ self.@"auto-update-channel" = build_config.release_channel;
+ }
}
/// Callback for src/cli/args.zig to allow us to handle special cases
@@ -3082,6 +3216,9 @@ pub fn parseManuallyHook(
self.@"gtk-single-instance" = .false;
self.@"quit-after-last-window-closed" = true;
self.@"quit-after-last-window-closed-delay" = null;
+ if (self.@"shell-integration" != .none) {
+ self.@"shell-integration" = .detect;
+ }
// Do not continue, we consumed everything.
return false;
@@ -3473,11 +3610,22 @@ pub const WindowPaddingColor = enum {
///
/// This is a packed struct so that the C API to read color values just
/// works by setting it to a C integer.
-pub const Color = packed struct(u24) {
+pub const Color = struct {
r: u8,
g: u8,
b: u8,
+ /// ghostty_config_color_s
+ pub const C = extern struct {
+ r: u8,
+ g: u8,
+ b: u8,
+ };
+
+ pub fn cval(self: Color) Color.C {
+ return .{ .r = self.r, .g = self.g, .b = self.b };
+ }
+
/// Convert this to the terminal RGB struct
pub fn toTerminalRGB(self: Color) terminal.color.RGB {
return .{ .r = self.r, .g = self.g, .b = self.b };
@@ -3510,14 +3658,19 @@ pub const Color = packed struct(u24) {
var buf: [128]u8 = undefined;
try formatter.formatEntry(
[]const u8,
- std.fmt.bufPrint(
- &buf,
- "#{x:0>2}{x:0>2}{x:0>2}",
- .{ self.r, self.g, self.b },
- ) catch return error.OutOfMemory,
+ try self.formatBuf(&buf),
);
}
+ /// Format the color as a string.
+ pub fn formatBuf(self: Color, buf: []u8) Allocator.Error![]const u8 {
+ return std.fmt.bufPrint(
+ buf,
+ "#{x:0>2}{x:0>2}{x:0>2}",
+ .{ self.r, self.g, self.b },
+ ) catch error.OutOfMemory;
+ }
+
/// fromHex parses a color from a hex value such as #RRGGBB. The "#"
/// is optional.
pub fn fromHex(input: []const u8) !Color {
@@ -3570,6 +3723,133 @@ pub const Color = packed struct(u24) {
}
};
+pub const ColorList = struct {
+ const Self = @This();
+
+ colors: std.ArrayListUnmanaged(Color) = .{},
+ colors_c: std.ArrayListUnmanaged(Color.C) = .{},
+
+ /// ghostty_config_color_list_s
+ pub const C = extern struct {
+ colors: [*]Color.C,
+ len: usize,
+ };
+
+ pub fn cval(self: *const Self) C {
+ return .{
+ .colors = self.colors_c.items.ptr,
+ .len = self.colors_c.items.len,
+ };
+ }
+
+ pub fn parseCLI(
+ self: *Self,
+ alloc: Allocator,
+ input_: ?[]const u8,
+ ) !void {
+ const input = input_ orelse return error.ValueRequired;
+ if (input.len == 0) return error.ValueRequired;
+
+ // Always reset on parse
+ self.* = .{};
+
+ // Split the input by commas and parse each color
+ var it = std.mem.tokenizeScalar(u8, input, ',');
+ var count: usize = 0;
+ while (it.next()) |raw| {
+ count += 1;
+ if (count > 64) return error.InvalidValue;
+
+ const color = try Color.parseCLI(raw);
+ try self.colors.append(alloc, color);
+ try self.colors_c.append(alloc, color.cval());
+ }
+
+ // If no colors were parsed, we need to return an error
+ if (self.colors.items.len == 0) return error.InvalidValue;
+
+ assert(self.colors.items.len == self.colors_c.items.len);
+ }
+
+ pub fn clone(
+ self: *const Self,
+ alloc: Allocator,
+ ) Allocator.Error!Self {
+ return .{
+ .colors = try self.colors.clone(alloc),
+ };
+ }
+
+ /// Compare if two of our value are requal. Required by Config.
+ pub fn equal(self: Self, other: Self) bool {
+ const itemsA = self.colors.items;
+ const itemsB = other.colors.items;
+ if (itemsA.len != itemsB.len) return false;
+ for (itemsA, itemsB) |a, b| {
+ if (!a.equal(b)) return false;
+ } else return true;
+ }
+
+ /// Used by Formatter
+ pub fn formatEntry(
+ self: Self,
+ formatter: anytype,
+ ) !void {
+ // If no items, we want to render an empty field.
+ if (self.colors.items.len == 0) {
+ try formatter.formatEntry(void, {});
+ return;
+ }
+
+ // Build up the value of our config. Our buffer size should be
+ // sized to contain all possible maximum values.
+ var buf: [1024]u8 = undefined;
+ var fbs = std.io.fixedBufferStream(&buf);
+ var writer = fbs.writer();
+ for (self.colors.items, 0..) |color, i| {
+ var color_buf: [128]u8 = undefined;
+ const color_str = try color.formatBuf(&color_buf);
+ if (i != 0) writer.writeByte(',') catch return error.OutOfMemory;
+ writer.writeAll(color_str) catch return error.OutOfMemory;
+ }
+
+ try formatter.formatEntry(
+ []const u8,
+ fbs.getWritten(),
+ );
+ }
+
+ test "parseCLI" {
+ const testing = std.testing;
+ var arena = ArenaAllocator.init(testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.allocator();
+
+ var p: Self = .{};
+ try p.parseCLI(alloc, "black,white");
+ try testing.expectEqual(2, p.colors.items.len);
+
+ // Error cases
+ try testing.expectError(error.ValueRequired, p.parseCLI(alloc, null));
+ try testing.expectError(error.InvalidValue, p.parseCLI(alloc, " "));
+ }
+
+ test "format" {
+ const testing = std.testing;
+ var buf = std.ArrayList(u8).init(testing.allocator);
+ defer buf.deinit();
+
+ var arena = ArenaAllocator.init(testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.allocator();
+
+ var p: Self = .{};
+ try p.parseCLI(alloc, "black,white");
+ try p.formatEntry(formatterpkg.entryFormatter("a", buf.writer()));
+ try std.testing.expectEqualSlices(u8, "a = #000000,#ffffff\n", buf.items);
+ }
+};
+
/// Palette is the 256 color palette for 256-color mode. This is still
/// used by many terminal applications.
pub const Palette = struct {
@@ -3686,7 +3966,7 @@ pub const RepeatableString = struct {
return .{ .list = list };
}
- /// The number of itemsin the list
+ /// The number of items in the list
pub fn count(self: Self) usize {
return self.list.items.len;
}
@@ -4850,11 +5130,29 @@ pub const MacTitlebarStyle = enum {
};
/// See macos-titlebar-proxy-icon
-pub const MacTitlebarProxyIcon: type = enum {
+pub const MacTitlebarProxyIcon = enum {
visible,
hidden,
};
+/// See macos-icon
+///
+/// Note: future versions of Ghostty can support a custom icon with
+/// path by changing this to a tagged union, which doesn't change our
+/// format at all.
+pub const MacAppIcon = enum {
+ official,
+ @"custom-style",
+};
+
+/// See macos-icon-frame
+pub const MacAppIconFrame = enum {
+ aluminum,
+ beige,
+ plastic,
+ chrome,
+};
+
/// See gtk-single-instance
pub const GtkSingleInstance = enum {
desktop,
@@ -4868,6 +5166,7 @@ pub const GtkTabsLocation = enum {
bottom,
left,
right,
+ hidden,
};
/// See adw-toolbar-style
@@ -5189,9 +5488,8 @@ pub const Duration = struct {
}
}
- pub fn c_get(self: Duration, ptr_raw: *anyopaque) void {
- const ptr: *usize = @ptrCast(@alignCast(ptr_raw));
- ptr.* = @intCast(self.asMilliseconds());
+ pub fn cval(self: Duration) usize {
+ return @intCast(self.asMilliseconds());
}
/// Convenience function to convert to milliseconds since many OS and
diff --git a/src/config/c_get.zig b/src/config/c_get.zig
index 32a19df1c..dd7c7cce8 100644
--- a/src/config/c_get.zig
+++ b/src/config/c_get.zig
@@ -60,9 +60,11 @@ fn getValue(ptr_raw: *anyopaque, value: anytype) bool {
},
.Struct => |info| {
- // If the struct implements c_get then we call that
- if (@hasDecl(@TypeOf(value), "c_get")) {
- value.c_get(ptr_raw);
+ // If the struct implements cval then we call then.
+ if (@hasDecl(T, "cval")) {
+ const PtrT = @typeInfo(@TypeOf(T.cval)).Fn.return_type.?;
+ const ptr: *PtrT = @ptrCast(@alignCast(ptr_raw));
+ ptr.* = value.cval();
return true;
}
@@ -100,7 +102,7 @@ fn fieldByKey(self: *const Config, comptime k: Key) Value(k) {
return @field(self, field.name);
}
-test "u8" {
+test "c_get: u8" {
const testing = std.testing;
const alloc = testing.allocator;
@@ -113,7 +115,7 @@ test "u8" {
try testing.expectEqual(@as(f32, 24), cval);
}
-test "enum" {
+test "c_get: enum" {
const testing = std.testing;
const alloc = testing.allocator;
@@ -128,7 +130,7 @@ test "enum" {
try testing.expectEqualStrings("dark", str);
}
-test "color" {
+test "c_get: color" {
const testing = std.testing;
const alloc = testing.allocator;
@@ -136,12 +138,14 @@ test "color" {
defer c.deinit();
c.background = .{ .r = 255, .g = 0, .b = 0 };
- var cval: c_uint = undefined;
+ var cval: Color.C = undefined;
try testing.expect(get(&c, .background, @ptrCast(&cval)));
- try testing.expectEqual(@as(c_uint, 255), cval);
+ try testing.expectEqual(255, cval.r);
+ try testing.expectEqual(0, cval.g);
+ try testing.expectEqual(0, cval.b);
}
-test "optional" {
+test "c_get: optional" {
const testing = std.testing;
const alloc = testing.allocator;
@@ -150,14 +154,16 @@ test "optional" {
{
c.@"unfocused-split-fill" = null;
- var cval: c_uint = undefined;
+ var cval: Color.C = undefined;
try testing.expect(!get(&c, .@"unfocused-split-fill", @ptrCast(&cval)));
}
{
c.@"unfocused-split-fill" = .{ .r = 255, .g = 0, .b = 0 };
- var cval: c_uint = undefined;
+ var cval: Color.C = undefined;
try testing.expect(get(&c, .@"unfocused-split-fill", @ptrCast(&cval)));
- try testing.expectEqual(@as(c_uint, 255), cval);
+ try testing.expectEqual(255, cval.r);
+ try testing.expectEqual(0, cval.g);
+ try testing.expectEqual(0, cval.b);
}
}
diff --git a/src/font/SharedGridSet.zig b/src/font/SharedGridSet.zig
index ac2fcbf8a..2f25ec521 100644
--- a/src/font/SharedGridSet.zig
+++ b/src/font/SharedGridSet.zig
@@ -427,7 +427,10 @@ pub const DerivedConfig = struct {
@"adjust-underline-thickness": ?Metrics.Modifier,
@"adjust-strikethrough-position": ?Metrics.Modifier,
@"adjust-strikethrough-thickness": ?Metrics.Modifier,
+ @"adjust-overline-position": ?Metrics.Modifier,
+ @"adjust-overline-thickness": ?Metrics.Modifier,
@"adjust-cursor-thickness": ?Metrics.Modifier,
+ @"adjust-box-thickness": ?Metrics.Modifier,
@"freetype-load-flags": font.face.FreetypeLoadFlags,
/// Initialize a DerivedConfig. The config should be either a
@@ -462,7 +465,10 @@ pub const DerivedConfig = struct {
.@"adjust-underline-thickness" = config.@"adjust-underline-thickness",
.@"adjust-strikethrough-position" = config.@"adjust-strikethrough-position",
.@"adjust-strikethrough-thickness" = config.@"adjust-strikethrough-thickness",
+ .@"adjust-overline-position" = config.@"adjust-overline-position",
+ .@"adjust-overline-thickness" = config.@"adjust-overline-thickness",
.@"adjust-cursor-thickness" = config.@"adjust-cursor-thickness",
+ .@"adjust-box-thickness" = config.@"adjust-box-thickness",
.@"freetype-load-flags" = if (font.face.FreetypeLoadFlags != void) config.@"freetype-load-flags" else {},
// This must be last so the arena contains all our allocations
@@ -604,7 +610,10 @@ pub const Key = struct {
if (config.@"adjust-underline-thickness") |m| try set.put(alloc, .underline_thickness, m);
if (config.@"adjust-strikethrough-position") |m| try set.put(alloc, .strikethrough_position, m);
if (config.@"adjust-strikethrough-thickness") |m| try set.put(alloc, .strikethrough_thickness, m);
+ if (config.@"adjust-overline-position") |m| try set.put(alloc, .overline_position, m);
+ if (config.@"adjust-overline-thickness") |m| try set.put(alloc, .overline_thickness, m);
if (config.@"adjust-cursor-thickness") |m| try set.put(alloc, .cursor_thickness, m);
+ if (config.@"adjust-box-thickness") |m| try set.put(alloc, .box_thickness, m);
break :set set;
};
diff --git a/src/font/face/coretext.zig b/src/font/face/coretext.zig
index 09fdd7ad0..885ea277e 100644
--- a/src/font/face/coretext.zig
+++ b/src/font/face/coretext.zig
@@ -292,31 +292,45 @@ pub const Face = struct {
var glyphs = [_]macos.graphics.Glyph{@intCast(glyph_index)};
// Get the bounding rect for rendering this glyph.
- const rect = self.font.getBoundingRectsForGlyphs(.horizontal, &glyphs, null);
+ // This is in a coordinate space with (0.0, 0.0)
+ // in the bottom left and +Y pointing up.
+ var rect = self.font.getBoundingRectsForGlyphs(.horizontal, &glyphs, null);
- // The x/y that we render the glyph at. The Y value has to be flipped
- // because our coordinates in 3D space are (0, 0) bottom left with
- // +y being up.
- const render_x = @floor(rect.origin.x);
- const render_y = @ceil(-rect.origin.y);
+ // If we're rendering a synthetic bold then we will gain 50% of
+ // the line width on every edge, which means we should increase
+ // our width and height by the line width and subtract half from
+ // our origin points.
+ if (self.synthetic_bold) |line_width| {
+ rect.size.width += line_width;
+ rect.size.height += line_width;
+ rect.origin.x -= line_width / 2;
+ rect.origin.y -= line_width / 2;
+ }
- // The ascent is the amount of pixels above the baseline this glyph
- // is rendered. The ascent can be calculated by adding the full
- // glyph height to the origin.
- const glyph_ascent = @ceil(rect.size.height + rect.origin.y);
+ // We make an assumption that font smoothing ("thicken")
+ // adds no more than 1 extra pixel to any edge. We don't
+ // add extra size if it's a sbix color font though, since
+ // bitmaps aren't affected by smoothing.
+ const sbix = self.color != null and self.color.?.sbix;
+ if (opts.thicken and !sbix) {
+ rect.size.width += 2.0;
+ rect.size.height += 2.0;
+ rect.origin.x -= 1.0;
+ rect.origin.y -= 1.0;
+ }
- // The glyph height is basically rect.size.height but we do the
- // ascent plus the descent because both are rounded elements that
- // will make us more accurate.
- const height: u32 = @intFromFloat(glyph_ascent + render_y);
-
- // The glyph width is our advertised bounding with plus the rounding
- // difference from our rendering X.
- const width: u32 = @intFromFloat(@ceil(rect.size.width + (rect.origin.x - render_x)));
+ // We compute the minimum and maximum x and y values.
+ // We round our min points down and max points up.
+ const x0: i32, const x1: i32, const y0: i32, const y1: i32 = .{
+ @intFromFloat(@floor(rect.origin.x)),
+ @intFromFloat(@ceil(rect.origin.x) + @ceil(rect.size.width)),
+ @intFromFloat(@floor(rect.origin.y)),
+ @intFromFloat(@ceil(rect.origin.y) + @ceil(rect.size.height)),
+ };
// This bitmap is blank. I've seen it happen in a font, I don't know why.
// If it is empty, we just return a valid glyph struct that does nothing.
- if (width == 0 or height == 0) return font.Glyph{
+ if (x1 <= x0 or y1 <= y0) return font.Glyph{
.width = 0,
.height = 0,
.offset_x = 0,
@@ -326,25 +340,8 @@ pub const Face = struct {
.advance_x = 0,
};
- // Additional padding we need to add to the bitmap context itself
- // due to the glyph being larger than standard.
- const padding_ctx: u32 = padding_ctx: {
- // If we're doing thicken, then getBoundsForGlyphs does not take
- // into account the anti-aliasing that will be added to the glyph.
- // We need to add some padding to allow that to happen. A padding of
- // 2 is usually enough for anti-aliasing.
- var result: u32 = if (opts.thicken) 2 else 0;
-
- // If we have a synthetic bold, add padding for the stroke width
- if (self.synthetic_bold) |line_width| {
- // x2 for top and bottom padding
- result += @intFromFloat(@ceil(line_width) * 2);
- }
-
- break :padding_ctx result;
- };
- const padded_width: u32 = width + (padding_ctx * 2);
- const padded_height: u32 = height + (padding_ctx * 2);
+ const width: u32 = @intCast(x1 - x0);
+ const height: u32 = @intCast(y1 - y0);
// Settings that are specific to if we are rendering text or emoji.
const color: struct {
@@ -380,17 +377,17 @@ pub const Face = struct {
// usually stabilizes pretty quickly and is very infrequent so I think
// the allocation overhead is acceptable compared to the cost of
// caching it forever or having to deal with a cache lifetime.
- const buf = try alloc.alloc(u8, padded_width * padded_height * color.depth);
+ const buf = try alloc.alloc(u8, width * height * color.depth);
defer alloc.free(buf);
@memset(buf, 0);
const context = macos.graphics.BitmapContext.context;
const ctx = try macos.graphics.BitmapContext.create(
buf,
- padded_width,
- padded_height,
+ width,
+ height,
8,
- padded_width * color.depth,
+ width * color.depth,
color.space,
color.context_opts,
);
@@ -405,8 +402,8 @@ pub const Face = struct {
context.fillRect(ctx, .{
.origin = .{ .x = 0, .y = 0 },
.size = .{
- .width = @floatFromInt(padded_width),
- .height = @floatFromInt(padded_height),
+ .width = @floatFromInt(width),
+ .height = @floatFromInt(height),
},
});
@@ -437,67 +434,57 @@ pub const Face = struct {
// We want to render the glyphs at (0,0), but the glyphs themselves
// are offset by bearings, so we have to undo those bearings in order
- // to get them to 0,0. We also add the padding so that they render
- // slightly off the edge of the bitmap.
- const padding_ctx_f64: f64 = @floatFromInt(padding_ctx);
+ // to get them to 0,0.
self.font.drawGlyphs(&glyphs, &.{
.{
- .x = -1 * (render_x - padding_ctx_f64),
- .y = render_y + padding_ctx_f64,
+ .x = @floatFromInt(-x0),
+ .y = @floatFromInt(-y0),
},
}, ctx);
const region = region: {
- // We need to add a 1px padding to the font so that we don't
- // get fuzzy issues when blending textures.
- const padding = 1;
-
- // Get the full padded region
+ // We reserve a region that's 1px wider and taller than we need
+ // in order to create a 1px separation between adjacent glyphs
+ // to prevent interpolation with adjacent glyphs while sampling
+ // from the atlas.
var region = try atlas.reserve(
alloc,
- padded_width + (padding * 2), // * 2 because left+right
- padded_height + (padding * 2), // * 2 because top+bottom
+ width + 1,
+ height + 1,
);
- // Modify the region so that we remove the padding so that
- // we write to the non-zero location. The data in an Altlas
- // is always initialized to zero (Atlas.clear) so we don't
- // need to worry about zero-ing that.
- region.x += padding;
- region.y += padding;
- region.width -= padding * 2;
- region.height -= padding * 2;
+ // We adjust the region width and height back down since we
+ // don't need the extra pixel, we just needed to reserve it
+ // so that it isn't used for other glyphs in the future.
+ region.width -= 1;
+ region.height -= 1;
break :region region;
};
atlas.set(region, buf);
const metrics = opts.grid_metrics orelse self.metrics;
- const offset_y: i32 = offset_y: {
- // Our Y coordinate in 3D is (0, 0) bottom left, +y is UP.
- // We need to calculate our baseline from the bottom of a cell.
- const baseline_from_bottom: f64 = @floatFromInt(metrics.cell_baseline);
- // Next we offset our baseline by the bearing in the font. We
- // ADD here because CoreText y is UP.
- const baseline_with_offset = baseline_from_bottom + glyph_ascent;
-
- // Add our context padding we may have created.
- const baseline_with_padding = baseline_with_offset + padding_ctx_f64;
-
- break :offset_y @intFromFloat(@ceil(baseline_with_padding));
- };
+ // This should be the distance from the bottom of
+ // the cell to the top of the glyph's bounding box.
+ //
+ // The calculation is distance from bottom of cell to
+ // baseline plus distance from baseline to top of glyph.
+ const offset_y: i32 = @as(i32, @intCast(metrics.cell_baseline)) + y1;
+ // This should be the distance from the left of
+ // the cell to the left of the glyph's bounding box.
const offset_x: i32 = offset_x: {
- // Don't forget to apply our context padding if we have one
- var result: i32 = @intFromFloat(render_x - padding_ctx_f64);
+ var result: i32 = x0;
- // If our cell was resized to be wider then we center our
- // glyph in the cell.
+ // If our cell was resized then we adjust our glyph's
+ // position relative to the new center. This keeps glyphs
+ // centered in the cell whether it was made wider or narrower.
if (metrics.original_cell_width) |original_width| {
- if (original_width < metrics.cell_width) {
- const diff = (metrics.cell_width - original_width) / 2;
- result += @intCast(diff);
- }
+ const before: i32 = @intCast(original_width);
+ const after: i32 = @intCast(metrics.cell_width);
+ // Increase the offset by half of the difference
+ // between the widths to keep things centered.
+ result += @divTrunc(after - before, 2);
}
break :offset_x result;
@@ -507,21 +494,9 @@ pub const Face = struct {
var advances: [glyphs.len]macos.graphics.Size = undefined;
_ = self.font.getAdvancesForGlyphs(.horizontal, &glyphs, &advances);
- // std.log.warn("renderGlyph rect={} width={} height={} render_x={} render_y={} offset_y={} ascent={} cell_height={} cell_baseline={}", .{
- // rect,
- // width,
- // height,
- // render_x,
- // render_y,
- // offset_y,
- // glyph_ascent,
- // self.metrics.cell_height,
- // self.metrics.cell_baseline,
- // });
-
return .{
- .width = padded_width,
- .height = padded_height,
+ .width = width,
+ .height = height,
.offset_x = offset_x,
.offset_y = offset_y,
.atlas_x = region.x,
@@ -534,8 +509,6 @@ pub const Face = struct {
CopyTableError,
InvalidHeadTable,
InvalidPostTable,
- InvalidOS2Table,
- OS2VersionNotSupported,
InvalidHheaTable,
};
@@ -569,18 +542,16 @@ pub const Face = struct {
};
};
- // Read the 'OS/2' table out of the font data.
- const os2: opentype.OS2 = os2: {
+ // Read the 'OS/2' table out of the font data if it's available.
+ const os2_: ?opentype.OS2 = os2: {
const tag = macos.text.FontTableTag.init("OS/2");
- const data = ct_font.copyTable(tag) orelse return error.CopyTableError;
+ const data = ct_font.copyTable(tag) orelse break :os2 null;
defer data.release();
const ptr = data.getPointer();
const len = data.getLength();
break :os2 opentype.OS2.init(ptr[0..len]) catch |err| {
- return switch (err) {
- error.EndOfStream => error.InvalidOS2Table,
- error.OS2VersionNotSupported => error.OS2VersionNotSupported,
- };
+ log.warn("error parsing OS/2 table: {}", .{err});
+ break :os2 null;
};
};
@@ -603,54 +574,59 @@ pub const Face = struct {
const px_per_unit: f64 = px_per_em / units_per_em;
const ascent: f64, const descent: f64, const line_gap: f64 = vertical_metrics: {
- const os2_ascent: f64 = @floatFromInt(os2.sTypoAscender);
- const os2_descent: f64 = @floatFromInt(os2.sTypoDescender);
- const os2_line_gap: f64 = @floatFromInt(os2.sTypoLineGap);
+ const hhea_ascent: f64 = @floatFromInt(hhea.ascender);
+ const hhea_descent: f64 = @floatFromInt(hhea.descender);
+ const hhea_line_gap: f64 = @floatFromInt(hhea.lineGap);
- // If the font says to use typo metrics, trust it.
- if (os2.fsSelection.use_typo_metrics) {
- break :vertical_metrics .{
+ if (os2_) |os2| {
+ const os2_ascent: f64 = @floatFromInt(os2.sTypoAscender);
+ const os2_descent: f64 = @floatFromInt(os2.sTypoDescender);
+ const os2_line_gap: f64 = @floatFromInt(os2.sTypoLineGap);
+
+ // If the font says to use typo metrics, trust it.
+ if (os2.fsSelection.use_typo_metrics) break :vertical_metrics .{
os2_ascent * px_per_unit,
os2_descent * px_per_unit,
os2_line_gap * px_per_unit,
};
- }
- // Otherwise we prefer the height metrics from 'hhea' if they
- // are available, or else OS/2 sTypo* metrics, and if all else
- // fails then we use OS/2 usWin* metrics.
- //
- // This is not "standard" behavior, but it's our best bet to
- // account for fonts being... just weird. It's pretty much what
- // FreeType does to get its generic ascent and descent metrics.
+ // Otherwise we prefer the height metrics from 'hhea' if they
+ // are available, or else OS/2 sTypo* metrics, and if all else
+ // fails then we use OS/2 usWin* metrics.
+ //
+ // This is not "standard" behavior, but it's our best bet to
+ // account for fonts being... just weird. It's pretty much what
+ // FreeType does to get its generic ascent and descent metrics.
- if (hhea.ascender != 0 or hhea.descender != 0) {
- const hhea_ascent: f64 = @floatFromInt(hhea.ascender);
- const hhea_descent: f64 = @floatFromInt(hhea.descender);
- const hhea_line_gap: f64 = @floatFromInt(hhea.lineGap);
- break :vertical_metrics .{
+ if (hhea.ascender != 0 or hhea.descender != 0) break :vertical_metrics .{
hhea_ascent * px_per_unit,
hhea_descent * px_per_unit,
hhea_line_gap * px_per_unit,
};
- }
- if (os2_ascent != 0 or os2_descent != 0) {
- break :vertical_metrics .{
+ if (os2_ascent != 0 or os2_descent != 0) break :vertical_metrics .{
os2_ascent * px_per_unit,
os2_descent * px_per_unit,
os2_line_gap * px_per_unit,
};
+
+ const win_ascent: f64 = @floatFromInt(os2.usWinAscent);
+ const win_descent: f64 = @floatFromInt(os2.usWinDescent);
+ break :vertical_metrics .{
+ win_ascent * px_per_unit,
+ // usWinDescent is *positive* -> down unlike sTypoDescender
+ // and hhea.Descender, so we flip its sign to fix this.
+ -win_descent * px_per_unit,
+ 0.0,
+ };
}
- const win_ascent: f64 = @floatFromInt(os2.usWinAscent);
- const win_descent: f64 = @floatFromInt(os2.usWinDescent);
+ // If our font has no OS/2 table, then we just
+ // blindly use the metrics from the hhea table.
break :vertical_metrics .{
- win_ascent * px_per_unit,
- // usWinDescent is *positive* -> down unlike sTypoDescender
- // and hhea.Descender, so we flip its sign to fix this.
- -win_descent * px_per_unit,
- 0.0,
+ hhea_ascent * px_per_unit,
+ hhea_descent * px_per_unit,
+ hhea_line_gap * px_per_unit,
};
};
@@ -672,30 +648,44 @@ pub const Face = struct {
@as(f64, @floatFromInt(post.underlineThickness)) * px_per_unit;
// Similar logic to the underline above.
- const has_broken_strikethrough = os2.yStrikeoutSize == 0;
+ const strikethrough_position, const strikethrough_thickness = st: {
+ const os2 = os2_ orelse break :st .{ null, null };
- const strikethrough_position: ?f64 = if (has_broken_strikethrough and os2.yStrikeoutPosition == 0)
- null
- else
- @as(f64, @floatFromInt(os2.yStrikeoutPosition)) * px_per_unit;
+ const has_broken_strikethrough = os2.yStrikeoutSize == 0;
- const strikethrough_thickness: ?f64 = if (has_broken_strikethrough)
- null
- else
- @as(f64, @floatFromInt(os2.yStrikeoutSize)) * px_per_unit;
+ const pos: ?f64 = if (has_broken_strikethrough and os2.yStrikeoutPosition == 0)
+ null
+ else
+ @as(f64, @floatFromInt(os2.yStrikeoutPosition)) * px_per_unit;
- // We fall back to whatever CoreText does if
- // the OS/2 table doesn't specify a cap height.
- const cap_height: f64 = if (os2.sCapHeight) |sCapHeight|
- @as(f64, @floatFromInt(sCapHeight)) * px_per_unit
- else
- ct_font.getCapHeight();
+ const thick: ?f64 = if (has_broken_strikethrough)
+ null
+ else
+ @as(f64, @floatFromInt(os2.yStrikeoutSize)) * px_per_unit;
- // Ditto for ex height.
- const ex_height: f64 = if (os2.sxHeight) |sxHeight|
- @as(f64, @floatFromInt(sxHeight)) * px_per_unit
- else
- ct_font.getXHeight();
+ break :st .{ pos, thick };
+ };
+
+ // We fall back to whatever CoreText does if the
+ // OS/2 table doesn't specify a cap or ex height.
+ const cap_height: f64, const ex_height: f64 = heights: {
+ const os2 = os2_ orelse break :heights .{
+ ct_font.getCapHeight(),
+ ct_font.getXHeight(),
+ };
+
+ break :heights .{
+ if (os2.sCapHeight) |sCapHeight|
+ @as(f64, @floatFromInt(sCapHeight)) * px_per_unit
+ else
+ ct_font.getCapHeight(),
+
+ if (os2.sxHeight) |sxHeight|
+ @as(f64, @floatFromInt(sxHeight)) * px_per_unit
+ else
+ ct_font.getXHeight(),
+ };
+ };
// Cell width is calculated by calculating the widest width of the
// visible ASCII characters. Usually 'M' is widest but we just take
diff --git a/src/font/face/freetype.zig b/src/font/face/freetype.zig
index 7d34c70f8..f5ec9e7ec 100644
--- a/src/font/face/freetype.zig
+++ b/src/font/face/freetype.zig
@@ -600,7 +600,6 @@ pub const Face = struct {
const CalcMetricsError = error{
CopyTableError,
- MissingOS2Table,
};
/// Calculate the metrics associated with a face. This is not public because
@@ -629,70 +628,80 @@ pub const Face = struct {
const post = face.getSfntTable(.post) orelse return error.CopyTableError;
// Read the 'OS/2' table out of the font data.
- const os2 = face.getSfntTable(.os2) orelse return error.CopyTableError;
+ const os2_: ?*freetype.c.TT_OS2 = os2: {
+ const os2 = face.getSfntTable(.os2) orelse break :os2 null;
+ if (os2.version == 0xFFFF) break :os2 null;
+ break :os2 os2;
+ };
// Read the 'hhea' table out of the font data.
const hhea = face.getSfntTable(.hhea) orelse return error.CopyTableError;
- // Some fonts don't actually have an OS/2 table, which
- // we need in order to do the metrics calculations, in
- // such cases FreeType sets the version to 0xFFFF
- if (os2.version == 0xFFFF) return error.MissingOS2Table;
-
const units_per_em = head.Units_Per_EM;
const px_per_em: f64 = @floatFromInt(size_metrics.y_ppem);
const px_per_unit = px_per_em / @as(f64, @floatFromInt(units_per_em));
const ascent: f64, const descent: f64, const line_gap: f64 = vertical_metrics: {
- const os2_ascent: f64 = @floatFromInt(os2.sTypoAscender);
- const os2_descent: f64 = @floatFromInt(os2.sTypoDescender);
- const os2_line_gap: f64 = @floatFromInt(os2.sTypoLineGap);
+ const hhea_ascent: f64 = @floatFromInt(hhea.Ascender);
+ const hhea_descent: f64 = @floatFromInt(hhea.Descender);
+ const hhea_line_gap: f64 = @floatFromInt(hhea.Line_Gap);
- // If the font says to use typo metrics, trust it.
- // (The USE_TYPO_METRICS bit is bit 7)
- if (os2.fsSelection & (1 << 7) != 0) {
+ if (os2_) |os2| {
+ const os2_ascent: f64 = @floatFromInt(os2.sTypoAscender);
+ const os2_descent: f64 = @floatFromInt(os2.sTypoDescender);
+ const os2_line_gap: f64 = @floatFromInt(os2.sTypoLineGap);
+
+ // If the font says to use typo metrics, trust it.
+ // (The USE_TYPO_METRICS bit is bit 7)
+ if (os2.fsSelection & (1 << 7) != 0) {
+ break :vertical_metrics .{
+ os2_ascent * px_per_unit,
+ os2_descent * px_per_unit,
+ os2_line_gap * px_per_unit,
+ };
+ }
+
+ // Otherwise we prefer the height metrics from 'hhea' if they
+ // are available, or else OS/2 sTypo* metrics, and if all else
+ // fails then we use OS/2 usWin* metrics.
+ //
+ // This is not "standard" behavior, but it's our best bet to
+ // account for fonts being... just weird. It's pretty much what
+ // FreeType does to get its generic ascent and descent metrics.
+
+ if (hhea.Ascender != 0 or hhea.Descender != 0) {
+ break :vertical_metrics .{
+ hhea_ascent * px_per_unit,
+ hhea_descent * px_per_unit,
+ hhea_line_gap * px_per_unit,
+ };
+ }
+
+ if (os2_ascent != 0 or os2_descent != 0) {
+ break :vertical_metrics .{
+ os2_ascent * px_per_unit,
+ os2_descent * px_per_unit,
+ os2_line_gap * px_per_unit,
+ };
+ }
+
+ const win_ascent: f64 = @floatFromInt(os2.usWinAscent);
+ const win_descent: f64 = @floatFromInt(os2.usWinDescent);
break :vertical_metrics .{
- os2_ascent * px_per_unit,
- os2_descent * px_per_unit,
- os2_line_gap * px_per_unit,
+ win_ascent * px_per_unit,
+ // usWinDescent is *positive* -> down unlike sTypoDescender
+ // and hhea.Descender, so we flip its sign to fix this.
+ -win_descent * px_per_unit,
+ 0.0,
};
}
- // Otherwise we prefer the height metrics from 'hhea' if they
- // are available, or else OS/2 sTypo* metrics, and if all else
- // fails then we use OS/2 usWin* metrics.
- //
- // This is not "standard" behavior, but it's our best bet to
- // account for fonts being... just weird. It's pretty much what
- // FreeType does to get its generic ascent and descent metrics.
-
- if (hhea.Ascender != 0 or hhea.Descender != 0) {
- const hhea_ascent: f64 = @floatFromInt(hhea.Ascender);
- const hhea_descent: f64 = @floatFromInt(hhea.Descender);
- const hhea_line_gap: f64 = @floatFromInt(hhea.Line_Gap);
- break :vertical_metrics .{
- hhea_ascent * px_per_unit,
- hhea_descent * px_per_unit,
- hhea_line_gap * px_per_unit,
- };
- }
-
- if (os2_ascent != 0 or os2_descent != 0) {
- break :vertical_metrics .{
- os2_ascent * px_per_unit,
- os2_descent * px_per_unit,
- os2_line_gap * px_per_unit,
- };
- }
-
- const win_ascent: f64 = @floatFromInt(os2.usWinAscent);
- const win_descent: f64 = @floatFromInt(os2.usWinDescent);
+ // If our font has no OS/2 table, then we just
+ // blindly use the metrics from the hhea table.
break :vertical_metrics .{
- win_ascent * px_per_unit,
- // usWinDescent is *positive* -> down unlike sTypoDescender
- // and hhea.Descender, so we flip its sign to fix this.
- -win_descent * px_per_unit,
- 0.0,
+ hhea_ascent * px_per_unit,
+ hhea_descent * px_per_unit,
+ hhea_line_gap * px_per_unit,
};
};
@@ -714,17 +723,23 @@ pub const Face = struct {
@as(f64, @floatFromInt(post.underlineThickness)) * px_per_unit;
// Similar logic to the underline above.
- const has_broken_strikethrough = os2.yStrikeoutSize == 0;
+ const strikethrough_position, const strikethrough_thickness = st: {
+ const os2 = os2_ orelse break :st .{ null, null };
- const strikethrough_position = if (has_broken_strikethrough and os2.yStrikeoutPosition == 0)
- null
- else
- @as(f64, @floatFromInt(os2.yStrikeoutPosition)) * px_per_unit;
+ const has_broken_strikethrough = os2.yStrikeoutSize == 0;
- const strikethrough_thickness = if (has_broken_strikethrough)
- null
- else
- @as(f64, @floatFromInt(os2.yStrikeoutSize)) * px_per_unit;
+ const pos: ?f64 = if (has_broken_strikethrough and os2.yStrikeoutPosition == 0)
+ null
+ else
+ @as(f64, @floatFromInt(os2.yStrikeoutPosition)) * px_per_unit;
+
+ const thick: ?f64 = if (has_broken_strikethrough)
+ null
+ else
+ @as(f64, @floatFromInt(os2.yStrikeoutSize)) * px_per_unit;
+
+ break :st .{ pos, thick };
+ };
// Cell width is calculated by calculating the widest width of the
// visible ASCII characters. Usually 'M' is widest but we just take
@@ -754,37 +769,37 @@ pub const Face = struct {
break :cell_width max;
};
- // The OS/2 table does not include sCapHeight or sxHeight in version 1.
- const has_os2_height_metrics = os2.version >= 2;
-
- // We use the cap height specified by the font if it's
- // available, otherwise we try to measure the `H` glyph.
- const cap_height: ?f64 = cap_height: {
- if (has_os2_height_metrics) {
- break :cap_height @as(f64, @floatFromInt(os2.sCapHeight)) * px_per_unit;
- }
- if (face.getCharIndex('H')) |glyph_index| {
- if (face.loadGlyph(glyph_index, .{ .render = true })) {
- break :cap_height f26dot6ToF64(face.handle.*.glyph.*.metrics.height);
- } else |_| {}
+ // We use the cap and ex heights specified by the font if they're
+ // available, otherwise we try to measure the `H` and `x` glyphs.
+ const cap_height: ?f64, const ex_height: ?f64 = heights: {
+ if (os2_) |os2| {
+ // The OS/2 table does not include these metrics in version 1.
+ if (os2.version >= 2) {
+ break :heights .{
+ @as(f64, @floatFromInt(os2.sCapHeight)) * px_per_unit,
+ @as(f64, @floatFromInt(os2.sxHeight)) * px_per_unit,
+ };
+ }
}
- break :cap_height null;
- };
-
- // We use the ex height specified by the font if it's
- // available, otherwise we try to measure the `x` glyph.
- const ex_height: ?f64 = ex_height: {
- if (has_os2_height_metrics) {
- break :ex_height @as(f64, @floatFromInt(os2.sxHeight)) * px_per_unit;
- }
- if (face.getCharIndex('x')) |glyph_index| {
- if (face.loadGlyph(glyph_index, .{ .render = true })) {
- break :ex_height f26dot6ToF64(face.handle.*.glyph.*.metrics.height);
- } else |_| {}
- }
-
- break :ex_height null;
+ break :heights .{
+ cap: {
+ if (face.getCharIndex('H')) |glyph_index| {
+ if (face.loadGlyph(glyph_index, .{ .render = true })) {
+ break :cap f26dot6ToF64(face.handle.*.glyph.*.metrics.height);
+ } else |_| {}
+ }
+ break :cap null;
+ },
+ ex: {
+ if (face.getCharIndex('x')) |glyph_index| {
+ if (face.loadGlyph(glyph_index, .{ .render = true })) {
+ break :ex f26dot6ToF64(face.handle.*.glyph.*.metrics.height);
+ } else |_| {}
+ }
+ break :ex null;
+ },
+ };
};
var result = font.face.Metrics.calc(.{
diff --git a/src/input/KeyEncoder.zig b/src/input/KeyEncoder.zig
index 4bac7ee6b..734885097 100644
--- a/src/input/KeyEncoder.zig
+++ b/src/input/KeyEncoder.zig
@@ -2067,7 +2067,7 @@ test "legacy: f1" {
{
enc.event.key = .f3;
const actual = try enc.legacy(&buf);
- try testing.expectEqualStrings("\x1b[1;5R", actual);
+ try testing.expectEqualStrings("\x1b[13;5~", actual);
}
// F4
diff --git a/src/input/function_keys.zig b/src/input/function_keys.zig
index 2a54ba12a..1156faf56 100644
--- a/src/input/function_keys.zig
+++ b/src/input/function_keys.zig
@@ -13,7 +13,7 @@ pub const CursorMode = enum { any, normal, application };
pub const KeypadMode = enum { any, normal, application };
/// A bit confusing so I'll document this one: this is the "modify other keys"
-/// setting. We only change behavior for "set_other" which is ESC [ 4; 2 m.
+/// setting. We only change behavior for "set_other" which is ESC [ > 4; 2 m.
/// So this can be "any" which means we don't care what's going on. Or it
/// can be "set" which means modify keys must be set EXCEPT FOR "other keys"
/// mode, and "set_other" which means modify keys must be set to "other keys"
@@ -89,7 +89,7 @@ pub const keys = keys: {
// Function Keys. todo: f13-f35 but we need to add to input.Key
result.set(.f1, pcStyle("\x1b[1;{}P") ++ .{.{ .sequence = "\x1BOP" }});
result.set(.f2, pcStyle("\x1b[1;{}Q") ++ .{.{ .sequence = "\x1BOQ" }});
- result.set(.f3, pcStyle("\x1b[1;{}R") ++ .{.{ .sequence = "\x1BOR" }});
+ result.set(.f3, pcStyle("\x1b[13;{}~") ++ .{.{ .sequence = "\x1BOR" }});
result.set(.f4, pcStyle("\x1b[1;{}S") ++ .{.{ .sequence = "\x1BOS" }});
result.set(.f5, pcStyle("\x1b[15;{}~") ++ .{.{ .sequence = "\x1B[15~" }});
result.set(.f6, pcStyle("\x1b[17;{}~") ++ .{.{ .sequence = "\x1B[17~" }});
diff --git a/src/main.zig b/src/main.zig
index 895ccfe48..ecf38fbb3 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -7,6 +7,8 @@ const entrypoint = switch (build_config.exe_entrypoint) {
.helpgen => @import("helpgen.zig"),
.mdgen_ghostty_1 => @import("build/mdgen/main_ghostty_1.zig"),
.mdgen_ghostty_5 => @import("build/mdgen/main_ghostty_5.zig"),
+ .webgen_config => @import("build/webgen/main_config.zig"),
+ .webgen_actions => @import("build/webgen/main_actions.zig"),
.bench_parser => @import("bench/parser.zig"),
.bench_stream => @import("bench/stream.zig"),
.bench_codepoint_width => @import("bench/codepoint-width.zig"),
diff --git a/src/os/env.zig b/src/os/env.zig
index 8d6331f8d..cf6cc0fe7 100644
--- a/src/os/env.zig
+++ b/src/os/env.zig
@@ -34,6 +34,23 @@ pub fn appendEnvAlways(
});
}
+/// Prepend a value to an environment variable such as PATH.
+/// The returned value is always allocated so it must be freed.
+pub fn prependEnv(
+ alloc: Allocator,
+ current: []const u8,
+ value: []const u8,
+) ![]u8 {
+ // If there is no prior value, we return it as-is
+ if (current.len == 0) return try alloc.dupe(u8, value);
+
+ return try std.fmt.allocPrint(alloc, "{s}{c}{s}", .{
+ value,
+ std.fs.path.delimiter,
+ current,
+ });
+}
+
/// The result of getenv, with a shared deinit to properly handle allocation
/// on Windows.
pub const GetEnvResult = struct {
@@ -110,3 +127,25 @@ test "appendEnv existing" {
try testing.expectEqualStrings(result, "a:b:foo");
}
}
+
+test "prependEnv empty" {
+ const testing = std.testing;
+ const alloc = testing.allocator;
+
+ const result = try prependEnv(alloc, "", "foo");
+ defer alloc.free(result);
+ try testing.expectEqualStrings(result, "foo");
+}
+
+test "prependEnv existing" {
+ const testing = std.testing;
+ const alloc = testing.allocator;
+
+ const result = try prependEnv(alloc, "a:b", "foo");
+ defer alloc.free(result);
+ if (builtin.os.tag == .windows) {
+ try testing.expectEqualStrings(result, "foo;a:b");
+ } else {
+ try testing.expectEqualStrings(result, "foo:a:b");
+ }
+}
diff --git a/src/os/main.zig b/src/os/main.zig
index 073129300..40ac1d1d6 100644
--- a/src/os/main.zig
+++ b/src/os/main.zig
@@ -27,6 +27,7 @@ pub const CFReleaseThread = @import("cf_release_thread.zig");
pub const TempDir = @import("TempDir.zig");
pub const appendEnv = env.appendEnv;
pub const appendEnvAlways = env.appendEnvAlways;
+pub const prependEnv = env.prependEnv;
pub const getenv = env.getenv;
pub const setenv = env.setenv;
pub const unsetenv = env.unsetenv;
diff --git a/src/renderer/shaders/cell.metal b/src/renderer/shaders/cell.metal
index ced057b72..2a107402b 100644
--- a/src/renderer/shaders/cell.metal
+++ b/src/renderer/shaders/cell.metal
@@ -256,9 +256,7 @@ vertex CellTextVertexOut cell_text_vertex(
offset.y = uniforms.cell_size.y - offset.y;
// If we're constrained then we need to scale the glyph.
- // We also always constrain colored glyphs since we should have
- // their scaled cell size exactly correct.
- if (in.mode == MODE_TEXT_CONSTRAINED || in.mode == MODE_TEXT_COLOR) {
+ if (in.mode == MODE_TEXT_CONSTRAINED) {
float max_width = uniforms.cell_size.x * in.constraint_width;
if (size.x > max_width) {
float new_y = size.y * (max_width / size.x);
diff --git a/src/renderer/shaders/cell.v.glsl b/src/renderer/shaders/cell.v.glsl
index 942b7ac44..f37e69adc 100644
--- a/src/renderer/shaders/cell.v.glsl
+++ b/src/renderer/shaders/cell.v.glsl
@@ -208,10 +208,8 @@ void main() {
glyph_offset_calc.y = cell_size_scaled.y - glyph_offset_calc.y;
// If this is a constrained mode, we need to constrain it!
- // We also always constrain colored glyphs since we should have
- // their scaled cell size exactly correct.
vec2 glyph_size_calc = glyph_size;
- if (mode == MODE_FG_CONSTRAINED || mode == MODE_FG_COLOR) {
+ if (mode == MODE_FG_CONSTRAINED) {
if (glyph_size.x > cell_size_scaled.x) {
float new_y = glyph_size.y * (cell_size_scaled.x / glyph_size.x);
glyph_offset_calc.y = glyph_offset_calc.y + ((glyph_size.y - new_y) / 2);
diff --git a/src/shell-integration/README.md b/src/shell-integration/README.md
index d5294046f..78f5687df 100644
--- a/src/shell-integration/README.md
+++ b/src/shell-integration/README.md
@@ -18,9 +18,6 @@ our integration script (`bash/ghostty.bash`). This prevents Bash from loading
its normal startup files, which becomes our script's responsibility (along with
disabling POSIX mode).
-Because automatic Bash shell integration requires Bash version 4 or later, it
-must be explicitly enabled (`shell-integration = bash`).
-
Bash shell integration can also be sourced manually from `bash/ghostty.bash`.
This also works for older versions of Bash.
@@ -31,6 +28,13 @@ if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
fi
```
+> [!NOTE]
+>
+> The version of Bash distributed with macOS (`/bin/bash`) does not support
+> automatic shell integration. You'll need to manually source the shell
+> integration script (as shown above). You can also install a standard
+> version of Bash from Homebrew or elsewhere and set it as your shell.
+
### Elvish
For [Elvish](https://elv.sh), `$GHOSTTY_RESOURCES_DIR/src/shell-integration`
diff --git a/src/shell-integration/bash/ghostty.bash b/src/shell-integration/bash/ghostty.bash
index b00ec7609..48b03fed0 100644
--- a/src/shell-integration/bash/ghostty.bash
+++ b/src/shell-integration/bash/ghostty.bash
@@ -58,7 +58,8 @@ if [ -n "$GHOSTTY_BASH_INJECT" ]; then
# Arch, Debian, Ubuntu use /etc/bash.bashrc
# Fedora uses /etc/bashrc sourced from ~/.bashrc instead of SYS_BASHRC
# Void Linux uses /etc/bash/bashrc
- for rcfile in /etc/bash.bashrc /etc/bash/bashrc ; do
+ # Nixos uses /etc/bashrc
+ for rcfile in /etc/bash.bashrc /etc/bash/bashrc /etc/bashrc; do
[ -r "$rcfile" ] && { builtin source "$rcfile"; break; }
done
if [[ -z "$GHOSTTY_BASH_RCFILE" ]]; then GHOSTTY_BASH_RCFILE="$HOME/.bashrc"; fi
@@ -99,15 +100,11 @@ function __ghostty_precmd() {
PS1=$PS1'\[\e]133;B\a\]'
PS2=$PS2'\[\e]133;B\a\]'
+ # bash doesn't redraw the leading lines in a multiline prompt so
+ # mark the last line as a secondary prompt (k=s) to prevent the
+ # preceding lines from being erased by ghostty after a resize.
if [[ "${PS1}" == *"\n"* || "${PS1}" == *$'\n'* ]]; then
- # bash doesn't redraw the leading lines in a multiline prompt so
- # mark the last line as a secondary prompt (k=s) to prevent the
- # preceding lines from being erased by ghostty after a resize.
- builtin local oldval
- oldval=$(builtin shopt -p extglob)
- builtin shopt -s extglob
- PS1=${PS1%@('\n'|$'\n')*}'\n\[\e]133;A;k=s\a\]'${PS1##*@('\n'|$'\n')}
- builtin eval "$oldval"
+ PS1=$PS1'\[\e]133;A;k=s\a\]'
fi
# Cursor
@@ -151,7 +148,7 @@ function __ghostty_precmd() {
if test "$_ghostty_executing" != ""; then
# End of current command. Report its status.
- builtin printf "\033]133;D;%s;aid=%s\007" "$ret" "$BASHPID"
+ builtin printf "\e]133;D;%s;aid=%s\a" "$ret" "$BASHPID"
fi
# unfortunately bash provides no hooks to detect cwd changes
@@ -163,7 +160,7 @@ function __ghostty_precmd() {
fi
# Fresh line and start of prompt.
- builtin printf "\033]133;A;aid=%s\007" "$BASHPID"
+ builtin printf "\e]133;A;aid=%s\a" "$BASHPID"
_ghostty_executing=0
}
@@ -171,7 +168,7 @@ function __ghostty_preexec() {
PS0="$_GHOSTTY_SAVE_PS0"
PS1="$_GHOSTTY_SAVE_PS1"
PS2="$_GHOSTTY_SAVE_PS2"
- builtin printf "\033]133;C;\007"
+ builtin printf "\e]133;C;\a"
_ghostty_executing=1
}
diff --git a/src/terminal/Screen.zig b/src/terminal/Screen.zig
index 7d7759130..42bcd54c0 100644
--- a/src/terminal/Screen.zig
+++ b/src/terminal/Screen.zig
@@ -1315,8 +1315,13 @@ pub fn clearPrompt(self: *Screen) void {
switch (row.semantic_prompt) {
// We are at a prompt but we're not at the start of the prompt.
// We mark our found value and continue because the prompt
- // may be multi-line.
- .input => found = p,
+ // may be multi-line, unless this is the second time we've
+ // seen an .input marker, in which case we've run into an
+ // earlier prompt.
+ .input => {
+ if (found != null) break;
+ found = p;
+ },
// If we find the prompt then we're done. We are also done
// if we find any prompt continuation, because the shells
@@ -3565,6 +3570,32 @@ test "Screen: clearPrompt continuation" {
}
}
+test "Screen: clearPrompt consecutive prompts" {
+ const testing = std.testing;
+ const alloc = testing.allocator;
+
+ var s = try init(alloc, 5, 3, 0);
+ defer s.deinit();
+ const str = "1ABCD\n2EFGH\n3IJKL";
+ try s.testWriteString(str);
+
+ // Set both rows to be prompts
+ {
+ s.cursorAbsolute(0, 1);
+ s.cursor.page_row.semantic_prompt = .input;
+ s.cursorAbsolute(0, 2);
+ s.cursor.page_row.semantic_prompt = .input;
+ }
+
+ s.clearPrompt();
+
+ {
+ const contents = try s.dumpStringAlloc(alloc, .{ .screen = .{} });
+ defer alloc.free(contents);
+ try testing.expectEqualStrings("1ABCD\n2EFGH", contents);
+ }
+}
+
test "Screen: clearPrompt no prompt" {
const testing = std.testing;
const alloc = testing.allocator;
diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig
index 41f86958e..423ebfa28 100644
--- a/src/termio/Exec.zig
+++ b/src/termio/Exec.zig
@@ -794,26 +794,42 @@ const Subprocess = struct {
}
}
- // Add the man pages from our application bundle to MANPATH.
- if (comptime builtin.target.isDarwin()) {
- if (cfg.resources_dir) |resources_dir| man: {
- var buf: [std.fs.max_path_bytes]u8 = undefined;
- const dir = std.fmt.bufPrint(&buf, "{s}/../man", .{resources_dir}) catch |err| {
- log.warn("error building manpath, man pages may not be available err={}", .{err});
- break :man;
- };
+ // On macOS, export additional data directories from our
+ // application bundle.
+ if (comptime builtin.target.isDarwin()) darwin: {
+ const resources_dir = cfg.resources_dir orelse break :darwin;
+ var buf: [std.fs.max_path_bytes]u8 = undefined;
+
+ const xdg_data_dir_key = "XDG_DATA_DIRS";
+ if (std.fmt.bufPrint(&buf, "{s}/..", .{resources_dir})) |data_dir| {
+ try env.put(
+ xdg_data_dir_key,
+ try internal_os.appendEnv(
+ alloc,
+ env.get(xdg_data_dir_key) orelse "/usr/local/share:/usr/share",
+ data_dir,
+ ),
+ );
+ } else |err| {
+ log.warn("error building {s}; err={}", .{ xdg_data_dir_key, err });
+ }
+
+ const manpath_key = "MANPATH";
+ if (std.fmt.bufPrint(&buf, "{s}/../man", .{resources_dir})) |man_dir| {
// Always append with colon in front, as it mean that if
// `MANPATH` is empty, then it should be treated as an extra
// path instead of overriding all paths set by OS.
try env.put(
- "MANPATH",
+ manpath_key,
try internal_os.appendEnvAlways(
alloc,
- env.get("MATHPATH") orelse "",
- dir,
+ env.get(manpath_key) orelse "",
+ man_dir,
),
);
+ } else |err| {
+ log.warn("error building {s}; man pages may not be available; err={}", .{ manpath_key, err });
}
}
@@ -1119,7 +1135,7 @@ const Subprocess = struct {
// This is important because our cwd can be set by the shell (OSC 7)
// and we don't want to break new windows.
const cwd: ?[]const u8 = if (self.cwd) |proposed| cwd: {
- if (std.fs.accessAbsolute(proposed, .{})) {
+ if (std.fs.cwd().access(proposed, .{})) {
break :cwd proposed;
} else |err| {
log.warn("cannot access cwd, ignoring: {}", .{err});
diff --git a/src/termio/shell_integration.zig b/src/termio/shell_integration.zig
index 06f2abc67..634f6e960 100644
--- a/src/termio/shell_integration.zig
+++ b/src/termio/shell_integration.zig
@@ -1,9 +1,11 @@
const std = @import("std");
+const builtin = @import("builtin");
const Allocator = std.mem.Allocator;
const ArenaAllocator = std.heap.ArenaAllocator;
const EnvMap = std.process.EnvMap;
const config = @import("../config.zig");
const homedir = @import("../os/homedir.zig");
+const internal_os = @import("../os/main.zig");
const log = std.log.scoped(.shell_integration);
@@ -57,11 +59,21 @@ pub fn setup(
};
const result: ShellIntegration = shell: {
- // For now, bash integration must be explicitly enabled via force_shell.
- // Our automatic shell integration requires bash version 4 or later,
- // and systems like macOS continue to ship bash version 3 by default.
- // This approach avoids the cost of performing a runtime version check.
- if (std.mem.eql(u8, "bash", exe) and force_shell == .bash) {
+ if (std.mem.eql(u8, "bash", exe)) {
+ // Apple distributes their own patched version of Bash 3.2
+ // on macOS that disables the ENV-based POSIX startup path.
+ // This means we're unable to perform our automatic shell
+ // integration sequence in this specific environment.
+ //
+ // If we're running "/bin/bash" on Darwin, we can assume
+ // we're using Apple's Bash because /bin is non-writable
+ // on modern macOS due to System Integrity Protection.
+ if (comptime builtin.target.isDarwin()) {
+ if (std.mem.eql(u8, "/bin/bash", command)) {
+ return null;
+ }
+ }
+
const new_command = try setupBash(
alloc_arena,
command,
@@ -424,8 +436,8 @@ test "bash: preserve ENV" {
/// Setup automatic shell integration for shells that include
/// their modules from paths in `XDG_DATA_DIRS` env variable.
///
-/// Path of shell-integration dir is prepended to `XDG_DATA_DIRS`.
-/// It is also saved in `GHOSTTY_SHELL_INTEGRATION_XDG_DIR` variable
+/// The shell-integration path is prepended to `XDG_DATA_DIRS`.
+/// It is also saved in the `GHOSTTY_SHELL_INTEGRATION_XDG_DIR` variable
/// so that the shell can refer to it and safely remove this directory
/// from `XDG_DATA_DIRS` when integration is complete.
fn setupXdgDataDirs(
@@ -447,32 +459,60 @@ fn setupXdgDataDirs(
// so that our modifications don't interfere with other commands.
try env.put("GHOSTTY_SHELL_INTEGRATION_XDG_DIR", integ_dir);
- {
- const xdg_data_dir_key = "XDG_DATA_DIRS";
+ // We attempt to avoid allocating by using the stack up to 4K.
+ // Max stack size is considerably larger on mac
+ // 4K is a reasonable size for this for most cases. However, env
+ // vars can be significantly larger so if we have to we fall
+ // back to a heap allocated value.
+ var stack_alloc_state = std.heap.stackFallback(4096, alloc_arena);
+ const stack_alloc = stack_alloc_state.get();
- // We attempt to avoid allocating by using the stack up to 4K.
- // Max stack size is considerably larger on macOS and Linux but
- // 4K is a reasonable size for this for most cases. However, env
- // vars can be significantly larger so if we have to we fall
- // back to a heap allocated value.
- var stack_alloc_state = std.heap.stackFallback(4096, alloc_arena);
- const stack_alloc = stack_alloc_state.get();
-
- // If no XDG_DATA_DIRS set use the default value as specified.
- // This ensures that the default directories aren't lost by setting
- // our desired integration dir directly. See #2711.
- //
- const old = env.get(xdg_data_dir_key) orelse "/usr/local/share:/usr/share";
-
- const prepended = try std.fmt.allocPrint(stack_alloc, "{s}{c}{s}", .{
+ // If no XDG_DATA_DIRS set use the default value as specified.
+ // This ensures that the default directories aren't lost by setting
+ // our desired integration dir directly. See #2711.
+ //
+ const xdg_data_dirs_key = "XDG_DATA_DIRS";
+ try env.put(
+ xdg_data_dirs_key,
+ try internal_os.prependEnv(
+ stack_alloc,
+ env.get(xdg_data_dirs_key) orelse "/usr/local/share:/usr/share",
integ_dir,
- std.fs.path.delimiter,
- old,
- });
- defer stack_alloc.free(prepended);
+ ),
+ );
+}
- try env.put(xdg_data_dir_key, prepended);
- }
+test "xdg: empty XDG_DATA_DIRS" {
+ const testing = std.testing;
+
+ var arena = ArenaAllocator.init(testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.allocator();
+
+ var env = EnvMap.init(alloc);
+ defer env.deinit();
+
+ try setupXdgDataDirs(alloc, ".", &env);
+
+ try testing.expectEqualStrings("./shell-integration", env.get("GHOSTTY_SHELL_INTEGRATION_XDG_DIR").?);
+ try testing.expectEqualStrings("./shell-integration:/usr/local/share:/usr/share", env.get("XDG_DATA_DIRS").?);
+}
+
+test "xdg: existing XDG_DATA_DIRS" {
+ const testing = std.testing;
+
+ var arena = ArenaAllocator.init(testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.allocator();
+
+ var env = EnvMap.init(alloc);
+ defer env.deinit();
+
+ try env.put("XDG_DATA_DIRS", "/opt/share");
+ try setupXdgDataDirs(alloc, ".", &env);
+
+ try testing.expectEqualStrings("./shell-integration", env.get("GHOSTTY_SHELL_INTEGRATION_XDG_DIR").?);
+ try testing.expectEqualStrings("./shell-integration:/opt/share", env.get("XDG_DATA_DIRS").?);
}
/// Setup the zsh automatic shell integration. This works by setting
diff --git a/website/.eslintrc.json b/website/.eslintrc.json
deleted file mode 100644
index bffb357a7..000000000
--- a/website/.eslintrc.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "extends": "next/core-web-vitals"
-}
diff --git a/website/.gitignore b/website/.gitignore
deleted file mode 100644
index 8f322f0d8..000000000
--- a/website/.gitignore
+++ /dev/null
@@ -1,35 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# next.js
-/.next/
-/out/
-
-# production
-/build
-
-# misc
-.DS_Store
-*.pem
-
-# debug
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-# local env files
-.env*.local
-
-# vercel
-.vercel
-
-# typescript
-*.tsbuildinfo
-next-env.d.ts
diff --git a/website/.prettierignore b/website/.prettierignore
deleted file mode 100644
index 536d88c8a..000000000
--- a/website/.prettierignore
+++ /dev/null
@@ -1 +0,0 @@
-.next/
diff --git a/website/README.md b/website/README.md
deleted file mode 100644
index f7f6ad006..000000000
--- a/website/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
-
-## Getting Started
-
-First, install the necessary dependencies:
-
-```bash
-npm install
-# or
-yarn install
-# or
-pnpm install
-# or
-bun install
-```
-
-Then, run the development server:
-
-```bash
-npm run dev
-# or
-yarn dev
-# or
-pnpm dev
-# or
-bun dev
-```
-
-Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
-
-You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
-
-This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
-
-## Learn More
-
-To learn more about Next.js, take a look at the following resources:
-
-- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
-- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
-
-You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
-
-## Deploy on Vercel
-
-The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
-
-Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
diff --git a/website/app/favicon.ico b/website/app/favicon.ico
deleted file mode 100644
index 811030660..000000000
Binary files a/website/app/favicon.ico and /dev/null differ
diff --git a/website/app/globals.css b/website/app/globals.css
deleted file mode 100644
index 9cd71c3c4..000000000
--- a/website/app/globals.css
+++ /dev/null
@@ -1,20 +0,0 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-:root {
- --foreground-rgb: 255, 255, 255;
- --background-rgb: #0e1324;
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --foreground-rgb: 255, 255, 255;
- --background-rgb: #0e1324;
- }
-}
-
-body {
- color: rgb(var(--foreground-rgb));
- background-color: var(--background-rgb);
-}
diff --git a/website/app/layout.tsx b/website/app/layout.tsx
deleted file mode 100644
index 32016f865..000000000
--- a/website/app/layout.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import "./globals.css";
-import type { Metadata } from "next";
-import { Inter, JetBrains_Mono } from "next/font/google";
-
-const inter = Inter({
- subsets: ["latin"],
- display: "swap",
- variable: "--font-inter",
-});
-
-const jetbrains_mono = JetBrains_Mono({
- subsets: ["latin"],
- display: "swap",
- weight: ["100", "600"],
- variable: "--font-jetbrains-mono",
-});
-
-export const metadata: Metadata = {
- title: "Ghostty",
- description: "👻",
-};
-
-export default function RootLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- return (
-
-
- {children}
-
-
- );
-}
diff --git a/website/app/page.tsx b/website/app/page.tsx
deleted file mode 100644
index cf2f59fc9..000000000
--- a/website/app/page.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import Image from "next/image";
-
-export default function Home() {
- return (
-
-
-
-
-
-
-
- );
-}
diff --git a/website/app/vt/bel/page.mdx b/website/app/vt/bel/page.mdx
deleted file mode 100644
index b1428c4bc..000000000
--- a/website/app/vt/bel/page.mdx
+++ /dev/null
@@ -1,26 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Bell (BEL)
-
-
-
-The purpose of the bell sequence is to raise the attention
-of the user. Historically, this would [ring a physical bell](https://en.wikipedia.org/wiki/Bell_character). Today, many alternate behaviors are
-acceptable:
-
-- An audible sound can be played through the speakers
-- Background or border of a window can visually flash
-- The terminal window can come into focus or be put on top
-- Application icon can bounce or otherwise draw attention
-- A desktop notification can be shown
-
-Normally, the bell behavior is configurable and can be disabled.
-
-## BEL as an OSC Terminator
-
-The `BEL` character is also a valid terminating character for
-OSC sequences, although `ST` is preferred. If `BEL` is the
-terminating character for an OSC sequence, any responses should
-also terminate with the `BEL` character.[^1]
-
-[^1]: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
diff --git a/website/app/vt/bs/page.mdx b/website/app/vt/bs/page.mdx
deleted file mode 100644
index 8fe1b0167..000000000
--- a/website/app/vt/bs/page.mdx
+++ /dev/null
@@ -1,9 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Backspace (BS)
-
-
-
-This sequence performs [cursor backward (CUB)](/vt/cub)
-with `n = 1`. There is no additional or different behavior for
-using `BS`.
diff --git a/website/app/vt/cbt/page.mdx b/website/app/vt/cbt/page.mdx
deleted file mode 100644
index d5dd4d890..000000000
--- a/website/app/vt/cbt/page.mdx
+++ /dev/null
@@ -1,83 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Backward Tabulation (CBT)
-
-
-
-Move the cursor `n` tabs left.
-
-The leftmost valid column for this operation is the first column. If
-[origin mode](#TODO) is enabled, then the leftmost valid column for this
-operation is the [left margin](#TODO).
-
-Move the cursor left until the cursor position is on a tabstop. If the
-cursor would move past the leftmost valid column, the cursor remains at
-the leftmost valid column and the operation completes. Repeat this process
-`n` times.
-
-Tabstops are dynamic and can be set with escape sequences such as
-[horizontal tab set (HTS)](/vt/hts), [tab clear (TBC)](/vt/tbc), etc.
-A terminal emulator may default tabstops at any interval, though an interval
-of 8 spaces is most common.
-
-## Validation
-
-### CBT V-1: Left Beyond First Column
-
-```bash
-printf "\033[?W" # reset tab stops
-printf "\033[10Z"
-printf "A"
-```
-
-```
-|Ac________|
-```
-
-### CBT V-2: Left Starting After Tab Stop
-
-```bash
-printf "\033[?W" # reset tab stops
-printf "\033[1;10H"
-printf "X"
-printf "\033[Z"
-printf "A"
-```
-
-```
-|________AX|
-```
-
-### CBT V-3: Left Starting on Tabstop
-
-```bash
-printf "\033[?W" # reset tab stops
-printf "\033[1;9H"
-printf "X"
-printf "\033[1;9H"
-printf "\033[Z"
-printf "A"
-```
-
-```
-|A_______X_|
-```
-
-### CBT V-4: Left Margin with Origin Mode
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?W" # reset tab stops
-printf "\033[?6h" # enable origin mode
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;6s" # scroll region left/right
-printf "\033[1;2H" # move cursor in region
-printf "X"
-printf "\033[Z"
-printf "A"
-```
-
-```
-|__AX______|
-```
diff --git a/website/app/vt/cht/page.mdx b/website/app/vt/cht/page.mdx
deleted file mode 100644
index 1e48cc4d7..000000000
--- a/website/app/vt/cht/page.mdx
+++ /dev/null
@@ -1,70 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Horizontal Tabulation (CHT)
-
-
-
-Move the cursor `n` tabs right.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-The rightmost valid column for this operation is the rightmost column in
-the terminal screen or the [right margin](#TODO), whichever is smaller.
-This sequence does not change behavior with [origin mode](#TODO) set.
-
-Move the cursor right until the cursor position is on a tabstop. If the
-cursor would move past the rightmost valid column, the cursor remains at
-the rightmost valid column and the operation completes. Repeat this process
-`n` times.
-
-Tabstops are dynamic and can be set with escape sequences such as
-[horizontal tab set (HTS)](/vt/hts), [tab clear (TBC)](/vt/tbc), etc.
-A terminal emulator may default tabstops at any interval, though an interval
-of 8 spaces is most common.
-
-## Validation
-
-### CHT V-1: Right Beyond Last Column
-
-```bash
-printf "\033[?W" # reset tab stops
-printf "\033[100I" # assuming the test terminal has less than 800 columns
-printf "A"
-```
-
-```
-|_________A|
-```
-
-### CHT V-2: Right From Before a Tabstop
-
-```bash
-printf "\033[?W" # reset tab stops
-printf "\033[1;2H"
-printf "A"
-printf "\033[I"
-printf "X"
-```
-
-```
-|_A______X_|
-```
-
-### CHT V-3: Right Margin
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?W" # reset tab stops
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;6s" # scroll region left/right
-printf "\033[1;1H" # move cursor in region
-printf "X"
-printf "\033[I"
-printf "A"
-```
-
-```
-|__AX______|
-```
diff --git a/website/app/vt/cnl/page.mdx b/website/app/vt/cnl/page.mdx
deleted file mode 100644
index 06f5ca9be..000000000
--- a/website/app/vt/cnl/page.mdx
+++ /dev/null
@@ -1,13 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Next Line (CNL)
-
-
-
-Move the cursor `n` cells down and to the beginning of the line.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-The logic of this sequence is identical to [Cursor Down (CUD)](/vt/cud)
-followed by [Carriage Return (CR)](/vt/cr).
diff --git a/website/app/vt/cpl/page.mdx b/website/app/vt/cpl/page.mdx
deleted file mode 100644
index b055f7e87..000000000
--- a/website/app/vt/cpl/page.mdx
+++ /dev/null
@@ -1,13 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Previous Line (CPL)
-
-
-
-Move the cursor `n` cells up and to the beginning of the line.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-The logic of this sequence is identical to [Cursor Up (CUU)](/vt/cuu)
-followed by [Carriage Return (CR)](/vt/cr).
diff --git a/website/app/vt/cr/page.mdx b/website/app/vt/cr/page.mdx
deleted file mode 100644
index 4338e07fd..000000000
--- a/website/app/vt/cr/page.mdx
+++ /dev/null
@@ -1,91 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Carriage Return (CR)
-
-
-
-Move the cursor to the leftmost column.
-
-This sequence always unsets the pending wrap state.
-
-If [origin mode (mode 6)](#TODO) is enabled, the cursor is set to the
-[left margin](#TODO) of the scroll region and the operation is complete.
-
-If origin mode is _not_ set and the cursor is on or to the right of the
-left margin, the cursor is set to the left margin. If the cursor is to the left
-of the left margin, the cursor is moved to the leftmost column in the terminal.
-
-## Validation
-
-### CR V-1: Pending Wrap is Unset
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G" # move to last column
-printf "A" # set pending wrap state
-printf "\r"
-printf "X"
-echo
-```
-
-```
-|X________A|
-|c_________|
-```
-
-### CR V-2: Left Margin
-
-```bash
-cols=$(tput cols)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margin mode
-printf "\033[2;5s" # set left/right margin
-printf "\033[4G"
-printf "A"
-printf "\r"
-printf "X"
-```
-
-```
-|_XcA______|
-```
-
-### CR V-3: Left of Left Margin
-
-```bash
-cols=$(tput cols)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margin mode
-printf "\033[2;5s" # set left/right margin
-printf "\033[4G"
-printf "A"
-printf "\033[1G"
-printf "\r"
-printf "X"
-```
-
-```
-|Xc_A______|
-```
-
-### CR V-3: Left Margin with Origin Mode
-
-```bash
-cols=$(tput cols)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?6h" # enable origin mode
-printf "\033[?69h" # enable left/right margin mode
-printf "\033[2;5s" # set left/right margin
-printf "\033[4G"
-printf "A"
-printf "\033[1G"
-printf "\r"
-printf "X"
-```
-
-```
-|_XcA______|
-```
diff --git a/website/app/vt/cub/page.mdx b/website/app/vt/cub/page.mdx
deleted file mode 100644
index c1e67c4b6..000000000
--- a/website/app/vt/cub/page.mdx
+++ /dev/null
@@ -1,182 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Backward (CUB)
-
-
-
-Move the cursor `n` cells left.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-This sequence always unsets the pending wrap state.
-
-The leftmost boundary the cursor can move to is determined by the current
-cursor column and the [left margin](#TODO). If the cursor begins to the left of the left margin, modify the left margin to be the leftmost column
-for the duration of the sequence. The leftmost column the cursor can be on
-is the left margin.
-
-With the above in place, there are three different cursor backward behaviors
-depending on the mode state of the terminal. The possible behaviors are listed
-below. In the case of a conflict, the top-most behavior takes priority.
-
-- **Extended reverse wrap**: [wraparound (mode 7)](#TODO) and [extended reverse wrap (mode 1045)](#TODO)
- are **BOTH** enabled
-- **Reverse wrap**: [wraparound (mode 7)](#TODO) and [reverse wrap (mode 45)](#TODO)
- are **BOTH** enabled
-- **No wrap**: The default behavior if the above wrapping behaviors
- do not have their conditions met.
-
-For the **no wrap** behavior, move the cursor to the left `n` cells while
-respecting the aforementioned leftmost boundary. Upon reaching the leftmost
-boundary, stop moving the cursor left regardless of the remaining value of `n`.
-The cursor row remains unchanged.
-
-For the **extended reverse wrap** behavior, move the cursor to the left `n`
-cells while respecting the aforementioned leftmost boundary. Upon reaching the
-leftmost boundary, if `n > 0` then move the cursor to the [right margin](#TODO)
-of the line above the cursor. If the cursor is already on the
-[top margin](#TODO), move the cursor to the right margin of the
-[bottom margin](#TODO). Both the cursor column and row can change in this
-mode. Compared to non-extended reverse wrap, the two critical differences are
-that extended reverse wrap doesn't require the previous line to be wrapped
-and extended reverse wrap will wrap around to the bottom margin.
-
-For the **reverse wrap** (non-extended) behavior, move the cursor to the left `n`
-cells while respecting the aforementioned leftmost boundary. Upon reaching the
-leftmost boundary, if `n > 0` and the previous line was wrapped, then move the
-cursor to the [right margin](#TODO) of the line above the cursor. If the previous
-line was not wrapped, the cursor left operation is complete even if there
-is a remaining value of `n`. If the cursor
-is already on the [top margin](#TODO), do not move the cursor up.
-This wrapping mode does not wrap the cursor row back to the bottom margin.
-
-For **extended reverse wrap** or **reverse wrap** modes, if the pending
-wrap state is set, decrease `n` by 1. In these modes, the initial cursor
-backward count is consumed by the pending wrap state, as if you pressed
-"backspace" on an empty newline and the cursor moved back to the previous line.
-
-## Validation
-
-### CUB V-1: Pending Wrap is Unset
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G" # move to last column
-printf "A" # set pending wrap state
-printf "\033[D" # move back one
-printf "XYZ"
-```
-
-```
-|________XY|
-|Zc________|
-```
-
-### CUB V-2: Leftmost Boundary with Reverse Wrap Disabled
-
-```bash
-printf "\033[?45l" # disable reverse wrap
-echo "A"
-printf "\033[10D" # back
-printf "B"
-```
-
-```
-|A_________|
-|Bc________|
-```
-
-### CUB V-3: Reverse Wrap
-
-```bash
-cols=$(tput cols)
-printf "\033[?7h" # enable wraparound
-printf "\033[?45h" # enable reverse wrap
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[${cols}G" # move to end of line
-printf "AB" # write and wrap
-printf "\033[D" # move back two
-printf "X"
-```
-
-```
-|_________Xc
-|B_________|
-```
-
-### CUB V-4: Extended Reverse Wrap Single Line
-
-```bash
-printf "\033[?7h" # enable wraparound
-printf "\033[?1045h" # enable extended reverse wrap
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-echo "A"
-printf "B"
-printf "\033[2D" # move back two
-printf "X"
-```
-
-```
-|A________Xc
-|B_________|
-```
-
-### CUB V-5: Extended Reverse Wrap Wraps to Bottom
-
-```bash
-cols=$(tput cols)
-printf "\033[?7h" # enable wraparound
-printf "\033[?1045h" # enable extended reverse wrap
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[1;3r" # set scrolling region
-echo "A"
-printf "B"
-printf "\033[D" # move back one
-printf "\033[${cols}D" # move back entire width
-printf "\033[D" # move back one
-printf "X"
-```
-
-```
-|A_________|
-|B_________|
-|_________Xc
-```
-
-### CUB V-6: Reverse Wrap Outside of Margins
-
-```bash
-printf "\033[1;1H"
-printf "\033[0J"
-printf "\033[?45h"
-printf "\033[3r"
-printf "\b"
-printf "X"
-```
-
-```
-|__________|
-|__________|
-|Xc________|
-```
-
-### CUB V-7: Reverse Wrap with Pending Wrap State
-
-```bash
-
-cols=$(tput cols)
-printf "\033[?45h"
-printf "\033[${cols}G"
-printf "\033[4D"
-printf "ABCDE"
-printf "\033[D"
-printf "X"
-```
-
-```
-|_____ABCDX|
-```
diff --git a/website/app/vt/cud/page.mdx b/website/app/vt/cud/page.mdx
deleted file mode 100644
index 63c51c562..000000000
--- a/website/app/vt/cud/page.mdx
+++ /dev/null
@@ -1,75 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Down (CUD)
-
-
-
-Move the cursor `n` cells down.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-This sequence always unsets the pending wrap state.
-
-If the current cursor position is at or above the [bottom margin](#TODO),
-the lowest point the cursor can move is the bottom margin. If the current
-cursor position is below the bottom margin, the lowest point the cursor
-can move is the final row.
-
-This sequence never triggers scrolling.
-
-## Validation
-
-### CUD V-1: Cursor Down
-
-```bash
-printf "A"
-printf "\033[2B" # cursor down
-printf "X"
-```
-
-```
-|A_________|
-|__________|
-|_Xc_______|
-```
-
-### CUD V-2: Cursor Down Above Bottom Margin
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\n\n\n\n" # screen is 4 high
-printf "\033[1;3r" # set scrolling region
-printf "A"
-printf "\033[5B" # cursor down
-printf "X"
-```
-
-```
-|A_________|
-|__________|
-|_Xc_______|
-|__________|
-```
-
-### CUD V-3: Cursor Down Below Bottom Margin
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\n\n\n\n\n" # screen is 5 high
-printf "\033[1;3r" # set scrolling region
-printf "A"
-printf "\033[4;1H" # move below region
-printf "\033[5B" # cursor down
-printf "X"
-```
-
-```
-|A_________|
-|__________|
-|__________|
-|__________|
-|_Xc_______|
-```
diff --git a/website/app/vt/cuf/page.mdx b/website/app/vt/cuf/page.mdx
deleted file mode 100644
index 6e660c4f9..000000000
--- a/website/app/vt/cuf/page.mdx
+++ /dev/null
@@ -1,83 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Forward (CUF)
-
-
-
-Move the cursor `n` cells right.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-This sequence always unsets the pending wrap state.
-
-The rightmost boundary the cursor can move to is determined by the current
-cursor column and the [right margin](#TODO). If the cursor begins to the right
-of the right margin, modify the right margin to be the rightmost column
-of the screen for the duration of the sequence. The rightmost column the cursor
-can be on is the right margin.
-
-Move the cursor `n` cells to the right up to and including the rightmost boundary.
-This sequence never wraps or modifies cell content. This sequence is not affected
-by any terminal modes.
-
-## Validation
-
-### CUF V-1: Pending Wrap is Unset
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G" # move to last column
-printf "A" # set pending wrap state
-printf "\033[C" # move forward one
-printf "XYZ"
-```
-
-```
-|_________X|
-|YZ________|
-```
-
-### CUF V-2: Rightmost Boundary with Reverse Wrap Disabled
-
-```bash
-printf "A"
-printf "\033[500C" # forward larger than screen width
-printf "B"
-```
-
-```
-|A________Bc
-```
-
-### CUF V-3: Left of the Right Margin
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;5s" # scroll region left/right
-printf "\033[1G" # move to left
-printf "\033[500C" # forward larger than screen width
-printf "X"
-```
-
-```
-|____X_____|
-```
-
-### CUF V-4: Right of the Right Margin
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;5s" # scroll region left/right
-printf "\033[6G" # move to right of margin
-printf "\033[500C" # forward larger than screen width
-printf "X"
-```
-
-```
-|_________X|
-```
diff --git a/website/app/vt/cup/page.mdx b/website/app/vt/cup/page.mdx
deleted file mode 100644
index 1a6c3c5a6..000000000
--- a/website/app/vt/cup/page.mdx
+++ /dev/null
@@ -1,127 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Position (CUP)
-
-
-
-Move the cursor to row `y` and column `x`.
-
-The parameters `y` and `x` must be integers greater than or equal to 1.
-If either is less than or equal to 0, adjust that parameter to be 1.
-
-The values `y` and `x` are both one-based. For example, the top row is row 1
-and the leftmost column on the screen is column 1.
-
-This sequence always unsets the pending wrap state.
-
-If [origin mode](#TODO) is **NOT** set, the cursor is moved exactly to the
-row and column specified by `y` and `x`. The maximum value for `y` is the
-bottom row of the screen and the maximum value for `x` is the rightmost
-column of the screen.
-
-If [origin mode](#TODO) is set, the cursor position is set relative
-to the top-left corner of the scroll region. `y = 1` corresponds to
-the [top margin](#TODO) and `x = 1` corresponds to the [left margin](#TODO).
-The maximum value for `y` is the [bottom margin](#TODO) and the maximum
-value for `x` is the [right margin](#TODO).
-
-When origin mode is set, it is impossible set a cursor position using
-this sequence outside the boundaries of the scroll region.
-
-## Validation
-
-### CUP V-1: Normal Usage
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[2;3H"
-printf "A"
-```
-
-```
-|__________|
-|__Ac______|
-```
-
-### CUP V-2: Off the Screen
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[500;500H"
-printf "A"
-```
-
-```
-|__________|
-|__________|
-|_________Ac
-```
-
-### CUP V-3: Relative to Origin
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[2;3r" # scroll region top/bottom
-printf "\033[?6h" # origin mode
-printf "\033[1;1H" # move to top-left
-printf "X"
-```
-
-```
-|__________|
-|X_________|
-```
-
-### CUP V-4: Relative to Origin with Left/Right Margins
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;5s" # scroll region left/right
-printf "\033[2;3r" # scroll region top/bottom
-printf "\033[?6h" # origin mode
-printf "\033[1;1H" # move to top-left
-printf "X"
-```
-
-```
-|__________|
-|__X_______|
-```
-
-### CUP V-5: Limits with Scroll Region and Origin Mode
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;5s" # scroll region left/right
-printf "\033[2;3r" # scroll region top/bottom
-printf "\033[?6h" # origin mode
-printf "\033[500;500H" # move to top-left
-printf "X"
-```
-
-```
-|__________|
-|__________|
-|____X_____|
-```
-
-### CUP V-6: Pending Wrap is Unset
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G" # move to last column
-printf "A" # set pending wrap state
-printf "\033[1;1H"
-printf "X"
-```
-
-```
-|Xc_______X|
-```
diff --git a/website/app/vt/cuu/page.mdx b/website/app/vt/cuu/page.mdx
deleted file mode 100644
index 4a46efb06..000000000
--- a/website/app/vt/cuu/page.mdx
+++ /dev/null
@@ -1,78 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Cursor Up (CUU)
-
-
-
-Move the cursor `n` cells up.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-This sequence always unsets the pending wrap state.
-
-If the current cursor position is at or below the [top margin](#TODO),
-the highest point the cursor can move is the top margin. If the current
-cursor position is above the top margin, the highest point the cursor
-can move is the first row.
-
-## Validation
-
-### CUU V-1: Cursor Up
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[3;1H"
-printf "A"
-printf "\033[2A" # cursor up
-printf "X"
-```
-
-```
-|_Xc_______|
-|__________|
-|A_________|
-```
-
-### CUU V-2: Cursor Up Below Top Margin
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\n\n\n\n" # screen is 4 high
-printf "\033[2;4r" # set scrolling region
-printf "\033[3;1H"
-printf "A"
-printf "\033[5A" # cursor up
-printf "X"
-```
-
-```
-|__________|
-|_Xc_______|
-|A_________|
-|__________|
-```
-
-### CUU V-3: Cursor Up Above Top Margin
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\n\n\n\n\n" # screen is 5 high
-printf "\033[3;5r" # set scrolling region
-printf "\033[3;1H"
-printf "A"
-printf "\033[2;1H" # move above region
-printf "\033[5A" # cursor up
-printf "X"
-```
-
-```
-|Xc________|
-|__________|
-|A_________|
-|__________|
-|__________|
-```
diff --git a/website/app/vt/dch/page.mdx b/website/app/vt/dch/page.mdx
deleted file mode 100644
index 3cb5b5278..000000000
--- a/website/app/vt/dch/page.mdx
+++ /dev/null
@@ -1,106 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Delete Character (DCH)
-
-
-
-Deletes `n` characters at the current cursor position and shifts existing
-cell contents left.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-If the current cursor position is outside of the current scroll region,
-this sequence does nothing. The cursor is outside of the current scroll
-region if it is left of the [left margin](#TODO), or right of the
-[right margin](#TODO).
-
-This sequence unsets the pending wrap state. This sequence does _not_ unset
-the pending wrap state if the cursor position is outside of the current
-scroll region. This has to be called out explicitly because this behavior
-differs from [Insert Character (ICH)](/vt/ich).
-
-Only cells within the scroll region are deleted or shifted. Cells to the
-right of the right margin are unmodified.
-The blank cells inserted from the right margin are blank with the background
-color colored according to the current SGR state.
-
-If a multi-cell character (such as "橋") is shifted so that the cell is split
-in half, the multi-cell character can either be clipped or erased. Typical
-behavior is to clip at the right edge of the screen and erase at a right
-margin, but either behavior is acceptable.
-
-## Validation
-
-### DCH V-1: Simple Delete Character
-
-```bash
-printf "ABC123"
-printf "\033[3G"
-printf "\033[2P"
-```
-
-```
-|AB23____|
-```
-
-### DCH V-2: SGR State
-
-```bash
-printf "ABC123"
-printf "\033[3G"
-printf "\033[41m"
-printf "\033[2P"
-```
-
-```
-|AB23____|
-```
-
-The two rightmost cells should have a red background color.
-
-### DCH V-3: Outside Left/Right Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC123"
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;5s" # scroll region left/right
-printf "\033[2G"
-printf "\033[P"
-```
-
-```
-|ABC123__|
-```
-
-### DCH V-4: Inside Left/Right Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC123"
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;5s" # scroll region left/right
-printf "\033[4G"
-printf "\033[P"
-```
-
-```
-|ABC2_3__|
-```
-
-### DCH V-5: Split Wide Character
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "A橋123"
-printf "\033[3G"
-printf "\033[P"
-```
-
-```
-|A_123_____|
-```
diff --git a/website/app/vt/decaln/page.mdx b/website/app/vt/decaln/page.mdx
deleted file mode 100644
index 5b036c7e2..000000000
--- a/website/app/vt/decaln/page.mdx
+++ /dev/null
@@ -1,45 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Screen Alignment Test (DECALN)
-
-
-
-Reset margins, move cursor to the top left, and fill the screen with `E`.
-
-Reset the top, bottom, left, and right margins and unset [origin mode](#TODO).
-The cursor is moved to the top-left corner of the screen.
-
-All stylistic SGR attributes are unset, such as bold, blink, etc.
-SGR foreground and background colors are preserved.
-The [protected attribute](#TODO) is not unset.
-
-The entire screen is filled with the character `E`. The letter `E` ignores
-the current SGR settings and is written with no styling.
-
-## Validation
-
-### DECALN V-1: Simple Usage
-
-```bash
-printf "\033#8"
-```
-
-```
-|EEEEEEEE|
-|EEEEEEEE|
-|EEEEEEEE|
-```
-
-### DECALN V-2: Reset Margins
-
-```bash
-printf "\033[2;3r" # scroll region top/bottom
-printf "\033#8"
-printf "\033[T"
-```
-
-```
-|c_______|
-|EEEEEEEE|
-|EEEEEEEE|
-```
diff --git a/website/app/vt/deckpam/page.mdx b/website/app/vt/deckpam/page.mdx
deleted file mode 100644
index 06abae27e..000000000
--- a/website/app/vt/deckpam/page.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Keypad Application Mode (DECKPAM)
-
-
-
-Sets keypad application mode.
diff --git a/website/app/vt/deckpnm/page.mdx b/website/app/vt/deckpnm/page.mdx
deleted file mode 100644
index 5e9efd377..000000000
--- a/website/app/vt/deckpnm/page.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Keypad Numeric Mode (DECKPNM)
-
-"]} />
-
-Sets keypad numeric mode.
diff --git a/website/app/vt/decrc/page.mdx b/website/app/vt/decrc/page.mdx
deleted file mode 100644
index 4b6cace82..000000000
--- a/website/app/vt/decrc/page.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Restore Cursor (DECRC)
-
-
-
-Restore the cursor-related state saved via [Save Cursor (DECSC)](/vt/decsc).
-
-If a cursor was never previously saved, this sets all the typically saved
-values to their default values.
-
-## Validation
-
-Validation is shared with [Save Cursor (DECSC)](/vt/decsc).
diff --git a/website/app/vt/decsc/page.mdx b/website/app/vt/decsc/page.mdx
deleted file mode 100644
index d7ba4f068..000000000
--- a/website/app/vt/decsc/page.mdx
+++ /dev/null
@@ -1,83 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Save Cursor (DECSC)
-
-
-
-Save various cursor-related state that can be restored with
-[Restore Cursor (DECRC)](/vt/decrc).
-
-The following attributes are saved:
-
-- Cursor row and column in absolute screen coordinates
-- Character sets
-- Pending wrap state
-- SGR attributes
-- [Origin mode (DEC Mode 6)](/vt/modes/origin)
-
-Only one cursor can be saved at any time. If save cursor is repeated, the
-previously save cursor is overwritten.
-
-Primary and alternate screens have separate saved cursor state. A cursor
-saved on the primary screen is inaccessible from the alternate screen
-and vice versa.
-
-## Validation
-
-### SC V-1: Cursor Position
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[1;5H"
-printf "A"
-printf "\0337" # Save Cursor
-printf "\033[1;1H"
-printf "B"
-printf "\0338" # Restore Cursor
-printf "X"
-```
-
-```
-|B___AX____|
-```
-
-### SC V-2: Pending Wrap State
-
-```bash
-cols=$(tput cols)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[${cols}G"
-printf "A"
-printf "\0337" # Save Cursor
-printf "\033[1;1H"
-printf "B"
-printf "\0338" # Restore Cursor
-printf "X"
-```
-
-```
-|B________A|
-|X_________|
-```
-
-### SC V-3: SGR Attributes
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[1;4;33;44m"
-printf "A"
-printf "\0337" # Save Cursor
-printf "\033[0m"
-printf "B"
-printf "\0338" # Restore Cursor
-printf "X"
-```
-
-```
-|AX________|
-```
-
-The "A" and "X" should have identical styling.
diff --git a/website/app/vt/decscusr/page.mdx b/website/app/vt/decscusr/page.mdx
deleted file mode 100644
index ffa1d963f..000000000
--- a/website/app/vt/decscusr/page.mdx
+++ /dev/null
@@ -1,24 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Set Cursor Style (DECSCUSR)
-
-
-
-Set the mouse cursor style.
-
-If `n` is omitted, `n` defaults to `0`. `n` must be an integer between
-0 and 6 (inclusive). The mapping of `n` to cursor style is below:
-
-| n | style |
-| --- | --------------------- |
-| 0 | terminal default |
-| 1 | blinking block |
-| 2 | steady block |
-| 3 | blinking underline |
-| 4 | steady underline |
-| 5 | blinking vertical bar |
-| 6 | steady vertical bar |
-
-For `n = 0`, the terminal default is up to the terminal and is inconsistent
-across terminal implementations. The default may also be impacted by terminal
-configuration.
diff --git a/website/app/vt/decslrm/page.mdx b/website/app/vt/decslrm/page.mdx
deleted file mode 100644
index 2729d08c8..000000000
--- a/website/app/vt/decslrm/page.mdx
+++ /dev/null
@@ -1,120 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Set Left and Right Margins (DECSLRM)
-
-
-
-Sets the left and right margins, otherwise known as the scroll region.
-To learn more about scroll regions in general, see
-[Set Top and Bottom Margins](/vt/decstbm).
-
-Parameters `l` and `r` are integer values. If either value is zero the
-value will be reset to default values. The default value for `l` is `1`
-and the default value of `r` is the number of columns in the screen.
-
-Values `l` and `r` can be omitted. If either value is omitted, their
-default values will be used. Note that it is impossible to omit `l`
-and not omit `r`.
-
-This sequence requires [enable left and right margin (mode 69)](#TODO)
-to be set. If mode 69 is not set, this sequence does nothing and left
-and right margins will not be set.
-
-This sequence conflicts with [save cursor (`CSI s`)](#TODO). If
-mode 69 is disabled, save cursor will be invoked. If mode 69 is enabled,
-the `CSI s` save cursor sequence will be disabled, but save cursor is always
-also available as `ESC 7`.
-
-If left is larger or equal to right, this sequence does nothing. A
-scroll region must be at least two columns (`r` must be greater than `l`).
-The rest of this sequence description assumes valid values for `l` and `r`.
-
-This sequence unsets the pending wrap state and moves the cursor to
-the top-left of the screen. If [origin mode](#TODO) is set, the cursor is
-moved to the top-left of the scroll region.
-
-To reset the left and right margins, call this sequence with both values set to
-"0". This will force the default values for both `l` and `r` which is
-the full screen. Unsetting mode 69 will also reset the left and right margins.
-
-## Validation
-
-### DECSLRM V-1: Full Screen
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[s" # scroll region left/right
-printf "\033[X"
-```
-
-```
-|cBC_____|
-|DEF_____|
-|GHI_____|
-```
-
-### DECSLRM V-2: Left Only
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[2s" # scroll region left/right
-printf "\033[2G" # move cursor to column 2
-printf "\033[L"
-```
-
-```
-|Ac______|
-|DBC_____|
-|GEF_____|
-| HI_____|
-```
-
-### DECSLRM V-3: Left And Right
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[1;2s" # scroll region left/right
-printf "\033[2G" # move cursor to column 2
-printf "\033[L"
-```
-
-```
-|_cC_____|
-|ABF_____|
-|DEI_____|
-|GH______|
-```
-
-### DECSLRM V-4: Left Equal to Right
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[2;2s" # scroll region left/right
-printf "\033[X"
-```
-
-```
-|cBC_____|
-|DEF_____|
-|GHI_____|
-```
diff --git a/website/app/vt/decstbm/page.mdx b/website/app/vt/decstbm/page.mdx
deleted file mode 100644
index 071667a83..000000000
--- a/website/app/vt/decstbm/page.mdx
+++ /dev/null
@@ -1,111 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Set Top and Bottom Margins (DECSTBM)
-
-
-
-Sets the top and bottom margins, otherwise known as the scroll region.
-
-Parameters `t` and `b` are integer values. If either value is zero the
-value will be reset to default values. The default value for `t` is `1`
-and the default value of `b` is the number of rows in the screen.
-
-Values `t` and `b` can be omitted. If either value is omitted, their
-default values will be used. Note that it is impossible to omit `t`
-and not omit `b`. The only valid sequences are `CSI t ; b r`,
-`CSI t r` and `CSI r`.
-
-If top is larger or equal to bottom, this sequence does nothing. A
-scroll region must be at least two rows (`b` must be greater than `t`).
-The rest of this sequence description assumes valid values for `t` and `b`.
-
-This sequence unsets the pending wrap state and moves the cursor to
-the top-left of the screen. If [origin mode](#TODO) is set, the cursor is
-moved to the top-left of the scroll region.
-
-To reset the scroll region, call this sequence with both values set to
-"0". This will force the default values for both `t` and `b` which is
-the full screen.
-
-The top and bottom margin constitute what is known as the _scroll region_.
-The scroll region impacts the operation of many sequences such as
-[insert line](/vt/il), [cursor down](/vt/cud), etc. Scroll regions are
-an effective and efficient way to constraint terminal modifications to a
-rectangular region of the screen.
-
-## Validation
-
-### DECSTBM V-1: Full Screen
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[r" # scroll region top/bottom
-printf "\033[T"
-```
-
-```
-|c_______|
-|ABC_____|
-|DEF_____|
-|GHI_____|
-```
-
-### DECSTBM V-2: Top Only
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2r" # scroll region top/bottom
-printf "\033[T"
-```
-
-```
-|ABC_____|
-|________|
-|DEF_____|
-|GHI_____|
-```
-
-### DECSTBM V-3: Top and Bottom
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[1;2r" # scroll region top/bottom
-printf "\033[T"
-```
-
-```
-|________|
-|ABC_____|
-|GHI_____|
-```
-
-### DECSTBM V-4: Top Equal to Bottom
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;2r" # scroll region top/bottom
-printf "\033[T"
-```
-
-```
-|________|
-|ABC_____|
-|DEF_____|
-|GHI_____|
-```
diff --git a/website/app/vt/dl/page.mdx b/website/app/vt/dl/page.mdx
deleted file mode 100644
index 00c3e6288..000000000
--- a/website/app/vt/dl/page.mdx
+++ /dev/null
@@ -1,113 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Delete Line (DL)
-
-
-
-Deletes `n` lines at the current cursor position and shifts existing
-lines up.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-If the current cursor position is outside of the current scroll region,
-this sequence does nothing. The cursor is outside of the current scroll
-region if it is above the [top margin](#TODO), below the [bottom margin](#TODO),
-left of the [left margin](#TODO), or right of the [right margin](#TODO).
-
-This sequence unsets the pending wrap state.
-
-This sequence moves the cursor column to the left margin.
-
-Remove the top `n` lines of the current scroll region, and shift existing
-lines up. The space created at the bottom of the scroll region should be
-blank with the background color set according to the current SGR state.
-
-If a [left margin](#TODO) or [right margin](#TODO) is set, only the cells
-within and including the margins are deleted or shifted.
-Other existing contents to the left of the left margin or right of the
-right margin remains untouched.
-
-If a multi-cell character would be split, erase the full multi-cell
-character. For example, if "橋" is printed to the left of the left margin
-and shifting the line down as a result of DL would split the character,
-the cell should be erased.
-
-## Validation
-
-### DL V-1: Simple Delete Line
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;2H"
-printf "\033[M"
-```
-
-```
-|ABC_____|
-|GHI_____|
-```
-
-### DL V-2: Cursor Outside of Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[3;4r" # scroll region top/bottom
-printf "\033[2;2H"
-printf "\033[M"
-```
-
-```
-|ABC_____|
-|DEF_____|
-|GHI_____|
-```
-
-### DL V-3: Top/Bottom Scroll Regions
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "123\n"
-printf "\033[1;3r" # scroll region top/bottom
-printf "\033[2;2H"
-printf "\033[M"
-```
-
-```
-|ABC_____|
-|GHI_____|
-|________|
-|123_____|
-```
-
-### DL V-4: Left/Right Scroll Regions
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC123\n"
-printf "DEF456\n"
-printf "GHI789\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[2;4s" # scroll region left/right
-printf "\033[2;2H"
-printf "\033[M"
-```
-
-```
-|ABC123__|
-|DHI756__|
-|G___89__|
-```
diff --git a/website/app/vt/dsr/page.mdx b/website/app/vt/dsr/page.mdx
deleted file mode 100644
index 58ee0d271..000000000
--- a/website/app/vt/dsr/page.mdx
+++ /dev/null
@@ -1,46 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Device Status Report (DSR)
-
-
-
-Request information from the terminal depending on the value of `n`.
-
-The possible valid values of `n` are described in the paragraphs below. If
-any other value of `n` is provided, this sequence does nothing.
-
-If `n = 5`, the _operating status_ is requested. The terminal responds
-to the program with `ESC [ 0 n` to indicate no malfunctions.
-
-If `n = 6`, the _cursor position_ is requested. The terminal responds to
-the program in the format `ESC [ y ; x R` where `y` is the row and `x`
-is the column, both one-indexed. If [origin mode (DEC Mode 6)](/vt/modes/origin)
-is enabled, the reported cursor position is relative to the top-left of the
-scroll region.
-
-## Validation
-
-### DSR V-1: Operating Status
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[5n"
-```
-
-```
-|^[[0n_____|
-```
-
-### DSR V-2: Cursor Position
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[2;4H" # move to top-left
-printf "\033[6n"
-```
-
-```
-^[[2;4R
-```
diff --git a/website/app/vt/ech/page.mdx b/website/app/vt/ech/page.mdx
deleted file mode 100644
index ba7481075..000000000
--- a/website/app/vt/ech/page.mdx
+++ /dev/null
@@ -1,158 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Erase Character (ECH)
-
-
-
-Blank `n` cells beginning with (including) and to the right of the cursor.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-The rightmost column that can be erased is the rightmost column of the screen.
-The [right margin](#) has no effect on this sequence.
-
-This sequence always unsets the pending wrap state. If the row under the cursor
-is soft-wrapped, then the soft-wrap state is also reset.
-
-For `n` cells up to the rightmost column, blank the cell by replacing it
-with an empty character with the background color colored according to the
-current SGR state. No other SGR attributes are preserved.
-
-If a multi-cell character would be split, erase the full multi-cell
-character. For example, if "橋" is printed and ECH `n = 1` is issued,
-the full character should be erased even though it takes up two cells.
-Both erased cells are colored with the current background color according
-to the current SGR state.
-
-If [Select Character Selection Attribute (DECSCA)](#TODO) is enabled
-or was the most recently enabled protection mode on the currently active screen,
-protected attributes are ignored as if they were never set and the cells
-with them are erased. It does not matter if DECSCA is currently disabled,
-protected attributes are still ignored so long as DECSCA was the
-_most recently enabled_ protection mode.
-
-If DECSCA is not currently enabled and was not the most recently enabled protection
-mode on the currently active screen, cells with the protected attribute set are
-respected and not erased but still count towards `n`. It does not matter if the
-protection attribute for a cell was originally set from DECSCA.
-
-## Validation
-
-### ECH V-1: Simple Operation
-
-```bash
-printf "ABC"
-printf "\033[1G"
-printf "\033[2X"
-```
-
-```
-|c_C_____|
-```
-
-### ECH V-2: Erasing Beyond Edge of Screen
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G"
-printf "\033[2D"
-printf "ABC"
-printf "\033[D"
-printf "\033[10X"
-```
-
-```
-|_____Ac_|
-```
-
-### ECH V-3: Reset Pending Wrap State
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G" # move to last column
-printf "A" # set pending wrap state
-printf "\033[X"
-printf "X"
-```
-
-```
-|_______Xc
-```
-
-### ECH V-4: SGR State
-
-```bash
-printf "ABC"
-printf "\033[1G"
-printf "\033[41m"
-printf "\033[2X"
-```
-
-```
-|c_C_____|
-```
-
-The `c_` cells should both have a red background. All other cells
-remain unchanged in style.
-
-### ECH V-5: Multi-cell Character
-
-```bash
-printf "橋BC"
-printf "\033[1G"
-printf "\033[X"
-printf "X"
-```
-
-```
-|XcBC____|
-```
-
-### ECH V-6: Left/Right Scroll Region Ignored
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margins
-printf "\033[1;3s" # scroll region left/right
-printf "\033[4G"
-printf "ABC"
-printf "\033[1G"
-printf "\033[4X"
-```
-
-```
-|c___BC____|
-```
-
-### ECH V-7: Protected Attributes Ignored with DECSCA
-
-```bash
-printf "\033V"
-printf "ABC"
-printf "\033[1\"q"
-printf "\033[0\"q"
-printf "\033[1G"
-printf "\033[2X"
-```
-
-```
-|c_C_______|
-```
-
-### ECH V-8: Protected Attributes Respected without DECSCA
-
-```bash
-printf "\033[1\"q"
-printf "ABC"
-printf "\033V"
-printf "\033[1G"
-printf "\033[2X"
-```
-
-```
-|ABC_______|
-```
-
-The cursor remains at `A`.
diff --git a/website/app/vt/ed/page.mdx b/website/app/vt/ed/page.mdx
deleted file mode 100644
index a9323435b..000000000
--- a/website/app/vt/ed/page.mdx
+++ /dev/null
@@ -1,139 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Erase Display (ED)
-
-
-
-Erase display contents with behavior depending on the command `n`.
-
-If `n` is unset, the value of `n` is 0. The only valid values for `n` are
-0, 1, 2, or 3. If any other value of `n` is given, do not execute this sequence.
-The remainder of the sequence documentation assumes a valid value of `n`.
-
-For all valid values of `n` except 3, this sequence unsets the pending wrap state.
-The cursor position will remain unchanged under all circumstances throughout
-this sequence.
-
-If [Select Character Selection Attribute (DECSCA)](#TODO) is enabled
-or was the most recently enabled protection mode on the currently active screen,
-protected attributes are ignored. Otherwise, protected attributes will be
-respected. For more details on this specific logic for protected attribute
-handling, see [Erase Character (ECH)](/vt/ech).
-
-For all operations, if a multi-cell character would be split, erase the full multi-cell
-character. For example, if "橋" is printed and the erase would only erase the
-first or second cell of the two-cell character, both cells should be erased.
-
-This sequence does not respect any scroll regions (top, bottom, left, or
-right). The boundaries of the operation are the full visible screen.
-
-If `n` is `0`, perform an **erase display below** operation. Erase all
-cells to the right and below the cursor. The background color of erased cells
-is colored according to the current SGR state.
-
-If `n` is `1`, perform an **erase display above** operation. Erase all
-cells to the left and above the cursor. The background color of erased cells
-is colored according to the current SGR state.
-
-If `n` is `2`, **erase the entire display**. This is the equivalent of
-erase above (`n = 1`) and erase below (`n = 0`) both being executed.
-
-If `n` is `3`, **erase only the scrollback region**. This does not affect
-the visible display of the screen and does not move the cursor. The scrollback
-region is the region of the terminal that is currently above the visible
-area of the screen when the screen is scrolled completely to the bottom.
-
-## Validation
-
-### ED V-1: Simple Erase Below
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;2H"
-printf "\033[0J"
-```
-
-```
-|ABC_____|
-|Dc______|
-|________|
-```
-
-### ED V-2: Erase Below SGR State
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;2H"
-printf "\033[41m"
-printf "\033[0J"
-```
-
-```
-|ABC_____|
-|Dc______|
-|________|
-```
-
-All the cells right and below of the cursor should be colored red.
-
-### ED V-3: Erase Below Multi-Cell Character
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "AB橋C\n"
-printf "DE橋F\n"
-printf "GH橋I\n"
-printf "\033[2;4H"
-printf "\033[0J"
-```
-
-```
-|AB橋C___|
-|DE_c____|
-|________|
-```
-
-### ED V-4: Simple Erase Above
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;2H"
-printf "\033[1J"
-```
-
-```
-|________|
-|_cF_____|
-|GHI_____|
-```
-
-### ED V-5: Simple Erase Complete
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;2H"
-printf "\033[2J"
-```
-
-```
-|________|
-|_c______|
-|________|
-```
diff --git a/website/app/vt/el/page.mdx b/website/app/vt/el/page.mdx
deleted file mode 100644
index 2d690a1b1..000000000
--- a/website/app/vt/el/page.mdx
+++ /dev/null
@@ -1,227 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Erase Line (EL)
-
-
-
-Erase line contents with behavior depending on the command `n`.
-
-If `n` is unset, the value of `n` is 0. The only valid values for `n` are
-0, 1, or 2. If any other value of `n` is given, do not execute this sequence.
-The remainder of the sequence documentation assumes a valid value of `n`.
-
-For all valid values of `n`, this sequence unsets the pending wrap state.
-The cursor position will remain unchanged under all circumstances throughout
-this sequence.
-
-If [Select Character Selection Attribute (DECSCA)](#TODO) is enabled
-or was the most recently enabled protection mode on the currently active screen,
-protected attributes are ignored. Otherwise, protected attributes will be
-respected. For more details on this specific logic for protected attribute
-handling, see [Erase Character (ECH)](/vt/ech).
-
-For all operations, if a multi-cell character would be split, erase the full multi-cell
-character. For example, if "橋" is printed and the erase would only erase the
-first or second cell of the two-cell character, both cells should be erased.
-
-If `n` is `0`, perform an **erase line right** operation. Erase line right
-is equivalent to [Erase Character (ECH)](/vt/ech) with `n` set to the total
-remaining columns from the cursor to the end of the line (and including
-the cursor). If the line is softwrapped, only the single row is erased;
-it does not erase through the wrap. Further, the wrap state of the row is
-reset such that the line is no longer considered wrapped.
-
-If `n` is `1`, perform an **erase line left** operation. This replaces
-the `n` cells left of and including the cursor with a blank character and
-colors the background according to the current SGR state. The leftmost
-column that can be blanked is the first column of the screen. The
-[left margin](#TODO) has no effect on this operation.
-
-If `n` is `2`, **erase the entire line**. This is the equivalent of
-erase left (`n = 1`) and erase right (`n = 0`) both being executed.
-
-## Validation
-
-### EL V-1: Simple Erase Right
-
-```bash
-printf "ABCDE"
-printf "\033[3G"
-printf "\033[0K"
-```
-
-```
-|ABc_____|
-```
-
-### EL V-2: Erase Right Resets Pending Wrap
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G" # move to last column
-printf "A" # set pending wrap state
-printf "\033[0K"
-printf "X"
-```
-
-```
-|_______X|
-```
-
-The cursor should be on the 'X'
-
-### EL V-3: Erase Right SGR State
-
-```bash
-printf "ABC"
-printf "\033[2G"
-printf "\033[41m"
-printf "\033[0K"
-```
-
-```
-|Ac______|
-```
-
-The cells from `c` onwards should have a red background all the way to
-the right edge of the screen.
-
-### EL V-4: Erase Right Multi-cell Character
-
-```bash
-printf "AB橋DE"
-printf "\033[4G"
-printf "\033[0K"
-```
-
-```
-|AB_c____|
-```
-
-### EL V-5: Erase Right Left/Right Scroll Region Ignored
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABCDE"
-printf "\033[?69h" # enable left/right margins
-printf "\033[1;3s" # scroll region left/right
-printf "\033[2G"
-printf "\033[0K"
-```
-
-```
-|Ac________|
-```
-
-### EL V-6: Erase Right Protected Attributes Ignored with DECSCA
-
-```bash
-printf "\033V"
-printf "ABCDE"
-printf "\033[1\"q"
-printf "\033[0\"q"
-printf "\033[2G"
-printf "\033[0K"
-```
-
-```
-|Ac________|
-```
-
-### EL V-7: Protected Attributes Respected without DECSCA
-
-```bash
-printf "\033[1\"q"
-printf "ABCDE"
-printf "\033V"
-printf "\033[2G"
-printf "\033[0K"
-printf "\033[1K"
-printf "\033[2K"
-```
-
-```
-|ABCDE_____|
-```
-
-### EL V-8: Simple Erase Left
-
-```bash
-printf "ABCDE"
-printf "\033[3G"
-printf "\033[1K"
-```
-
-```
-|__cDE___|
-```
-
-### EL V-9: Erase Left SGR State
-
-```bash
-printf "ABC"
-printf "\033[2G"
-printf "\033[41m"
-printf "\033[1K"
-```
-
-```
-|_cC_____|
-```
-
-The cells from `c` to the left should have a red background.
-
-### EL V-10: Erase Left Multi-cell Character
-
-```bash
-printf "AB橋DE"
-printf "\033[3G"
-printf "\033[1K"
-```
-
-```
-|__c_DE__|
-```
-
-### EL V-11: Erase Left Protected Attributes Ignored with DECSCA
-
-```bash
-printf "\033V"
-printf "ABCDE"
-printf "\033[1\"q"
-printf "\033[0\"q"
-printf "\033[2G"
-printf "\033[1K"
-```
-
-```
-|_cCDE_____|
-```
-
-### EL V-12: Simple Erase Complete
-
-```bash
-printf "ABCDE"
-printf "\033[3G"
-printf "\033[2K"
-```
-
-```
-|__c_______|
-```
-
-### EL V-13: Erase Complete SGR State
-
-```bash
-printf "ABC"
-printf "\033[2G"
-printf "\033[41m"
-printf "\033[2K"
-```
-
-```
-|_c______|
-```
-
-The entire line should have a red background.
diff --git a/website/app/vt/hpa/page.mdx b/website/app/vt/hpa/page.mdx
deleted file mode 100644
index f0cd13278..000000000
--- a/website/app/vt/hpa/page.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Horizontal Position Absolute (HPA)
-
-
-
-This sequence performs [cursor position (CUP)](/vt/cup) with `x` set
-to the parameterized value and `y` set to the current cursor position.
-There is no additional or different behavior for using `HPA`.
-
-Because this invokes `CUP`, the cursor row (`x`) can change if it is
-outside the bounds of the `CUP` operation. For example, if
-[origin mode](#TODO) is set and the current cursor position is outside
-of the scroll region, the row will be adjusted.
diff --git a/website/app/vt/hpr/page.mdx b/website/app/vt/hpr/page.mdx
deleted file mode 100644
index fbc865b52..000000000
--- a/website/app/vt/hpr/page.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Horizontal Position Relative (HPR)
-
-
-
-This sequence performs [cursor position (CUP)](/vt/cup) with `x` set
-to the current cursor column plus `x` and `y` set to the current cursor row.
-There is no additional or different behavior for using `HPR`.
-
-The parameter `x` must be an integer greater than or equal to 1. If `x` is less than
-or equal to 0, adjust `x` to be 1. If `x` is omitted, `x` defaults to 1.
-
-Because this invokes `CUP`, the cursor row (`y`) can change if it is
-outside the bounds of the `CUP` operation. For example, if
-[origin mode](#TODO) is set and the current cursor position is outside
-of the scroll region, the row will be adjusted.
diff --git a/website/app/vt/ich/page.mdx b/website/app/vt/ich/page.mdx
deleted file mode 100644
index 359035e8e..000000000
--- a/website/app/vt/ich/page.mdx
+++ /dev/null
@@ -1,129 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Insert Character (ICH)
-
-
-
-Insert `n` blank characters at the current cursor position and shift
-existing cell contents right.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-This sequence always unsets the pending wrap state.
-
-If the cursor position is outside of the [left and right margins](#TODO),
-this sequence does not change the screen, but the pending wrap state is
-still reset.
-
-Existing cells shifted beyond the right margin are deleted. Inserted cells
-are blank with the background color colored according to the current SGR state.
-
-If a multi-cell character (such as "橋") is shifted so that the cell is split
-in half, the multi-cell character can either be clipped or erased. Typical
-behavior is to clip at the right edge of the screen and erase at a right
-margin, but either behavior is acceptable.
-
-## Validation
-
-### ICH V-1: No Scroll Region, Fits on Screen
-
-```bash
-printf "ABC"
-printf "\033[1G"
-printf "\033[2@"
-printf "X"
-```
-
-```
-|XcABC_____|
-```
-
-### ICH V-2: SGR State
-
-```bash
-printf "ABC"
-printf "\033[1G"
-printf "\033[41m"
-printf "\033[2@"
-printf "X"
-```
-
-```
-|c_ABC_____|
-```
-
-The `c_` cells should both have a red background. The `ABC` cells should
-remain unchanged in style.
-
-### ICH V-3: Shifting Content Off the Screen
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G"
-printf "\033[2D"
-printf "ABC"
-printf "\033[2D"
-printf "\033[2@"
-printf "X"
-```
-
-```
-|_______XcA|
-```
-
-### ICH V-4: Inside Left/Right Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;5s" # scroll region left/right
-printf "\033[3G"
-printf "ABC"
-printf "\033[3G"
-printf "\033[2@"
-printf "X"
-```
-
-```
-|__XcA_____|
-```
-
-### ICH V-5: Outside Left/Right Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margins
-printf "\033[3;5s" # scroll region left/right
-printf "\033[3G"
-printf "ABC"
-printf "\033[1G"
-printf "\033[2@"
-printf "X"
-```
-
-```
-|XcABC_____|
-```
-
-### ICH V-6: Split Wide Character
-
-```bash
-cols=$(tput cols)
-printf "\033[${cols}G"
-printf "\033[1D"
-printf "橋"
-printf "\033[2D"
-printf "\033[@"
-printf "X"
-```
-
-```
-|_______Xc_|
-```
-
-In this case, it is valid for the last cell to be blank or to clip the
-multi-cell character. xterm clips the character but many other terminals
-erase the cell.
diff --git a/website/app/vt/il/page.mdx b/website/app/vt/il/page.mdx
deleted file mode 100644
index 54a4b77a1..000000000
--- a/website/app/vt/il/page.mdx
+++ /dev/null
@@ -1,119 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Insert Line (IL)
-
-
-
-Inserts `n` lines at the current cursor position and shifts existing
-lines down.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-If the current cursor position is outside of the current scroll region,
-this sequence does nothing. The cursor is outside of the current scroll
-region if it is above the [top margin](#TODO), below the [bottom margin](#TODO),
-left of the [left margin](#TODO), or right of the [right margin](#TODO).
-
-This sequence unsets the pending wrap state.
-
-This sequence moves the cursor column to the left margin.
-
-From the current cursor row down `n` lines, insert blank lines colored
-with a background color according to the current SGR state. When a line is
-inserted, shift all existing content down one line. The bottommost row
-is the bottom margin. If content is shifted beyond the bottom margin,
-it is lost and the existing content beyond the bottom margin is preserved
-and not shifted.
-
-If a [left margin](#TODO) or [right margin](#TODO) is set, only the cells
-within and including the margins are blanked (when inserted) or shifted.
-Other existing contents to the left of the left margin or right of the
-right margin remains untouched.
-
-If a multi-cell character would be split, erase the full multi-cell
-character. For example, if "橋" is printed to the left of the left margin
-and shifting the line down as a result of IL would split the character,
-the cell should be erased.
-
-## Validation
-
-### IL V-1: Simple Insert Line
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;2H"
-printf "\033[L"
-```
-
-```
-|ABC_____|
-|c_______|
-|DEF_____|
-|GHI_____|
-```
-
-### IL V-2: Cursor Outside of Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[3;4r" # scroll region top/bottom
-printf "\033[2;2H"
-printf "\033[L"
-```
-
-```
-|ABC_____|
-|DEF_____|
-|GHI_____|
-```
-
-### IL V-3: Top/Bottom Scroll Regions
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "123\n"
-printf "\033[1;3r" # scroll region top/bottom
-printf "\033[2;2H"
-printf "\033[L"
-```
-
-```
-|ABC_____|
-|c_______|
-|DEF_____|
-|123_____|
-```
-
-### IL V-4: Left/Right Scroll Regions
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC123\n"
-printf "DEF456\n"
-printf "GHI789\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[2;4s" # scroll region left/right
-printf "\033[2;2H"
-printf "\033[L"
-```
-
-```
-|ABC123__|
-|Dc__56__|
-|GEF489__|
-|_HI7____|
-```
diff --git a/website/app/vt/ind/page.mdx b/website/app/vt/ind/page.mdx
deleted file mode 100644
index d7b336a1f..000000000
--- a/website/app/vt/ind/page.mdx
+++ /dev/null
@@ -1,159 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Index (IND)
-
-
-
-Move the cursor down one cell, scrolling if necessary.
-
-This sequence always unsets the pending wrap state.
-
-If the cursor is exactly on the bottom margin and is at or within the
-[left](#TODO) and [right margin](#TODO), [scroll up](#TODO) one line.
-If the scroll region is the full terminal screen and the terminal is on
-the [primary screen](#TODO), this may create scrollback. See the
-[scroll](#TODO) documentation for more details.
-
-If the cursor is outside of the scroll region or not on the bottom
-margin of the scroll region, perform the [cursor down](/vt/cud) operation with
-`n = 1`.
-
-This sequence will only scroll when the cursor is exactly on the bottom
-margin and within the remaining scroll region. If the cursor is outside
-the scroll region and on the bottom line of the terminal, the cursor
-does not move.
-
-## Validation
-
-### IND V-1: No Scroll Region, Top of Screen
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "A"
-printf "\033D" # index
-printf "X"
-```
-
-```
-|A_________|
-|_Xc_______|
-```
-
-### IND V-2: Bottom of Primary Screen
-
-```bash
-lines=$(tput lines)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[${lines};1H" # move to bottom-left
-printf "A"
-printf "\033D" # index
-printf "X"
-```
-
-```
-|A_________|
-|_Xc_______|
-```
-
-### IND V-3: Inside Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[1;3r" # scroll region
-printf "A"
-printf "\033D" # index
-printf "X"
-```
-
-```
-|A_________|
-|_Xc_______|
-```
-
-### IND V-4: Bottom of Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[1;3r" # scroll region
-printf "\033[4;1H" # below scroll region
-printf "B"
-printf "\033[3;1H" # move to last row of region
-printf "A"
-printf "\033D" # index
-printf "X"
-```
-
-```
-|__________|
-|A_________|
-|_Xc_______|
-|B_________|
-```
-
-### IND V-5: Bottom of Primary Screen with Scroll Region
-
-```bash
-lines=$(tput lines)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[1;3r" # scroll region
-printf "\033[3;1H" # move to last row of region
-printf "A"
-printf "\033[${lines};1H" # move to bottom-left
-printf "\033D" # index
-printf "X"
-```
-
-```
-|__________|
-|__________|
-|A_________|
-|__________|
-|Xc________|
-```
-
-### IND V-6: Outside of Left/Right Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?69h" # enable left/right margins
-printf "\033[1;3r" # scroll region top/bottom
-printf "\033[3;5s" # scroll region left/right
-printf "\033[3;3H"
-printf "A"
-printf "\033[3;1H"
-printf "\033D" # index
-printf "X"
-```
-
-```
-|__________|
-|__________|
-|XcA_______|
-```
-
-### IND V-7: Inside of Left/Right Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "AAAAAA\n"
-printf "AAAAAA\n"
-printf "AAAAAA"
-printf "\033[?69h" # enable left/right margins
-printf "\033[1;3s" # set scroll region left/right
-printf "\033[1;3r" # set scroll region top/bottom
-printf "\033[3;1H" # Move to bottom left
-printf "\033D" # index
-```
-
-```
-|AAAAAA____|
-|AAAAAA____|
-|c__AAA____|
-```
diff --git a/website/app/vt/layout.tsx b/website/app/vt/layout.tsx
deleted file mode 100644
index 36de63199..000000000
--- a/website/app/vt/layout.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import Image from "next/image";
-import Link from "next/link";
-import "@/styles/code.css";
-
-export default function Layout({ children }: { children: React.ReactNode }) {
- return (
-
- );
-}
diff --git a/website/app/vt/lf/page.mdx b/website/app/vt/lf/page.mdx
deleted file mode 100644
index 06b80eb0f..000000000
--- a/website/app/vt/lf/page.mdx
+++ /dev/null
@@ -1,10 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Linefeed (LF)
-
-
-
-This is an alias for [index (IND)](/vt/ind).
-
-If [linefeed mode (mode 20)](#TODO) is enabled, perform a
-[carriage return](/vt/cr) after the IND operation.
diff --git a/website/app/vt/modes/deccolm/page.mdx b/website/app/vt/modes/deccolm/page.mdx
deleted file mode 100644
index a8fce6c99..000000000
--- a/website/app/vt/modes/deccolm/page.mdx
+++ /dev/null
@@ -1,70 +0,0 @@
-import VTMode from "@/components/VTMode";
-
-# Select 80 or 132 Columns per Page (DECCOLM)
-
-
-
-Sets the screen to 132 columns if set or 80 columns if unset.
-
-This requires [`132COLS` (DEC mode 40)](/vt/modes/132cols) to be set
-to have any effect. If `132COLS` is not set, then setting or unsetting
-this mode does nothing.
-
-When this mode changes, the screen is resized to the given column amount,
-performing reflow if necessary. If the GUI window is too narrow or too wide,
-it is typically resized to fit the explicit column count or a scrollbar is
-used. If the GUI window is manually resized (i.e. with the mouse), the column
-width of DECCOLM is not enforced.
-
-The scroll margins are reset to their default values given the new screen size.
-The cursor is moved to the top-left. The screen is erased using
-[erase display (ED) with command 2](/vt/ed).
-
-## Validation
-
-### DECCOLM V-1: Disabled
-
-```bash
-printf "ABC\n"
-printf "\033[?40l" # disable mode 3
-printf "\033[?3h"
-printf "X"
-```
-
-```
-|ABC_____|
-|Xc______|
-|________|
-```
-
-The command should be completely ignored.
-
-### DECCOLM V-2: Unset (80 Column)
-
-```bash
-printf "ABC\n"
-printf "\033[?40h" # enable mode 3
-printf "\033[?3l" # unset the mode
-printf "X"
-```
-
-```
-|X_______|
-```
-
-The screen should be 80 columns wide.
-
-### DECCOLM V-3: Set (132 Column)
-
-```bash
-printf "ABC\n"
-printf "\033[?40h" # enable mode 3
-printf "\033[?3h"
-printf "X"
-```
-
-```
-|X_______|
-```
-
-The screen should be 132 columns wide.
diff --git a/website/app/vt/modes/decom/page.mdx b/website/app/vt/modes/decom/page.mdx
deleted file mode 100644
index b633a7fc0..000000000
--- a/website/app/vt/modes/decom/page.mdx
+++ /dev/null
@@ -1,64 +0,0 @@
-import VTMode from "@/components/VTMode";
-
-# Origin (DECOM)
-
-
-
-Changes the origin of grid coordinates to be relative to the current scroll
-region.
-
-When set or unset, this invokes [Cursor Position (CUP)](/vt/cup) with row 1 and
-column 1. If origin mode is set, this will position the cursor to the
-top-left location of the current scroll region. If origin mode is not set,
-this will position the cursor to the top-left location of the screen. The
-cursor position will be set even if the origin mode is _unchanged_.
-
-The following commands are affected by origin mode. Please see their
-respective documentation for details on how origin mode impacts their
-behavior.
-
-- [Carriage Return (CR)](/vt/cr)
-- [Cursor Position Set (CUP)](/vt/cup)
-- [Cursor Position Report (CPR)](/vt/cpr)
-- [Save Cursor (DECSC)](/vt/decsc)
-- [Restore Cursor (DECRC)](/vt/decrc)
-- [Horizontal Position Absolute (HPA)](/vt/hpa)
-- [Vertical Position Absolute (VPA)](/vt/vpa)
-- [Horizontal Position Relative (HPR)](/vt/hpr)
-- [Vertical Position Relative (VPR)](/vt/vpr)
-- [Cursor Backward Tabulation (CBT)](/vt/cbt)
-- [Screen Alignment Test (DECALN)](/vt/decaln)
-- [Full Reset (RIS)](/vt/ris)
-- [Soft Reset (DECSTR)](/vt/decstr)
-
-## Validation
-
-### DECOM V-1: Unset No Margins
-
-```bash
-printf "\033[H"
-printf "\033[2J"
-printf "ABC\n"
-printf "\033[?6l"
-printf "X"
-```
-
-```
-|XBC_____|
-|________|
-```
-
-### DECOM V-1: Set No Margins
-
-```bash
-printf "\033[H"
-printf "\033[2J"
-printf "ABC\n"
-printf "\033[?6h"
-printf "X"
-```
-
-```
-|XBC_____|
-|________|
-```
diff --git a/website/app/vt/modes/decsclm/page.mdx b/website/app/vt/modes/decsclm/page.mdx
deleted file mode 100644
index 809521607..000000000
--- a/website/app/vt/modes/decsclm/page.mdx
+++ /dev/null
@@ -1,12 +0,0 @@
-import VTMode from "@/components/VTMode";
-
-# Slow Scroll (DECSCLM)
-
-
-
-Enable slow or smooth scrolling.
-
-Typically, slow scrolling will scroll line by line when using scroll
-functions (arrow keys, scrollbar, etc.). With this disabling, scrolling
-jumps by more lines. This is purely up to the terminal to implement how it
-sees fit.
diff --git a/website/app/vt/modes/decscnm/page.mdx b/website/app/vt/modes/decscnm/page.mdx
deleted file mode 100644
index f68e69019..000000000
--- a/website/app/vt/modes/decscnm/page.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
-import VTMode from "@/components/VTMode";
-
-# Reverse Video (DECSCNM)
-
-
-
-Swap the foreground/background colors of cells.
-
-This swaps the foreground and background color of cells when displayed.
-This does not physically alter the cell state or cell contents; only the
-rendered state is affected.
diff --git a/website/app/vt/modes/insert/page.mdx b/website/app/vt/modes/insert/page.mdx
deleted file mode 100644
index 1a1b6b9a0..000000000
--- a/website/app/vt/modes/insert/page.mdx
+++ /dev/null
@@ -1,89 +0,0 @@
-import VTMode from "@/components/VTMode";
-
-# Insert
-
-
-
-When enabled, text is written to the cell under the cursor
-and all existing content is shifted right. When disabled, text
-overwrites existing content.
-
-This mode is unset as part of both [full reset (RIS)](/vt/ris)
-and [soft reset (DECSTR)](/vt/decstr).
-
-If a multi-cell character (such as "橋") is shifted so that the cell is split
-in half, the multi-cell character can either be clipped or erased.
-
-This mode is typically disabled on terminal startup.
-
-## Validation
-
-### INSERT V-1: Simple Usage
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "123456"
-printf "\033[1G"
-printf "\033[4h"
-printf "ABC"
-```
-
-```
-|ABC123456_|
-```
-
-### INSERT V-2: Pushing Off the Screen Edge
-
-```bash
-cols=$(tput cols)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[${cols}G"
-printf "\033[6D"
-printf "123456"
-printf "\033[6D"
-printf "\033[4h"
-printf "ABC"
-```
-
-```
-|____ABC1234|
-```
-
-### INSERT V-3: Writing on the Screen Edge
-
-```bash
-cols=$(tput cols)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[${cols}G"
-printf "\033[6D"
-printf "123456"
-printf "\033[1D"
-printf "\033[4h"
-printf "ABC"
-```
-
-```
-|____12345AB|
-|Cc_________|
-```
-
-### INSERT V-3: Splitting a Multi-Cell Character
-
-```bash
-cols=$(tput cols)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[${cols}G"
-printf "\033[6D"
-printf "1234橋"
-printf "\033[6D"
-printf "\033[4h"
-printf "A"
-```
-
-```
-|_____A1234_|
-```
diff --git a/website/app/vt/modes/kam/page.mdx b/website/app/vt/modes/kam/page.mdx
deleted file mode 100644
index dfab83e9e..000000000
--- a/website/app/vt/modes/kam/page.mdx
+++ /dev/null
@@ -1,30 +0,0 @@
-import VTMode from "@/components/VTMode";
-
-# Keyboard Action Mode (KAM)
-
-
-
-Disable all keyboard input.
-
-This mode is unset as part of both [full reset (RIS)](/vt/ris)
-and [soft reset (DECSTR)](/vt/decstr).
-
-A poorly behaved terminal program can lock the terminal emulator
-using this command. Terminal emulators should provide a mechanism
-to reset this or outright disable it.
-
-This mode is typically disabled on terminal startup.
-
-## Validation
-
-### KAM V-1: Disable Keyboard Input
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "Keyboard input is now disabled.\n"
-printf "\033[2h"
-sleep 5
-printf "\033[2l"
-printf "Keyboard input is re-enabled.\n"
-```
diff --git a/website/app/vt/modes/linefeed/page.mdx b/website/app/vt/modes/linefeed/page.mdx
deleted file mode 100644
index 27fc5b1d8..000000000
--- a/website/app/vt/modes/linefeed/page.mdx
+++ /dev/null
@@ -1,30 +0,0 @@
-import VTMode from "@/components/VTMode";
-
-# Linefeed
-
-
-
-When enabled, [LF](/vt/lf), [VF](/vt/vf), [FF](/vt/ff) all add an
-automatic [carriage return](/vt/cr) after the linefeed. Additionally,
-all `\r` sent from the terminal to the application are replaced by
-`\r\n`.
-
-This mode is typically disabled on terminal startup.
-
-## Validation
-
-### LINEFEED V-1: Simple Usage
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "123456"
-printf "\033[20h"
-printf "\n"
-printf "X"
-```
-
-```
-|123456____|
-|Xc________|
-```
diff --git a/website/app/vt/modes/srm/page.mdx b/website/app/vt/modes/srm/page.mdx
deleted file mode 100644
index 8b2e56649..000000000
--- a/website/app/vt/modes/srm/page.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
-import VTMode from "@/components/VTMode";
-
-# Send-Receive Mode (SRM)
-
-
-
-If reset, characters entered by the keyboard are shown on the screen
-as well as being sent to the running program. If set, keyboard input
-is sent only to the running program and the running program can choose
-whether it wants to echo it back.
-
-This mode is typically enabled on terminal startup.
-
-This mode is generally unsupported across most terminals today and
-is recommended to be retired.[^1]
-
-[^1]: https://gitlab.gnome.org/GNOME/vte/-/issues/69
diff --git a/website/app/vt/rep/page.mdx b/website/app/vt/rep/page.mdx
deleted file mode 100644
index 91eba03cd..000000000
--- a/website/app/vt/rep/page.mdx
+++ /dev/null
@@ -1,53 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Repeat Previous Character (REP)
-
-
-
-Repeat the previously printed character `n` times.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-In xterm, only characters with single byte (less than decimal 256) are
-supported. In most other mainstream terminals, any character is supported.
-
-Each repeated character behaves identically to if it was manually typed in.
-Therefore, soft-wrapping, margins, etc. all behave the same as if the
-character was typed.
-
-The previously printed character is any character that is printed through
-any means. The previously printed character is not limited to characters
-a user manually types. If there is no previously typed character, this sequence
-does nothing.
-
-## Validation
-
-### REP V-1: Simple Usage
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "A"
-printf "\033[b"
-```
-
-```
-|AAc_______|
-```
-
-### REP V-2: Soft-Wrap
-
-```bash
-cols=$(tput cols)
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[${cols}G"
-printf "A"
-printf "\033[b"
-```
-
-```
-|_________A|
-|Ac________|
-```
diff --git a/website/app/vt/ri/page.mdx b/website/app/vt/ri/page.mdx
deleted file mode 100644
index bd9bcaf45..000000000
--- a/website/app/vt/ri/page.mdx
+++ /dev/null
@@ -1,138 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Reverse Index (RI)
-
-
-
-Move the cursor up one cell, scrolling if necessary.
-
-This sequence does not unset the pending wrap state.
-
-If the cursor is exactly on the [top margin](/vt/decstbm) and is within
-[left and right margins](/vt/decslrm), invoke [scroll down (SD)](/vt/sd)
-with `n = 1`. The operation is complete.
-
-Otherwise, scrolling isn't necessary. Perform a
-[cursor up](/vt/cuu) operation with `n = 1`.
-
-## Validation
-
-### RI V-1: No Scroll Region, Top of Screen
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "A\n"
-printf "B\n"
-printf "C\n"
-printf "\033[1;1H" # move to top-left
-printf "\033M" # reverse index
-printf "X"
-```
-
-```
-|Xc________|
-|A_________|
-|B_________|
-|C_________|
-```
-
-### RI V-2: No Scroll Region, Not Top of Screen
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "A\n"
-printf "B\n"
-printf "C\n"
-printf "\033[2;1H"
-printf "\033M" # reverse index
-printf "X"
-```
-
-```
-|Xc________|
-|B_________|
-|C_________|
-```
-
-### RI V-3: Top/Bottom Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "A\n"
-printf "B\n"
-printf "C\n"
-printf "\033[2;3r" # scroll region
-printf "\033[2;1H"
-printf "\033M" # reverse index
-```
-
-```
-|A_________|
-|c_________|
-|B_________|
-```
-
-### RI V-4: Outside of Top/Bottom Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "A\n"
-printf "B\n"
-printf "C\n"
-printf "\033[2;3r" # scroll region
-printf "\033[1;1H"
-printf "\033M" # reverse index
-```
-
-```
-|A_________|
-|B_________|
-|C_________|
-```
-
-### RI V-5: Left/Right Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[2;3s" # scroll region left/right
-printf "\033[1;2H"
-printf "\033M"
-```
-
-```
-|A_________|
-|DBC_______|
-|GEF_______|
-|_HI_______|
-```
-
-### RI V-6: Outside Left/Right Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[2;3s" # scroll region left/right
-printf "\033[2;1H"
-printf "\033M"
-```
-
-```
-|ABC_______|
-|DEF_______|
-|GHI_______|
-```
-
-Cursor on the `A`.
diff --git a/website/app/vt/ris/page.mdx b/website/app/vt/ris/page.mdx
deleted file mode 100644
index 3abdb88d0..000000000
--- a/website/app/vt/ris/page.mdx
+++ /dev/null
@@ -1,30 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Full Reset (RIS)
-
-
-
-Reset the terminal.
-
-The full reset operation does the following:
-
-- Set the cursor shape to the default
-- Reset the scroll region to the full screen
-- Disable [left and right margin mode (mode 69)](#TODO)
-- Disable [origin mode (mode 6)](#TODO)
-- Unset cursor foreground and background colors
-- Reset charsets to the default
-- Reset [cursor key mode (DECCKM)](#TODO)
-- Reset [disable keyboard input (KAM)](#TODO)
-- Reset [application keypad mode](/vt/deckpnm)
-- Reset xterm keyboard modifier state to the default
-- Disable cursor [protected attribute](#TODO)
-- Disable any [protected area](#TODO)
-- Reset all [mouse tracking modes](#TODO)
-- Reset tabstops to default
-- Enable [send-receive mode (mode 12)](#TODO)
-- Reset [backspace sends delete (mode 67)](#TODO)
-- Return to the primary screen and clear it
-- Move the cursor to the top-left corner
-- Reset the pending wrap state
-- Reset saved cursor state
diff --git a/website/app/vt/sd/page.mdx b/website/app/vt/sd/page.mdx
deleted file mode 100644
index 195029f4f..000000000
--- a/website/app/vt/sd/page.mdx
+++ /dev/null
@@ -1,37 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Scroll Down (SD)
-
-
-
-Inserts `n` lines at the top of the scroll region and shift existing
-lines down.
-
-This sequence is functionally identical to
-[Insert Line (IL)](/vt/il) with the cursor position set to the top of
-the scroll region. The cursor position after the operation must be unchanged
-from when SD was invoked.
-
-This sequence unsets the pending wrap state.
-
-## Validation
-
-### SD V-1: Outside of Top/Bottom Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[3;4r" # scroll region top/bottom
-printf "\033[2;2H"
-printf "\033[T"
-```
-
-```
-|ABC_____|
-|DEF_____|
-|________|
-|GHI_____|
-```
diff --git a/website/app/vt/su/page.mdx b/website/app/vt/su/page.mdx
deleted file mode 100644
index a65c53d30..000000000
--- a/website/app/vt/su/page.mdx
+++ /dev/null
@@ -1,113 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Scroll Up (SU)
-
-
-
-Remove `n` lines from the top of the scroll region and shift existing
-lines up.
-
-The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
-or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
-
-This sequence executes [Delete Line (DL)](/vt/dl) with the cursor position
-set to the top of the scroll region. There are some differences from DL
-which are explained below.
-
-The cursor position after the operation must be unchanged from when SU was
-invoked. The pending wrap state is _not_ reset.
-
-## Validation
-
-### SU V-1: Simple Usage
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;2H"
-printf "\033[S"
-```
-
-```
-|DEF_____|
-|GHI_____|
-```
-
-### SU V-2: Top/Bottom Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC\n"
-printf "DEF\n"
-printf "GHI\n"
-printf "\033[2;3r" # scroll region top/bottom
-printf "\033[1;1H"
-printf "\033[S"
-```
-
-```
-|ABC_____|
-|GHI_____|
-```
-
-### SU V-3: Left/Right Scroll Regions
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "ABC123\n"
-printf "DEF456\n"
-printf "GHI789\n"
-printf "\033[?69h" # enable left/right margins
-printf "\033[2;4s" # scroll region left/right
-printf "\033[2;2H"
-printf "\033[S"
-```
-
-```
-|AEF423__|
-|DHI756__|
-|G___89__|
-```
-
-### SU V-4: Preserves Pending Wrap
-
-```bash
-cols=$(tput cols)
-printf "\033[1;${cols}H" # move to top-right
-printf "\033[2J" # clear screen
-printf "A"
-printf "\033[2;${cols}H"
-printf "B"
-printf "\033[3;${cols}H"
-printf "C"
-printf "\033[S"
-printf "X"
-```
-
-```
-|_______B|
-|_______C|
-|________|
-|X_______|
-```
-
-### SU V-5: Scroll Full Top/Bottom Scroll Region
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "top"
-printf "\033[5;1H"
-printf "ABCDEF"
-printf "\033[2;5r" # scroll region top/bottom
-printf "\033[4S"
-```
-
-```
-|top_____|
-```
diff --git a/website/app/vt/tab/page.mdx b/website/app/vt/tab/page.mdx
deleted file mode 100644
index 95b1b3b41..000000000
--- a/website/app/vt/tab/page.mdx
+++ /dev/null
@@ -1,8 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Tab (TAB)
-
-
-
-This is an alias for [cursor horizontal tabulation (CHT)](/vt/cht) with
-`n = 1`.
diff --git a/website/app/vt/tbc/page.mdx b/website/app/vt/tbc/page.mdx
deleted file mode 100644
index acb39330b..000000000
--- a/website/app/vt/tbc/page.mdx
+++ /dev/null
@@ -1,47 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Tab Clear (TBC)
-
-
-
-Clear one or all tab stops.
-
-The parameter `n` must be `0` or `3`. If `n` is omitted, `n` defaults to `0`.
-
-If the parameter `n` is `0`, the cursor column position is marked as
-not a tab stop. If the column was already not a tab stop, this does nothing.
-
-If the parameter `n` is `3`, all tab stops are cleared.
-
-## Validation
-
-### TBC V-1: Tab Clear Single
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?W" # reset tabs
-printf "\t"
-printf "\033[g"
-printf "\033[1G"
-printf "\t"
-```
-
-```
-|_______________c_______|
-```
-
-### TBC V-3: Clear All Tabstops
-
-```bash
-printf "\033[1;1H" # move to top-left
-printf "\033[0J" # clear screen
-printf "\033[?W" # reset tabs
-printf "\033[3g"
-printf "\033[1G"
-printf "\t"
-```
-
-```
-|______________________c|
-```
diff --git a/website/app/vt/vpa/page.mdx b/website/app/vt/vpa/page.mdx
deleted file mode 100644
index f25c745e1..000000000
--- a/website/app/vt/vpa/page.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Vertical Position Absolute (VPA)
-
-
-
-This sequence performs [cursor position (CUP)](/vt/cup) with `y` set
-to the parameterized value and `x` set to the current cursor position.
-There is no additional or different behavior for using `VPA`.
-
-Because this invokes `CUP`, the cursor column (`y`) can change if it is
-outside the bounds of the `CUP` operation. For example, if
-[origin mode](#TODO) is set and the current cursor position is outside
-of the scroll region, the column will be adjusted.
diff --git a/website/app/vt/vpr/page.mdx b/website/app/vt/vpr/page.mdx
deleted file mode 100644
index 990b3185a..000000000
--- a/website/app/vt/vpr/page.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Vertical Position Relative (VPR)
-
-
-
-This sequence performs [cursor position (CUP)](/vt/cup) with `y` set
-to the current cursor row plus `y` and `x` set to the current cursor column.
-There is no additional or different behavior for using `VPR`.
-
-The parameter `y` must be an integer greater than or equal to 1. If `y` is less than
-or equal to 0, adjust `y` to be 1. If `y` is omitted, `y` defaults to 1.
-
-Because this invokes `CUP`, the cursor column (`x`) can change if it is
-outside the bounds of the `CUP` operation. For example, if
-[origin mode](#TODO) is set and the current cursor position is outside
-of the scroll region, the column will be adjusted.
diff --git a/website/app/vt/xtshiftescape/page.mdx b/website/app/vt/xtshiftescape/page.mdx
deleted file mode 100644
index cadbf845c..000000000
--- a/website/app/vt/xtshiftescape/page.mdx
+++ /dev/null
@@ -1,41 +0,0 @@
-import VTSequence from "@/components/VTSequence";
-
-# Set Shift-Escape (XTSHIFTESCAPE)
-
-", "Pn", "s"]} />
-
-Configure whether mouse reports are allowed to capture the `shift` modifier.
-
-The parameter `n` must be an integer equal to 0 or 1. If `n` is omitted,
-`n` defaults to 0. If `n` is an invalid value, this sequence does nothing.
-
-When a terminal program requests [mouse reporting](#TODO), some mouse
-reporting modes also report the modifier keys that are pressed (control, shift,
-etc.). This would disable the ability for a terminal user to natively select
-text if they typically select text using left-click and drag, since the
-left-click event is captured by the running program.
-
-To get around this limitation, many terminal emulators (including xterm)
-use the `shift` modifier to disable mouse reporting temporarily, allowing
-native text selection to work. In this scenario, however, the running
-terminal program cannot detect shift-clicks because the terminal emulator
-captures the event.
-
-This sequence (`XTSHIFTESCAPE`) allows configuring this behavior. If
-`n` is `0`, the terminal is allowed to override the shift key and not pass
-it through to the terminal program. If `n` is `1`, the terminal program
-is requesting that the shift modifier is sent using standard mouse
-reporting formats.
-
-In either case, the terminal emulator is not forced to respect this request.
-For example, `xterm` has a `never` and `always` terminal configuration
-to never allow terminal programs to capture shift or to always allow them,
-respectively. If either of these configurations are set, `XTSHIFTESCAPE`
-has zero effect.
-
-`xterm` also has `false` and `true` terminal configurations. In the `false`
-scenario, the terminal emulator will override `shift` (not allow the terminal
-program to see it) _unless it is explicitly requested_ via `XTSHIFTESCAPE`.
-The `true` scenario is the exact opposite: pass the shift modifier through
-to the running terminal program unless the terminal program explicitly states
-it doesn't need to know about it (`n = 0`).
diff --git a/website/components/VTMode.tsx b/website/components/VTMode.tsx
deleted file mode 100644
index 7287c1c87..000000000
--- a/website/components/VTMode.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-export default function VTMode({
- value,
- ansi = false,
-}: {
- value: number;
- ansi: boolean;
-}) {
- return (
-
-
-
- {ansi ? "" : "?"}
- {value}
-
-
-
- );
-}
diff --git a/website/components/VTSequence.tsx b/website/components/VTSequence.tsx
deleted file mode 100644
index 1fee995e1..000000000
--- a/website/components/VTSequence.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-// Draw a diagram showing the VT sequence.
-//
-// There are some special sequence elements that can be used:
-//
-// - CSI will be replaced with ESC [.
-// - Pn will be considered a parameter
-//
-export default function VTSequence({
- sequence,
-}: {
- sequence: string | [string];
-}) {
- let arr: [string] = typeof sequence === "string" ? [sequence] : sequence;
-
- if (arr[0] === "CSI") {
- arr.shift();
- arr.unshift("ESC", "[");
- }
-
- return (
-
- {arr.map((elem, i) => (
-
-
-
- ))}
-
- );
-}
-
-function VTElem({ elem }: { elem: string }) {
- const param = elem.length > 1 && elem[0] === "P";
- elem = param ? elem[1] : elem;
- const specialChar = special[elem] ?? elem.charCodeAt(0);
- const hex = specialChar.toString(16).padStart(2, "0").toUpperCase();
-
- return (
-
-
{param ? "____" : `0x${hex}`}
-
{elem}
-
- );
-}
-
-const special: { [key: string]: number } = {
- BEL: 0x07,
- BS: 0x08,
- TAB: 0x09,
- LF: 0x0a,
- CR: 0x0d,
- ESC: 0x1b,
-};
diff --git a/website/mdx-components.tsx b/website/mdx-components.tsx
deleted file mode 100644
index 9ff722919..000000000
--- a/website/mdx-components.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { MDXComponents } from "mdx/types";
-
-export function useMDXComponents(components: MDXComponents): MDXComponents {
- return {
- ...components,
- };
-}
diff --git a/website/next.config.mjs b/website/next.config.mjs
deleted file mode 100644
index b033373d5..000000000
--- a/website/next.config.mjs
+++ /dev/null
@@ -1,28 +0,0 @@
-import remarkGfm from "remark-gfm";
-import remarkToc from "remark-toc";
-import rehypePrettyCode from "rehype-pretty-code";
-import rehypeSlug from "rehype-slug";
-import createMDX from "@next/mdx";
-
-/** @type {import('next').NextConfig} */
-const nextConfig = {
- pageExtensions: ["js", "jsx", "mdx", "ts", "tsx"],
-};
-
-/** @type {import('rehype-pretty-code').Options} */
-const prettyCodeOptions = {
- theme: {
- dark: "one-dark-pro",
- light: "one-dark-pro", // todo: when we support light mode
- },
-};
-
-const withMDX = createMDX({
- // Add markdown plugins here, as desired
- options: {
- remarkPlugins: [remarkGfm, remarkToc],
- rehypePlugins: [rehypeSlug, [rehypePrettyCode, prettyCodeOptions]],
- },
-});
-
-export default withMDX(nextConfig);
diff --git a/website/package-lock.json b/website/package-lock.json
deleted file mode 100644
index 9231b4ecd..000000000
--- a/website/package-lock.json
+++ /dev/null
@@ -1,6955 +0,0 @@
-{
- "name": "website",
- "version": "0.1.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "website",
- "version": "0.1.0",
- "dependencies": {
- "@mdx-js/loader": "^2.3.0",
- "@mdx-js/react": "^2.3.0",
- "@next/mdx": "^13.5.4",
- "@types/mdx": "^2.0.8",
- "next": "13.5.4",
- "react": "^18",
- "react-dom": "^18",
- "rehype-pretty-code": "^0.10.1",
- "rehype-slug": "^6.0.0",
- "remark-gfm": "^3.0.1",
- "remark-toc": "^9.0.0",
- "shiki": "^0.14.4"
- },
- "devDependencies": {
- "@tailwindcss/typography": "^0.5.10",
- "@types/node": "^20",
- "@types/react": "^18",
- "@types/react-dom": "^18",
- "autoprefixer": "^10",
- "eslint": "^8",
- "eslint-config-next": "13.5.4",
- "postcss": "^8",
- "tailwindcss": "^3",
- "typescript": "^5"
- }
- },
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@alloc/quick-lru": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
- "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.23.1",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz",
- "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==",
- "dev": true,
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
- "dev": true,
- "dependencies": {
- "eslint-visitor-keys": "^3.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz",
- "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==",
- "dev": true,
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
- "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/js": {
- "version": "8.50.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz",
- "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.11",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
- "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
- "dev": true,
- "dependencies": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=10.10.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
- "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
- "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
- "peer": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.19",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
- "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@mdx-js/loader": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-2.3.0.tgz",
- "integrity": "sha512-IqsscXh7Q3Rzb+f5DXYk0HU71PK+WuFsEhf+mSV3fOhpLcEpgsHvTQ2h0T6TlZ5gHOaBeFjkXwB52by7ypMyNg==",
- "dependencies": {
- "@mdx-js/mdx": "^2.0.0",
- "source-map": "^0.7.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- },
- "peerDependencies": {
- "webpack": ">=4"
- }
- },
- "node_modules/@mdx-js/mdx": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz",
- "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/mdx": "^2.0.0",
- "estree-util-build-jsx": "^2.0.0",
- "estree-util-is-identifier-name": "^2.0.0",
- "estree-util-to-js": "^1.1.0",
- "estree-walker": "^3.0.0",
- "hast-util-to-estree": "^2.0.0",
- "markdown-extensions": "^1.0.0",
- "periscopic": "^3.0.0",
- "remark-mdx": "^2.0.0",
- "remark-parse": "^10.0.0",
- "remark-rehype": "^10.0.0",
- "unified": "^10.0.0",
- "unist-util-position-from-estree": "^1.0.0",
- "unist-util-stringify-position": "^3.0.0",
- "unist-util-visit": "^4.0.0",
- "vfile": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/@mdx-js/react": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz",
- "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==",
- "dependencies": {
- "@types/mdx": "^2.0.0",
- "@types/react": ">=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- },
- "peerDependencies": {
- "react": ">=16"
- }
- },
- "node_modules/@next/env": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz",
- "integrity": "sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ=="
- },
- "node_modules/@next/eslint-plugin-next": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.4.tgz",
- "integrity": "sha512-vI94U+D7RNgX6XypSyjeFrOzxGlZyxOplU0dVE5norIfZGn/LDjJYPHdvdsR5vN1eRtl6PDAsOHmycFEOljK5A==",
- "dev": true,
- "dependencies": {
- "glob": "7.1.7"
- }
- },
- "node_modules/@next/mdx": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-13.5.4.tgz",
- "integrity": "sha512-WYdWeDZUvX9h0BnjDtwyFy2We4ko8ox5EuglN27rCoYz1xj8fQ8KAn7reZgXwT2RX2hxUOl4eTNbXBfsrw7Gew==",
- "dependencies": {
- "source-map": "^0.7.0"
- },
- "peerDependencies": {
- "@mdx-js/loader": ">=0.15.0",
- "@mdx-js/react": ">=0.15.0"
- },
- "peerDependenciesMeta": {
- "@mdx-js/loader": {
- "optional": true
- },
- "@mdx-js/react": {
- "optional": true
- }
- }
- },
- "node_modules/@next/swc-darwin-arm64": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz",
- "integrity": "sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-darwin-x64": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz",
- "integrity": "sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-gnu": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz",
- "integrity": "sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-musl": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz",
- "integrity": "sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-gnu": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz",
- "integrity": "sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-musl": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz",
- "integrity": "sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-arm64-msvc": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz",
- "integrity": "sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-ia32-msvc": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz",
- "integrity": "sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-x64-msvc": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz",
- "integrity": "sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@rushstack/eslint-patch": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz",
- "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==",
- "dev": true
- },
- "node_modules/@swc/helpers": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
- "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/typography": {
- "version": "0.5.10",
- "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
- "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==",
- "dev": true,
- "dependencies": {
- "lodash.castarray": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.merge": "^4.6.2",
- "postcss-selector-parser": "6.0.10"
- },
- "peerDependencies": {
- "tailwindcss": ">=3.0.0 || insiders"
- }
- },
- "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
- "version": "6.0.10",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
- "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
- "dev": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@types/acorn": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz",
- "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/@types/debug": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz",
- "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==",
- "dependencies": {
- "@types/ms": "*"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.44.3",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.3.tgz",
- "integrity": "sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==",
- "peer": true,
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/eslint-scope": {
- "version": "3.7.5",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz",
- "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==",
- "peer": true,
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz",
- "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA=="
- },
- "node_modules/@types/estree-jsx": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.1.tgz",
- "integrity": "sha512-sHyakZlAezNFxmYRo0fopDZW+XvK6ipeZkkp5EAOLjdPfZp8VjZBJ67vSRI99RSCAoqXVmXOHS4fnWoxpuGQtQ==",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/@types/hast": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.6.tgz",
- "integrity": "sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==",
- "dependencies": {
- "@types/unist": "^2"
- }
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.13",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz",
- "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==",
- "peer": true
- },
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "dev": true
- },
- "node_modules/@types/mdast": {
- "version": "3.0.13",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
- "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
- "dependencies": {
- "@types/unist": "^2"
- }
- },
- "node_modules/@types/mdx": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.8.tgz",
- "integrity": "sha512-r7/zWe+f9x+zjXqGxf821qz++ld8tp6Z4jUS6qmPZUXH6tfh4riXOhAqb12tWGWAevCFtMt1goLWkQMqIJKpsA=="
- },
- "node_modules/@types/ms": {
- "version": "0.7.32",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz",
- "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g=="
- },
- "node_modules/@types/node": {
- "version": "20.8.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz",
- "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w=="
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.8",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz",
- "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ=="
- },
- "node_modules/@types/react": {
- "version": "18.2.25",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.25.tgz",
- "integrity": "sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw==",
- "dependencies": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.2.10",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.10.tgz",
- "integrity": "sha512-5VEC5RgXIk1HHdyN1pHlg0cOqnxHzvPGpMMyGAP5qSaDRmyZNDaQ0kkVAkK6NYlDhP6YBID3llaXlmAS/mdgCA==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/scheduler": {
- "version": "0.16.4",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz",
- "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ=="
- },
- "node_modules/@types/ungap__structured-clone": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@types/ungap__structured-clone/-/ungap__structured-clone-0.3.0.tgz",
- "integrity": "sha512-eBWREUhVUGPze+bUW22AgUr05k8u+vETzuYdLYSvWqGTUe0KOf+zVnOB1qER5wMcw8V6D9Ar4DfJmVvD1yu0kQ=="
- },
- "node_modules/@types/unist": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
- "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "6.7.4",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz",
- "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "6.7.4",
- "@typescript-eslint/types": "6.7.4",
- "@typescript-eslint/typescript-estree": "6.7.4",
- "@typescript-eslint/visitor-keys": "6.7.4",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "6.7.4",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz",
- "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "6.7.4",
- "@typescript-eslint/visitor-keys": "6.7.4"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "6.7.4",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz",
- "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==",
- "dev": true,
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "6.7.4",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz",
- "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "6.7.4",
- "@typescript-eslint/visitor-keys": "6.7.4",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "6.7.4",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz",
- "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "6.7.4",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
- "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
- "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
- "peer": true
- },
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
- "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
- "peer": true
- },
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
- "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
- "peer": true
- },
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
- "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
- "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
- "peer": true
- },
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
- "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
- "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
- "peer": true,
- "dependencies": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
- "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
- "peer": true,
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
- "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
- "peer": true
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
- "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/helper-wasm-section": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6",
- "@webassemblyjs/wasm-opt": "1.11.6",
- "@webassemblyjs/wasm-parser": "1.11.6",
- "@webassemblyjs/wast-printer": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
- "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
- "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6",
- "@webassemblyjs/wasm-parser": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
- "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
- "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "peer": true
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "peer": true
- },
- "node_modules/acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-import-assertions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
- "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
- "peer": true,
- "peerDependencies": {
- "acorn": "^8"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "peer": true,
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-sequence-parser": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz",
- "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg=="
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "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
- },
- "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
- },
- "node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "dev": true,
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
- "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "is-array-buffer": "^3.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-includes": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
- "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/array.prototype.findlastindex": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
- "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
- "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.2.1"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
- "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-array-buffer": "^3.0.2",
- "is-shared-array-buffer": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ast-types-flow": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
- "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
- "dev": true
- },
- "node_modules/astring": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz",
- "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==",
- "bin": {
- "astring": "bin/astring"
- }
- },
- "node_modules/asynciterator.prototype": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
- "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.3"
- }
- },
- "node_modules/autoprefixer": {
- "version": "10.4.16",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
- "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
- "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"
- }
- ],
- "dependencies": {
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001538",
- "fraction.js": "^4.3.6",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/axe-core": {
- "version": "4.8.2",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz",
- "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/axobject-query": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz",
- "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==",
- "dev": true,
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "node_modules/bail": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
- "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.22.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
- "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
- "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"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001541",
- "electron-to-chromium": "^1.4.535",
- "node-releases": "^2.0.13",
- "update-browserslist-db": "^1.0.13"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "peer": true
- },
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "dependencies": {
- "streamsearch": "^1.1.0"
- },
- "engines": {
- "node": ">=10.16.0"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001546",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz",
- "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==",
- "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"
- }
- ]
- },
- "node_modules/ccount": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
- "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/character-entities": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
- "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-html4": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
- "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-legacy": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
- "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-reference-invalid": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
- "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "peer": true,
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/comma-separated-tokens": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
- "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
- "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
- },
- "node_modules/damerau-levenshtein": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
- "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
- "dev": true
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decode-named-character-reference": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
- "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
- "dependencies": {
- "character-entities": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "node_modules/define-data-property": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz",
- "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dev": true,
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "dev": true
- },
- "node_modules/diff": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
- "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "dev": true
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.542",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.542.tgz",
- "integrity": "sha512-6+cpa00G09N3sfh2joln4VUXHquWrOFx3FLZqiVQvl45+zS9DskDBTPvob+BhvFRmTBkyDSk0vvLMMRo/qc6mQ=="
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "node_modules/enhanced-resolve": {
- "version": "5.15.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
- "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.22.2",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz",
- "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "arraybuffer.prototype.slice": "^1.0.2",
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-set-tostringtag": "^2.0.1",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.1",
- "get-symbol-description": "^1.0.0",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "is-array-buffer": "^3.0.2",
- "is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.12",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.3",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.1",
- "safe-array-concat": "^1.0.1",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trim": "^1.2.8",
- "string.prototype.trimend": "^1.0.7",
- "string.prototype.trimstart": "^1.0.7",
- "typed-array-buffer": "^1.0.0",
- "typed-array-byte-length": "^1.0.0",
- "typed-array-byte-offset": "^1.0.0",
- "typed-array-length": "^1.0.4",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.11"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-iterator-helpers": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
- "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
- "dev": true,
- "dependencies": {
- "asynciterator.prototype": "^1.0.0",
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.1",
- "es-set-tostringtag": "^2.0.1",
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.2.1",
- "globalthis": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "iterator.prototype": "^1.1.2",
- "safe-array-concat": "^1.0.1"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz",
- "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==",
- "peer": true
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-shim-unscopables": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "8.50.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz",
- "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.50.0",
- "@humanwhocodes/config-array": "^0.11.11",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-next": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.4.tgz",
- "integrity": "sha512-FzQGIj4UEszRX7fcRSJK6L1LrDiVZvDFW320VVntVKh3BSU8Fb9kpaoxQx0cdFgf3MQXdeSbrCXJ/5Z/NndDkQ==",
- "dev": true,
- "dependencies": {
- "@next/eslint-plugin-next": "13.5.4",
- "@rushstack/eslint-patch": "^1.3.3",
- "@typescript-eslint/parser": "^5.4.2 || ^6.0.0",
- "eslint-import-resolver-node": "^0.3.6",
- "eslint-import-resolver-typescript": "^3.5.2",
- "eslint-plugin-import": "^2.28.1",
- "eslint-plugin-jsx-a11y": "^6.7.1",
- "eslint-plugin-react": "^7.33.2",
- "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
- },
- "peerDependencies": {
- "eslint": "^7.23.0 || ^8.0.0",
- "typescript": ">=3.3.1"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
- "dev": true,
- "dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-import-resolver-typescript": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz",
- "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==",
- "dev": true,
- "dependencies": {
- "debug": "^4.3.4",
- "enhanced-resolve": "^5.12.0",
- "eslint-module-utils": "^2.7.4",
- "fast-glob": "^3.3.1",
- "get-tsconfig": "^4.5.0",
- "is-core-module": "^2.11.0",
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
- },
- "peerDependencies": {
- "eslint": "*",
- "eslint-plugin-import": "*"
- }
- },
- "node_modules/eslint-module-utils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
- "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
- "dev": true,
- "dependencies": {
- "debug": "^3.2.7"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.28.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz",
- "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.findlastindex": "^1.2.2",
- "array.prototype.flat": "^1.3.1",
- "array.prototype.flatmap": "^1.3.1",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.7",
- "eslint-module-utils": "^2.8.0",
- "has": "^1.0.3",
- "is-core-module": "^2.13.0",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.6",
- "object.groupby": "^1.0.0",
- "object.values": "^1.1.6",
- "semver": "^6.3.1",
- "tsconfig-paths": "^3.14.2"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
- "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.20.7",
- "aria-query": "^5.1.3",
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "ast-types-flow": "^0.0.7",
- "axe-core": "^4.6.2",
- "axobject-query": "^3.1.1",
- "damerau-levenshtein": "^1.0.8",
- "emoji-regex": "^9.2.2",
- "has": "^1.0.3",
- "jsx-ast-utils": "^3.3.3",
- "language-tags": "=1.0.5",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=4.0"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-plugin-react": {
- "version": "7.33.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
- "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "array.prototype.tosorted": "^1.1.1",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.12",
- "estraverse": "^5.3.0",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "object.hasown": "^1.1.2",
- "object.values": "^1.1.6",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.4",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.8"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.4",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
- "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "dev": true,
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estree-util-attach-comments": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz",
- "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==",
- "dependencies": {
- "@types/estree": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-build-jsx": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz",
- "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "estree-util-is-identifier-name": "^2.0.0",
- "estree-walker": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-is-identifier-name": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz",
- "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-to-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz",
- "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "astring": "^1.8.0",
- "source-map": "^0.7.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-visit": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz",
- "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/unist": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "peer": true,
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "node_modules/fast-glob": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
- "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
- "node_modules/fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz",
- "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
- "dev": true,
- "dependencies": {
- "flatted": "^3.2.7",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/flatted": {
- "version": "3.2.9",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
- "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
- "dev": true
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "node_modules/fraction.js": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
- "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==",
- "dev": true,
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "patreon",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
- "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-tsconfig": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
- "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
- "dev": true,
- "dependencies": {
- "resolve-pkg-maps": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
- }
- },
- "node_modules/github-slugger": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
- "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="
- },
- "node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
- },
- "node_modules/globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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=="
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
- "node_modules/has": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
- "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hash-obj": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/hash-obj/-/hash-obj-4.0.0.tgz",
- "integrity": "sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==",
- "dependencies": {
- "is-obj": "^3.0.0",
- "sort-keys": "^5.0.0",
- "type-fest": "^1.0.2"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hash-obj/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hast-util-heading-rank": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz",
- "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-heading-rank/node_modules/@types/hast": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.1.tgz",
- "integrity": "sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/hast-util-to-estree": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz",
- "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^2.0.0",
- "@types/unist": "^2.0.0",
- "comma-separated-tokens": "^2.0.0",
- "estree-util-attach-comments": "^2.0.0",
- "estree-util-is-identifier-name": "^2.0.0",
- "hast-util-whitespace": "^2.0.0",
- "mdast-util-mdx-expression": "^1.0.0",
- "mdast-util-mdxjs-esm": "^1.0.0",
- "property-information": "^6.0.0",
- "space-separated-tokens": "^2.0.0",
- "style-to-object": "^0.4.1",
- "unist-util-position": "^4.0.0",
- "zwitch": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-string": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz",
- "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-string/node_modules/@types/hast": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.1.tgz",
- "integrity": "sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/hast-util-whitespace": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz",
- "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/ignore": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/inline-style-parser": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
- "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
- },
- "node_modules/internal-slot": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/is-alphabetical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
- "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-alphanumerical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
- "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
- "dependencies": {
- "is-alphabetical": "^2.0.0",
- "is-decimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
- "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.0",
- "is-typed-array": "^1.1.10"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-buffer": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
- "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
- "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-decimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
- "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-hexadecimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
- "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz",
- "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
- "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-reference": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
- "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typed-array": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
- "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
- "dev": true,
- "dependencies": {
- "which-typed-array": "^1.1.11"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakset": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/iterator.prototype": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
- "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.2.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "reflect.getprototypeof": "^1.0.4",
- "set-function-name": "^2.0.1"
- }
- },
- "node_modules/jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "peer": true,
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "peer": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/jiti": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz",
- "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==",
- "dev": true,
- "bin": {
- "jiti": "bin/jiti.js"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "peer": true
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
- },
- "node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/jsonc-parser": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
- "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="
- },
- "node_modules/jsx-ast-utils": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
- "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "object.assign": "^4.1.4",
- "object.values": "^1.1.6"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
- "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
- "dev": true,
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/kleur": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
- "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/language-subtag-registry": {
- "version": "0.3.22",
- "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
- "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
- "dev": true
- },
- "node_modules/language-tags": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
- "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
- "dev": true,
- "dependencies": {
- "language-subtag-registry": "~0.3.2"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "node_modules/loader-runner": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
- "peer": true,
- "engines": {
- "node": ">=6.11.5"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash.castarray": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
- "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
- "dev": true
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
- "dev": true
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
- },
- "node_modules/longest-streak": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
- "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/markdown-extensions": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz",
- "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/markdown-table": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
- "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/mdast-util-definitions": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz",
- "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "@types/unist": "^2.0.0",
- "unist-util-visit": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-find-and-replace": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz",
- "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "escape-string-regexp": "^5.0.0",
- "unist-util-is": "^5.0.0",
- "unist-util-visit-parents": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mdast-util-from-markdown": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz",
- "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "@types/unist": "^2.0.0",
- "decode-named-character-reference": "^1.0.0",
- "mdast-util-to-string": "^3.1.0",
- "micromark": "^3.0.0",
- "micromark-util-decode-numeric-character-reference": "^1.0.0",
- "micromark-util-decode-string": "^1.0.0",
- "micromark-util-normalize-identifier": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "unist-util-stringify-position": "^3.0.0",
- "uvu": "^0.5.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz",
- "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==",
- "dependencies": {
- "mdast-util-from-markdown": "^1.0.0",
- "mdast-util-gfm-autolink-literal": "^1.0.0",
- "mdast-util-gfm-footnote": "^1.0.0",
- "mdast-util-gfm-strikethrough": "^1.0.0",
- "mdast-util-gfm-table": "^1.0.0",
- "mdast-util-gfm-task-list-item": "^1.0.0",
- "mdast-util-to-markdown": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-autolink-literal": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz",
- "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "ccount": "^2.0.0",
- "mdast-util-find-and-replace": "^2.0.0",
- "micromark-util-character": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-footnote": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz",
- "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "mdast-util-to-markdown": "^1.3.0",
- "micromark-util-normalize-identifier": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-strikethrough": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz",
- "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "mdast-util-to-markdown": "^1.3.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-table": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz",
- "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "markdown-table": "^3.0.0",
- "mdast-util-from-markdown": "^1.0.0",
- "mdast-util-to-markdown": "^1.3.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-task-list-item": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz",
- "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "mdast-util-to-markdown": "^1.3.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz",
- "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==",
- "dependencies": {
- "mdast-util-from-markdown": "^1.0.0",
- "mdast-util-mdx-expression": "^1.0.0",
- "mdast-util-mdx-jsx": "^2.0.0",
- "mdast-util-mdxjs-esm": "^1.0.0",
- "mdast-util-to-markdown": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx-expression": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz",
- "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^2.0.0",
- "@types/mdast": "^3.0.0",
- "mdast-util-from-markdown": "^1.0.0",
- "mdast-util-to-markdown": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx-jsx": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz",
- "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^2.0.0",
- "@types/mdast": "^3.0.0",
- "@types/unist": "^2.0.0",
- "ccount": "^2.0.0",
- "mdast-util-from-markdown": "^1.1.0",
- "mdast-util-to-markdown": "^1.3.0",
- "parse-entities": "^4.0.0",
- "stringify-entities": "^4.0.0",
- "unist-util-remove-position": "^4.0.0",
- "unist-util-stringify-position": "^3.0.0",
- "vfile-message": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdxjs-esm": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz",
- "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^2.0.0",
- "@types/mdast": "^3.0.0",
- "mdast-util-from-markdown": "^1.0.0",
- "mdast-util-to-markdown": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-phrasing": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz",
- "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "unist-util-is": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-hast": {
- "version": "12.3.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz",
- "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==",
- "dependencies": {
- "@types/hast": "^2.0.0",
- "@types/mdast": "^3.0.0",
- "mdast-util-definitions": "^5.0.0",
- "micromark-util-sanitize-uri": "^1.1.0",
- "trim-lines": "^3.0.0",
- "unist-util-generated": "^2.0.0",
- "unist-util-position": "^4.0.0",
- "unist-util-visit": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-markdown": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz",
- "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "@types/unist": "^2.0.0",
- "longest-streak": "^3.0.0",
- "mdast-util-phrasing": "^3.0.0",
- "mdast-util-to-string": "^3.0.0",
- "micromark-util-decode-string": "^1.0.0",
- "unist-util-visit": "^4.0.0",
- "zwitch": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-string": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz",
- "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==",
- "dependencies": {
- "@types/mdast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-toc": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-7.0.0.tgz",
- "integrity": "sha512-C28UcSqjmnWuvgT8d97qpaItHKvySqVPAECUzqQ51xuMyNFFJwcFoKW77KoMjtXrclTidLQFDzLUmTmrshRweA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "@types/ungap__structured-clone": "^0.3.0",
- "@ungap/structured-clone": "^1.0.0",
- "github-slugger": "^2.0.0",
- "mdast-util-to-string": "^4.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-toc/node_modules/@types/mdast": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.1.tgz",
- "integrity": "sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g==",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/mdast-util-toc/node_modules/@types/unist": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz",
- "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w=="
- },
- "node_modules/mdast-util-toc/node_modules/mdast-util-to-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
- "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
- "dependencies": {
- "@types/mdast": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-toc/node_modules/unist-util-is": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
- "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-toc/node_modules/unist-util-visit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
- "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-toc/node_modules/unist-util-visit-parents": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
- "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "peer": true
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromark": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz",
- "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "@types/debug": "^4.0.0",
- "debug": "^4.0.0",
- "decode-named-character-reference": "^1.0.0",
- "micromark-core-commonmark": "^1.0.1",
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-chunked": "^1.0.0",
- "micromark-util-combine-extensions": "^1.0.0",
- "micromark-util-decode-numeric-character-reference": "^1.0.0",
- "micromark-util-encode": "^1.0.0",
- "micromark-util-normalize-identifier": "^1.0.0",
- "micromark-util-resolve-all": "^1.0.0",
- "micromark-util-sanitize-uri": "^1.0.0",
- "micromark-util-subtokenize": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.1",
- "uvu": "^0.5.0"
- }
- },
- "node_modules/micromark-core-commonmark": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz",
- "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "decode-named-character-reference": "^1.0.0",
- "micromark-factory-destination": "^1.0.0",
- "micromark-factory-label": "^1.0.0",
- "micromark-factory-space": "^1.0.0",
- "micromark-factory-title": "^1.0.0",
- "micromark-factory-whitespace": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-chunked": "^1.0.0",
- "micromark-util-classify-character": "^1.0.0",
- "micromark-util-html-tag-name": "^1.0.0",
- "micromark-util-normalize-identifier": "^1.0.0",
- "micromark-util-resolve-all": "^1.0.0",
- "micromark-util-subtokenize": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.1",
- "uvu": "^0.5.0"
- }
- },
- "node_modules/micromark-extension-gfm": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz",
- "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==",
- "dependencies": {
- "micromark-extension-gfm-autolink-literal": "^1.0.0",
- "micromark-extension-gfm-footnote": "^1.0.0",
- "micromark-extension-gfm-strikethrough": "^1.0.0",
- "micromark-extension-gfm-table": "^1.0.0",
- "micromark-extension-gfm-tagfilter": "^1.0.0",
- "micromark-extension-gfm-task-list-item": "^1.0.0",
- "micromark-util-combine-extensions": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-autolink-literal": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz",
- "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==",
- "dependencies": {
- "micromark-util-character": "^1.0.0",
- "micromark-util-sanitize-uri": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-footnote": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz",
- "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==",
- "dependencies": {
- "micromark-core-commonmark": "^1.0.0",
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-normalize-identifier": "^1.0.0",
- "micromark-util-sanitize-uri": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-strikethrough": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz",
- "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==",
- "dependencies": {
- "micromark-util-chunked": "^1.0.0",
- "micromark-util-classify-character": "^1.0.0",
- "micromark-util-resolve-all": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-table": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz",
- "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==",
- "dependencies": {
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-tagfilter": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz",
- "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==",
- "dependencies": {
- "micromark-util-types": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-task-list-item": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz",
- "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==",
- "dependencies": {
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdx-expression": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz",
- "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "@types/estree": "^1.0.0",
- "micromark-factory-mdx-expression": "^1.0.0",
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-events-to-acorn": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0"
- }
- },
- "node_modules/micromark-extension-mdx-jsx": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz",
- "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==",
- "dependencies": {
- "@types/acorn": "^4.0.0",
- "@types/estree": "^1.0.0",
- "estree-util-is-identifier-name": "^2.0.0",
- "micromark-factory-mdx-expression": "^1.0.0",
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0",
- "vfile-message": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdx-md": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz",
- "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==",
- "dependencies": {
- "micromark-util-types": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdxjs": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz",
- "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==",
- "dependencies": {
- "acorn": "^8.0.0",
- "acorn-jsx": "^5.0.0",
- "micromark-extension-mdx-expression": "^1.0.0",
- "micromark-extension-mdx-jsx": "^1.0.0",
- "micromark-extension-mdx-md": "^1.0.0",
- "micromark-extension-mdxjs-esm": "^1.0.0",
- "micromark-util-combine-extensions": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdxjs-esm": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz",
- "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "micromark-core-commonmark": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-events-to-acorn": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "unist-util-position-from-estree": "^1.1.0",
- "uvu": "^0.5.0",
- "vfile-message": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-factory-destination": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz",
- "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-factory-label": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz",
- "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0"
- }
- },
- "node_modules/micromark-factory-mdx-expression": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz",
- "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "@types/estree": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-events-to-acorn": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "unist-util-position-from-estree": "^1.0.0",
- "uvu": "^0.5.0",
- "vfile-message": "^3.0.0"
- }
- },
- "node_modules/micromark-factory-space": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz",
- "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-factory-title": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz",
- "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-factory-whitespace": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz",
- "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-util-character": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz",
- "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-util-chunked": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz",
- "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^1.0.0"
- }
- },
- "node_modules/micromark-util-classify-character": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz",
- "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-util-combine-extensions": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz",
- "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-chunked": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-util-decode-numeric-character-reference": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
- "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^1.0.0"
- }
- },
- "node_modules/micromark-util-decode-string": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
- "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "decode-named-character-reference": "^1.0.0",
- "micromark-util-character": "^1.0.0",
- "micromark-util-decode-numeric-character-reference": "^1.0.0",
- "micromark-util-symbol": "^1.0.0"
- }
- },
- "node_modules/micromark-util-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz",
- "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-events-to-acorn": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz",
- "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "@types/acorn": "^4.0.0",
- "@types/estree": "^1.0.0",
- "@types/unist": "^2.0.0",
- "estree-util-visit": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0",
- "vfile-message": "^3.0.0"
- }
- },
- "node_modules/micromark-util-html-tag-name": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz",
- "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-normalize-identifier": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz",
- "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^1.0.0"
- }
- },
- "node_modules/micromark-util-resolve-all": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz",
- "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-util-sanitize-uri": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz",
- "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^1.0.0",
- "micromark-util-encode": "^1.0.0",
- "micromark-util-symbol": "^1.0.0"
- }
- },
- "node_modules/micromark-util-subtokenize": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz",
- "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-chunked": "^1.0.0",
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0",
- "uvu": "^0.5.0"
- }
- },
- "node_modules/micromark-util-symbol": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
- "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-types": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
- "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "peer": true,
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/mri": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
- "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "peer": true
- },
- "node_modules/next": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/next/-/next-13.5.4.tgz",
- "integrity": "sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==",
- "dependencies": {
- "@next/env": "13.5.4",
- "@swc/helpers": "0.5.2",
- "busboy": "1.6.0",
- "caniuse-lite": "^1.0.30001406",
- "postcss": "8.4.31",
- "styled-jsx": "5.1.1",
- "watchpack": "2.4.0"
- },
- "bin": {
- "next": "dist/bin/next"
- },
- "engines": {
- "node": ">=16.14.0"
- },
- "optionalDependencies": {
- "@next/swc-darwin-arm64": "13.5.4",
- "@next/swc-darwin-x64": "13.5.4",
- "@next/swc-linux-arm64-gnu": "13.5.4",
- "@next/swc-linux-arm64-musl": "13.5.4",
- "@next/swc-linux-x64-gnu": "13.5.4",
- "@next/swc-linux-x64-musl": "13.5.4",
- "@next/swc-win32-arm64-msvc": "13.5.4",
- "@next/swc-win32-ia32-msvc": "13.5.4",
- "@next/swc-win32-x64-msvc": "13.5.4"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.1.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "sass": "^1.3.0"
- },
- "peerDependenciesMeta": {
- "@opentelemetry/api": {
- "optional": true
- },
- "sass": {
- "optional": true
- }
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-hash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
- "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
- "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.entries": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
- "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.fromentries": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
- "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.groupby": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
- "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1"
- }
- },
- "node_modules/object.hasown": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
- "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.values": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
- "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "dev": true,
- "dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-entities": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz",
- "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "character-entities": "^2.0.0",
- "character-entities-legacy": "^3.0.0",
- "character-reference-invalid": "^2.0.0",
- "decode-named-character-reference": "^1.0.0",
- "is-alphanumerical": "^2.0.0",
- "is-decimal": "^2.0.0",
- "is-hexadecimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/parse-numeric-range": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz",
- "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/periscopic": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
- "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^3.0.0",
- "is-reference": "^3.0.0"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.31",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
- "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"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.6",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-import": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
- "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
- "dev": true,
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-js": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
- "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
- "dev": true,
- "dependencies": {
- "camelcase-css": "^2.0.1"
- },
- "engines": {
- "node": "^12 || ^14 || >= 16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.4.21"
- }
- },
- "node_modules/postcss-load-config": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
- "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
- "dev": true,
- "dependencies": {
- "lilconfig": "^2.0.5",
- "yaml": "^2.1.1"
- },
- "engines": {
- "node": ">= 14"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": ">=8.0.9",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/postcss-nested": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
- "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
- "dev": true,
- "dependencies": {
- "postcss-selector-parser": "^6.0.11"
- },
- "engines": {
- "node": ">=12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.0.13",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
- "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
- "dev": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "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
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "dev": true,
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/property-information": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.3.0.tgz",
- "integrity": "sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
- "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "peer": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/react": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
- },
- "peerDependencies": {
- "react": "^18.2.0"
- }
- },
- "node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "dev": true
- },
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "dev": true,
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/reflect.getprototypeof": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
- "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
- "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
- "dev": true
- },
- "node_modules/regexp.prototype.flags": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
- "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "set-function-name": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/rehype-pretty-code": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.10.1.tgz",
- "integrity": "sha512-WHjRvGlqPXG8BVRB9mK0255WvIOnzvHivAWhFkA2OG+NTkQWtTbCULZMokOHLf3Yy8q8I8/F8QNjDSQBhjMK5w==",
- "dependencies": {
- "@types/hast": "^2.0.0",
- "hash-obj": "^4.0.0",
- "parse-numeric-range": "^1.3.0"
- },
- "engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "shiki": "0.x"
- }
- },
- "node_modules/rehype-slug": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz",
- "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "github-slugger": "^2.0.0",
- "hast-util-heading-rank": "^3.0.0",
- "hast-util-to-string": "^3.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-slug/node_modules/@types/hast": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.1.tgz",
- "integrity": "sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/rehype-slug/node_modules/@types/unist": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz",
- "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w=="
- },
- "node_modules/rehype-slug/node_modules/unist-util-is": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
- "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-slug/node_modules/unist-util-visit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
- "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-slug/node_modules/unist-util-visit-parents": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
- "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-gfm": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz",
- "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "mdast-util-gfm": "^2.0.0",
- "micromark-extension-gfm": "^2.0.0",
- "unified": "^10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-mdx": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz",
- "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==",
- "dependencies": {
- "mdast-util-mdx": "^2.0.0",
- "micromark-extension-mdxjs": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-parse": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz",
- "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "mdast-util-from-markdown": "^1.0.0",
- "unified": "^10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-rehype": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz",
- "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==",
- "dependencies": {
- "@types/hast": "^2.0.0",
- "@types/mdast": "^3.0.0",
- "mdast-util-to-hast": "^12.1.0",
- "unified": "^10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-toc": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-9.0.0.tgz",
- "integrity": "sha512-KJ9txbo33GjDAV1baHFze7ij4G8c7SGYoY8Kzsm2gzFpbhL/bSoVpMMzGa3vrNDSWASNd/3ppAqL7cP2zD6JIA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-toc": "^7.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-toc/node_modules/@types/mdast": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.1.tgz",
- "integrity": "sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g==",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.6",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
- "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/resolve-pkg-maps": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
- "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
- "dev": true,
- "funding": {
- "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/sade": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
- "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
- "dependencies": {
- "mri": "^1.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/safe-array-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
- "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "isarray": "^2.0.5"
- },
- "engines": {
- "node": ">=0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "peer": true
- },
- "node_modules/safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/scheduler": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- }
- },
- "node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "peer": true,
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
- "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
- "peer": true,
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/set-function-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
- "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
- "dev": true,
- "dependencies": {
- "define-data-property": "^1.0.1",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shiki": {
- "version": "0.14.4",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.4.tgz",
- "integrity": "sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==",
- "dependencies": {
- "ansi-sequence-parser": "^1.1.0",
- "jsonc-parser": "^3.2.0",
- "vscode-oniguruma": "^1.7.0",
- "vscode-textmate": "^8.0.0"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sort-keys": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.0.0.tgz",
- "integrity": "sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==",
- "dependencies": {
- "is-plain-obj": "^4.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "peer": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/source-map-support/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==",
- "peer": true,
- "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==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/string.prototype.matchall": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
- "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "regexp.prototype.flags": "^1.5.0",
- "set-function-name": "^2.0.0",
- "side-channel": "^1.0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trim": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
- "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
- "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
- "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/stringify-entities": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz",
- "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==",
- "dependencies": {
- "character-entities-html4": "^2.0.0",
- "character-entities-legacy": "^3.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/style-to-object": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz",
- "integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==",
- "dependencies": {
- "inline-style-parser": "0.1.1"
- }
- },
- "node_modules/styled-jsx": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
- "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
- "dependencies": {
- "client-only": "0.0.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "peerDependencies": {
- "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "babel-plugin-macros": {
- "optional": true
- }
- }
- },
- "node_modules/sucrase": {
- "version": "3.34.0",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
- "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "glob": "7.1.6",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sucrase/node_modules/glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tailwindcss": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
- "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
- "dev": true,
- "dependencies": {
- "@alloc/quick-lru": "^5.2.0",
- "arg": "^5.0.2",
- "chokidar": "^3.5.3",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.2.12",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "jiti": "^1.18.2",
- "lilconfig": "^2.1.0",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "object-hash": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.23",
- "postcss-import": "^15.1.0",
- "postcss-js": "^4.0.1",
- "postcss-load-config": "^4.0.1",
- "postcss-nested": "^6.0.1",
- "postcss-selector-parser": "^6.0.11",
- "resolve": "^1.22.2",
- "sucrase": "^3.32.0"
- },
- "bin": {
- "tailwind": "lib/cli.js",
- "tailwindcss": "lib/cli.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/terser": {
- "version": "5.21.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.21.0.tgz",
- "integrity": "sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==",
- "peer": true,
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser-webpack-plugin": {
- "version": "5.3.9",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
- "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
- "peer": true,
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.17",
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.16.8"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
- }
- },
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "peer": true
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
- },
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/trim-lines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
- "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/trough": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz",
- "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/ts-api-utils": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
- "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
- "dev": true,
- "engines": {
- "node": ">=16.13.0"
- },
- "peerDependencies": {
- "typescript": ">=4.2.0"
- }
- },
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true
- },
- "node_modules/tsconfig-paths": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
- "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
- "dev": true,
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- }
- },
- "node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/typed-array-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
- "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1",
- "is-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/typed-array-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
- "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
- "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typescript": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
- "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/unified": {
- "version": "10.1.2",
- "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
- "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "bail": "^2.0.0",
- "extend": "^3.0.0",
- "is-buffer": "^2.0.0",
- "is-plain-obj": "^4.0.0",
- "trough": "^2.0.0",
- "vfile": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-generated": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz",
- "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-is": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
- "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
- "dependencies": {
- "@types/unist": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-position": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
- "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
- "dependencies": {
- "@types/unist": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-position-from-estree": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz",
- "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==",
- "dependencies": {
- "@types/unist": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-remove-position": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz",
- "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-visit": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-stringify-position": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
- "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
- "dependencies": {
- "@types/unist": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
- "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^5.0.0",
- "unist-util-visit-parents": "^5.1.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit-parents": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
- "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
- "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"
- }
- ],
- "dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "node_modules/uvu": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz",
- "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==",
- "dependencies": {
- "dequal": "^2.0.0",
- "diff": "^5.0.0",
- "kleur": "^4.0.3",
- "sade": "^1.7.3"
- },
- "bin": {
- "uvu": "bin.js"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/vfile": {
- "version": "5.3.7",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
- "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "is-buffer": "^2.0.0",
- "unist-util-stringify-position": "^3.0.0",
- "vfile-message": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile-message": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
- "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vscode-oniguruma": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
- "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA=="
- },
- "node_modules/vscode-textmate": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz",
- "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg=="
- },
- "node_modules/watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack": {
- "version": "5.88.2",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz",
- "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==",
- "peer": true,
- "dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^1.0.0",
- "@webassemblyjs/ast": "^1.11.5",
- "@webassemblyjs/wasm-edit": "^1.11.5",
- "@webassemblyjs/wasm-parser": "^1.11.5",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.9.0",
- "browserslist": "^4.14.5",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.15.0",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.7",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "peer": true,
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack/node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "peer": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/webpack/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "peer": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-builtin-type": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
- "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
- "dev": true,
- "dependencies": {
- "function.prototype.name": "^1.1.5",
- "has-tostringtag": "^1.0.0",
- "is-async-function": "^2.0.0",
- "is-date-object": "^1.0.5",
- "is-finalizationregistry": "^1.0.2",
- "is-generator-function": "^1.0.10",
- "is-regex": "^1.1.4",
- "is-weakref": "^1.0.2",
- "isarray": "^2.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
- "dev": true,
- "dependencies": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
- "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/yaml": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz",
- "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==",
- "dev": true,
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "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==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- }
- }
-}
diff --git a/website/package.json b/website/package.json
deleted file mode 100644
index c71e3c20b..000000000
--- a/website/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "website",
- "version": "0.1.0",
- "private": true,
- "scripts": {
- "dev": "next dev",
- "build": "next build",
- "start": "next start",
- "lint": "next lint"
- },
- "dependencies": {
- "@mdx-js/loader": "^2.3.0",
- "@mdx-js/react": "^2.3.0",
- "@next/mdx": "^13.5.4",
- "@types/mdx": "^2.0.8",
- "next": "13.5.4",
- "react": "^18",
- "react-dom": "^18",
- "rehype-pretty-code": "^0.10.1",
- "rehype-slug": "^6.0.0",
- "remark-gfm": "^3.0.1",
- "remark-toc": "^9.0.0",
- "shiki": "^0.14.4"
- },
- "devDependencies": {
- "@tailwindcss/typography": "^0.5.10",
- "@types/node": "^20",
- "@types/react": "^18",
- "@types/react-dom": "^18",
- "autoprefixer": "^10",
- "eslint": "^8",
- "eslint-config-next": "13.5.4",
- "postcss": "^8",
- "tailwindcss": "^3",
- "typescript": "^5"
- }
-}
diff --git a/website/postcss.config.js b/website/postcss.config.js
deleted file mode 100644
index 12a703d90..000000000
--- a/website/postcss.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- plugins: {
- tailwindcss: {},
- autoprefixer: {},
- },
-};
diff --git a/website/public/icon.png b/website/public/icon.png
deleted file mode 100644
index 53ae99695..000000000
Binary files a/website/public/icon.png and /dev/null differ
diff --git a/website/styles/code.css b/website/styles/code.css
deleted file mode 100644
index 9fac96135..000000000
--- a/website/styles/code.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@media (prefers-color-scheme: dark) {
- pre[data-theme="light"],
- code[data-theme="light"] {
- display: none;
- }
-}
-
-@media (prefers-color-scheme: light), (prefers-color-scheme: no-preference) {
- pre[data-theme="dark"],
- code[data-theme="dark"] {
- display: none;
- }
-}
diff --git a/website/tailwind.config.ts b/website/tailwind.config.ts
deleted file mode 100644
index b0549f8b7..000000000
--- a/website/tailwind.config.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import type { Config } from "tailwindcss";
-import tailwindTypography from "@tailwindcss/typography";
-
-const config: Config = {
- content: [
- "./pages/**/*.{js,ts,jsx,tsx,mdx}",
- "./components/**/*.{js,ts,jsx,tsx,mdx}",
- "./app/**/*.{js,ts,jsx,tsx,mdx}",
- ],
- theme: {
- extend: {
- fontFamily: {
- sans: ["var(--font-inter)"],
- mono: ["var(--font-jetbrains-mono)"],
- },
- },
- },
- plugins: [tailwindTypography],
-};
-export default config;
diff --git a/website/tsconfig.json b/website/tsconfig.json
deleted file mode 100644
index c71469637..000000000
--- a/website/tsconfig.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "bundler",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "preserve",
- "incremental": true,
- "plugins": [
- {
- "name": "next"
- }
- ],
- "paths": {
- "@/*": ["./*"]
- }
- },
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
-}